kanmani143
monad is home · the rest is evidence

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.

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.

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.

How coverage decides a verdict →