blog · the thesis · updated 2026-10-04

Hash integrity is not claim truth

Monad's agent registry holds more than ten thousand agents. A tool can tell you whether an agent's evidence was tampered with. None of them tells you whether the payment the evidence describes ever happened. We checked every one.

The check everybody already does

An ERC-8004 agent collects feedback. Each feedback entry on chain carries a pointer to an evidence document plus the keccak256 hash of that document. Fetch the document, hash it and compare. If the hashes match, nobody edited the document after it was committed. Every explorer that reads the registry does this.

That check is real. It is also the wrong question for anyone about to pay an agent. A document can match its hash exactly and still describe a payment that never happened. Integrity proves the bytes did not change. It says nothing about whether what the bytes describe is true.

So we added the rungs above it

We check each claim one rung at a time. Each rung answers a question the one below it cannot. The top rung reads the cited transaction on the chain the document names. Then it checks that the value actually reached the recipient the document names, in the token and amount it names, at a depth of at least two blocks.

truedid the payment reach the recipient, on the chain it names?parsedcan we read what it claims?intactare the bytes the ones committed on chain?resolvabledoes the document still exist?declareddoes the record point at anything?a hash-only check stops below this line
One rung per question, per claim. A claim that fails a rung stops there. A rung that could not be checked is unknown, never false.

What reading all of them found

On 2026-10-04 we ran the ladder over every Monad feedback that carries an evidence pointer, 1,292 of the 9,288 feedbacks in the registry. Most do not assert a payment at all: they are game ratings and plain-text comments, so there is nothing to be right or wrong about. Of the 185 that do assert one, two thirds cite a transaction that is not on the chain they name.

The claims page: 123 not on the chain they name, 62 on the chain they name, 12 could not check, 1,095 assert no paymentThe claims page: 123 not on the chain they name, 62 on the chain they name, 12 could not check, 1,095 assert no payment
The live claims page on 2026-10-04. Red is a payment claim whose transaction is not on the chain it names. Green is one we confirmed. Grey is a document we could not check, which is never counted as false.

The 123 is the number everything here rests on, so it is worth seeing one up close. This claim comes from an execution.market worker receipt. The document is hash-perfect: the bytes we fetched are the bytes committed on chain. The transaction it cites does not exist on Monad.

Verification history for one claim: ten scheduled checks from 30 September to 4 October, each false, each naming the block it readVerification history for one claim: ten scheduled checks from 30 September to 4 October, each false, each naming the block it read
Ten checks of the same claim over five days, each recorded with the block it read. The history is append-only. If the author fixes the document, the next check writes a new row and the old ones stay, so the change is visible rather than a number quietly improving.
What the chain says: bytes match the hash, not found on Monad, cross-chain search over BSC and five Alchemy chainsWhat the chain says: bytes match the hash, not found on Monad, cross-chain search over BSC and five Alchemy chains
The same claim, from the chain's side. The hash matches, so a hash-only tool would pass it. The transaction is not on Monad.

Check one yourself

Every verdict comes with the command that reproduces it. You do not need us to check the claim above. You need a public Monad RPC.

$ cast tx 0x1508effd2e032b93bd0470c9ae6e537265b57a2f3119e8f4cddb63b0dae6e44b --rpc-url https://rpc.monad.xyz
Error: tx not found: 0x1508effd2e032b93bd0470c9ae6e537265b57a2f3119e8f4cddb63b0dae6e44b
The transaction the document cites, asked for on the chain the document names.
agents in the registry10,278
/status, the registry's own counter slot
feedbacks9,288, of which 1,292 carry an evidence pointer
/status
assert a payment185
feed.json data.summary.paymentClaims
not on the chain they name123, two thirds of 185
feed.json data.summary.doNotResolve
confirmed62
feed.json data.summary.resolve
could not check12, never counted as false
feed.json data.summary.couldNotCheck
The figures on 2026-10-04, when this was written, with where each is read from. The live versions move as agents register and documents change: open the source to see today's.

Why this matters to someone with money on the line

The first user of this is not the agent being checked. It is whoever routes work to agents and pays them: a marketplace, a broker or a DAO. Today they can see that an agent has a hundred receipts. They cannot see how many of those receipts describe payments that never happened. On 2026-10-01 an outside broker paid two of our agents for exactly this answer, settled on Monad.

The method page shows how each rung is decided. The developers page has the free API and the MCP server.