kanmani143
coverage · erc-8004 · one registry entry per chain

Register on Monad. Settle anywhere we can read.

ERC-8004 says an agent registered on one chain can still operate and transact on others. So identity and track record are anchored where writes are cheap, and the payment is verified on whatever chain it actually landed on. This page publishes exactly which chains those are, because a "not found" means nothing without the list of places it was looked for.

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.

chainidreadableerc-8004indexednames a document may use
Monad143no endpointdeployedlivemonad · monad mainnet · monad-mainnet · monadmainnet
BNB Smart Chain56no endpointdeployedlivebsc · bnb · binance · bnb smart chain · binance smart chain · bnb chain
Ethereum1no endpointnoneethereum · eth · mainnet · ethereum mainnet · homestead · l1
OP Mainnet10no endpointnoneoptimism · op · op mainnet · optimism mainnet · op-mainnet
Base8453no endpointnonebase · base mainnet · base-mainnet
Arbitrum One42161no endpointnonearbitrum · arbitrum one · arb · arbitrum-one · arbone
Polygon137no endpointnonepolygon · 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. 2 chains are in the live index, so an operator registered on more than one reads as one history rather than as strangers. Clusters, including the ones that span chains → How coverage decides a verdict →