Skip to content

live/stable

The label

The RECENSUS-1 format, where it goes, and why it's self-declared but hard to abuse.

24 bytes appended to the end of transaction calldata:

magic is 0x50554C53 and always the last four bytes. Readers check the tail and parse backwards. Full field definitions are in the spec.

| agentId (16) | framework (2) | flags (1) | version (1) | magic (4) |

Where it goes

Direct transactions: appended to data. ERC-4337: appended to the inner callData. Batches: once, on the outermost call.

x402 payments in USDG: the agent does not send the transaction (the seller or its facilitator does), so the label goes in the 32-byte EIP-3009 nonce it signs, and comes back unchanged in USDG's AuthorizationUsed event:

The payer, not the relayer, is the sender that has to be bound. The SDKs and the MCP server build this nonce for you (recensus.nonce(), createX402ExactPayment, x402ExactScheme in TypeScript; sign_exact_payment in Python). A fixed prefix makes an agent's payments linkable to each other: that is what a label is for, and it is opt-in. See RECENSUS-1 §3.4.

magic (4) ‖ agentId (16) ‖ framework (2) ‖ flags (1) ‖ version (1) ‖ random (8)

Why calldata

It needs no contract, costs only the gas for 24 more bytes of calldata, paid in ETH like the rest of the transaction, and works with every wallet and dapp on the chain because standard ABI decoding ignores trailing bytes.

Self-declared, and what that means

Anyone can write any label. Recensus handles that with sender binding: a transaction is attributed to a claimed agent only if its sender is on that agent's declared list. Copying someone's ID makes an "unclaimed" row, never a row under their name. Bonding behind an ID (planned, Bonds and tiers) makes a verified label costly to fake at scale.

ERC-8004 agents

An agent registered in the ERC-8004 Identity Registry can put its registry token ID in the agentId field and set flag bit 2 (erc8004, label version 0x02). It is then claimed through the registry: transactions count under it when they come from the registration's owner or its agentWallet, or from a sender the owner declared.

Framework codes

Assigned by pull request in config/frameworks.json; never reassigned.