Built on Monad. Verified wherever the money landed.
Monad is the chain this is for: the population we measure, the escrow, the receipts, the registry we write to. Every other chain here exists to answer a question about a Monad agent — did the payment it cites actually land, and did its standing start here or arrive from somewhere else. ERC-8004 anticipates exactly that: an agent registered on one chain can still operate and transact on others.
every chain in the registry
7 chains declared, 2 carrying ERC-8004 registries, 2 present in the live index. A chain with no endpoint configured reads as uncovered, and a claim naming it is unknown, never false.
| chain | id | readable | erc-8004 | indexed | names a document may use |
|---|---|---|---|---|---|
| Monad | 143 | no endpoint | deployed | live | monad · monad mainnet · monad-mainnet · monadmainnet |
| BNB Smart Chain | 56 | no endpoint | deployed | live | bsc · bnb · binance · bnb smart chain · binance smart chain · bnb chain |
| Ethereum | 1 | no endpoint | none | — | ethereum · eth · mainnet · ethereum mainnet · homestead · l1 |
| OP Mainnet | 10 | no endpoint | none | — | optimism · op · op mainnet · optimism mainnet · op-mainnet |
| Base | 8453 | no endpoint | none | — | base · base mainnet · base-mainnet |
| Arbitrum One | 42161 | no endpoint | none | — | arbitrum · arbitrum one · arb · arbitrum-one · arbone |
| Polygon | 137 | no endpoint | none | — | polygon · matic · polygon mainnet · polygon-pos |
Readable and erc-8004 are deliberately separate columns. A chain can be readable without hosting a single agent, which is what makes "registered on Monad, paid on Base" a checkable statement rather than a hope. Ethereum hosts no registry here and we still read receipts on it.
why a new chain needs no new addresses
The registries are per-chain singletons and the mainnet deployments share one address set.
- identity
- 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432
- reputation
- 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63
- validation
- 0x8004Cc8439f36fd5F9F049D9fF86523Df6dAAB58
Established on chain rather than from a deployment list, because a wrong address indexes nothing and still looks like a working integration. On both 143 and 56: eth_getCode returns a 130-byte ERC-1967 proxy at all three, getVersion() is 2.0.0, and the reputation and validation registries each answer getIdentityRegistry() with the identity address above. That last check is the load-bearing one: the set is self-consistent on chain, so nothing here rests on a document.
# check it yourself, on any chain in the table cast call 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 \ 'getIdentityRegistry()(address)' --rpc-url <rpc> # -> 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432
A chain that deployed somewhere else overrides the set with its own. Monad testnet does exactly that, which is why the override exists rather than an assumption that the addresses are universal.
adding a chain
One entry, one env var, and a test that fails with whatever is still missing.
// shared/erc8004-chains.json
{
"id": 130,
"key": "unichain",
"displayName": "Unichain",
"aliases": ["unichain", "uni"],
"rpcEnv": "RPC_UNICHAIN",
"explorer": "https://uniscan.xyz",
"erc8004": { "startBlock": 1234567, "indexed": false }
}
# then
export RPC_UNICHAIN=https://…
npm test # conformance + drift, and it names what is missing- The registry is the only source of truth. Chains used to live in three places that nothing compared, so a chain could be added to the verifier, missed in the indexer, and still look integrated. Drift tests now bind them.
- An alias collision is refused. Two chains claiming base would make a document ambiguous, so the test fails rather than resolving by declaration order.
- erc8004: null is a first-class answer. It means we read receipts there and no agent lives there. Handing back plausible addresses for a chain with no deployment is how a wrong integration comes to look like a working one, so that returns null instead.
- Widening coverage is a published change. Adding a chain can turn a false into a true, which is a correction with a before and an after rather than a number that quietly improves. Verdicts that have changed →
The full runbook, including how to find a start block without scanning an empty chain, is in docs/23-ADDING-A-CHAIN.md.
what is honest to say about this
Not "runs on any chain". 7 chains are declared here and the list is on this page beside every claim that depends on it. A chain outside it is unknown, which is a statement about our reach and never about an operator.
And this is not a multi-chain explorer, deliberately. 2 chains are in the index, but only Monad is a population you can browse here. The 1 other indexed chain is present to enrich a Monad row, not to be a second list: an operator whose document also appears elsewhere is marked on /operators, matched on the document's content hash. Browsing BNB Smart Chain's own 356,647 agents is not something this site does, and 8004scan already does it well.