Skip to content

live/stable

The label

The PULSE-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.

Why calldata

It needs no contract, costs almost nothing, 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. Pulse 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. Staking $PULSE behind an ID (planned) makes a verified label costly to fake at scale.

Framework codes

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