Research note · Provenance
The $6.35 billion mirage: real transactions that were false data
2026-08-10 · 12 min
Inside our own pipeline we found $6.35 billion of Base USDC movement — every transaction real, signed, and independently verifiable, and none of it the thing we measure. Nobody faked anything. Nobody lied. The number was still wrong by two orders of magnitude. This is the story of how contamination gets into an on-chain census, the one-line impossibility that proved it didn't belong, and the discipline that decides exactly how much to cut — and, just as importantly, how much to keep.
There is a popular argument about blockchain data that goes like this: the chain is public, the signatures are valid, anyone can verify every transaction — therefore the numbers built on top of it are trustworthy. The argument stops at “the transaction is real.”
It stops one step too early. “This transaction happened” and “this transaction is the thing I am counting” are two different claims, and only the first one is settled by a signature. The second is settled by nothing on the chain at all. It is settled by your pipeline — by the rule that decided to admit that row into your dataset in the first place.
Verification tells you a payment is real. It cannot tell you the payment is yours to count. The whole game is in the second question, and the chain is silent on it.
We measure the x402 settlement economy — agents paying agents for API calls, priced in USDC, settled on Base, Solana, Algorand, and Polygon. In an earlier note we wrote about people who manufacture activity to look bigger than they are. This note is about the opposite failure, and the quieter one: activity nobody manufactured, honest commerce belonging to somebody else entirely, flowing into our totals because an admission rule held the door open. Fraud is an adversary. Contamination is a mirror — the error is yours.
By the time we were done, we had cut $6.35 billion of it.
Two questions that look like one
Every row in a measurement dataset answers two questions, and it is easy to forget they are separate.
Did this happen? On a public chain, this question is nearly free. The transfer is signed, finalized, replicated. We can — and do — re-verify any row against the chain itself.
Is this the thing I am measuring? This question is never answered by the chain. A USDC transfer on Base does not carry a flag saying “this was an x402 payment for an API call” versus “this was an exchange rebalancing its hot wallet.” Both are real. Both are USDC. Both are on Base. Only one belongs in a census of agentic commerce.
The membership decision — is this row in scope? — is made by software you wrote, applying a rule you chose, at the moment of ingestion. If that rule is loose, everything downstream inherits the looseness, and every downstream check that re-verifies rows against the chain will pass. That is the cruel part: contaminated data survives verification perfectly, because contamination is not a question of whether the rows are real. It is a question of whether they are relevant.
The two rails that drank the firehose
Our ingestion is organized into rails — named data loaders, each responsible for pulling settlement activity from a particular source with a particular method. The rail name travels with every row it writes. That bookkeeping habit, mundane as it sounds, is the hero of this story.
Two of those rails — cdp_evm_auth_first and cdp_evm_facilitator_first — were early capture rails on Base. Their admission logic keyed on what a transfer looked like: the on-chain shape of the movement. The problem is that an x402 settlement leg is, at the level of shape, a USDC transfer — and Base carries an enormous amount of USDC that has nothing to do with agentic commerce. Exchanges, bridges, DeFi, payroll, ordinary people moving ordinary money. A rule that admits by shape does not sip from that stream. It swallows it. These two rails swept all Base USDC movement they encountered, not just x402.
The first sign of trouble was not a smoking gun. It was a smell — a statistical one. Our production Base rail attributes almost everything it carries; the capture rails attributed almost nothing:
cdp_evm_cdp_sql (production rail) 98.99% of volume attributed to a named service cdp_evm_auth_first cdp_evm_facilitator_first (capture rails) 99.99% of volume NOT attributed to anything
Two datasets drawn from the same chain, the same token, the same economy, should not attribute at 98.99% on one rail and 0.01% on another. When a rail full of “x402 settlement” matches essentially none of the sellers, facilitators, and endpoints we know about, the parsimonious explanation is not that we discovered a vast hidden economy. It is that the rail is not carrying our economy at all.
A smell is not proof. For proof, we went looking for something harder — and found something better than hard. We found impossible.
The tell: money that predates its own protocol
Every protocol has a birthday. The first x402 transfer that has ever existed on Base is dated 2025-05-09. Before that day, an x402 payment on Base could not occur — not “probably didn’t,” not “we found no evidence of” — could not, in the way a photograph cannot predate the camera.
So we asked the capture rails a one-line question: how much of your traffic is dated before the protocol existed?
first x402 transfer ever seen on Base: 2025-05-09 capture-rail rows dated BEFORE that day: 302,035 transactions $6.35 BILLION of USDC movement a payment cannot precede the first payment. none of this can be x402. not one row.
Sit with the scale for a moment. The entire x402 economy we measure — every chain, every service, all time — has settled $54.05 million. The pre-genesis contamination on these two rails alone carried $6.35 billion: over a hundred times the size of the real thing, sitting inside the pipeline, every row of it individually true.
This is what a mirage looks like in data. Not a fabrication — a reflection. Real water, real light, wrong place. Had we published a raw total off those rails, we would have reported an economy two orders of magnitude larger than the one that exists, and every skeptic who checked our rows against the chain would have found them all real.
The fix: cut by provenance, not by date
Here is where the story turns on a design decision, and the decision is less obvious than it looks. Having proved that pre-2025-05-09 rows cannot be x402, the tempting fix is a date filter: WHERE settle_date >= ’2025-05-09’. Delete everything before the birthday, keep the rest.
That fix would have been wrong, and understanding why is the core of this note. The date did not cause the contamination. The loader did. A rail that indiscriminately swept all Base USDC before May 9 did not become discriminating on May 10 — it kept sweeping the same firehose; the calendar just stopped making its mistake provable. The pre-genesis rows are not the contamination. They are the evidence of contamination: the visible part of an admission rule that was wrong the whole time.
A date filter treats the symptom you can see. A provenance exclusion treats the rule that produced it — including the part you can’t see.
So the exclusion we shipped is keyed on which loader wrote the row, not on when the row is dated. Base rows from cdp_evm_auth_first and cdp_evm_facilitator_first are out — before the birthday and after it — because the rails themselves were shown to admit by shape, and an admission rule that matches shape instead of provenance will admit the entire firehose. What survives from those rails is the subset we could positively re-qualify as clean: 892 transactions, $447,298. That is the honest yield of those rails on Base. Not $6.35 billion. Not even a million. Four hundred forty-seven thousand dollars.
swept by shape: $6.35B before genesis alone
(302,035 tx that cannot be x402)
re-qualified clean: 892 tx · $447,298
the ratio between those two numbers is the
cost of admitting by shape.Notice what the provenance framing buys. If new evidence later shows some post-genesis slice of those rails was genuine, we can re-admit it — row by row, with the evidence attached. A date filter offers no such path; it just moves the contamination boundary to somewhere less embarrassing and calls it a day.
The harder discipline: knowing when to stop cutting
There is a second temptation after you find contamination, and it is the mirror image of the first. Once a rail name is tainted, the reflex is to purge it everywhere — burn the name, drop every row it ever wrote, on every chain. It feels rigorous. It is actually the same mistake pointed the other way.
The same two rail names also carry 1,792,636 Polygon transactions worth $54,346. Those rows we kept. Not out of leniency — out of the same principle that justified the cut:
Evidence justifies exactly the rows it was gathered on. No fewer, and no more.
Base · cdp_evm_auth_first / _facilitator_first
shown (pre-genesis test) to sweep non-x402
USDC → EXCLUDED, by provenance
Polygon · same rail names
1,792,636 tx · $54,346
no such showing on these rows → KEPT
the exclusion is chain-scoped to Base, because
the proof is chain-scoped to Base.The pre-genesis impossibility was demonstrated on Base rows, against Base’s x402 birthday, about Base’s USDC firehose. That proof says nothing about what those loaders captured on Polygon, where the sweep dynamics, the token flows, and the qualifying evidence are all different. Extending a Base-proved exclusion to Polygon rows would be exactly as unjustified as the original sweep — a conclusion applied to rows the evidence never touched, merely because they share a label.
Over-cutting and over-admitting are the same sin. One inflates your number, the other deflates it, and both replace “what the evidence shows” with “what the pattern suggests.” A census that deletes by vibes is not more honest than one that admits by vibes. The scalpel has to stop at the edge of the proof.
What honest subtraction does to a headline
After this exclusion and the rest of the cleanup work around it, the census stands — as of the date on this document — at $54.05 million of total x402 settlement, of which $52.26 million (96.69%) is attributed to a named service. A peer tracker, x402scan, publishes a comparable figure of $52.77 million — two independent pipelines landing within about one percent of each other, which is what you would hope measurement of the same reality looks like.
One more number, because it is the one we are proudest of and the one a growth chart would hide: our attributed figure used to be approximately $52.74 million. It is now $52.26 million. It went down. Each time we got more honest — cutting contamination, refusing to name shared wallets after a single claimant, moving doubtful volume from “attributed” to “honestly unknown” — the headline shrank. A measurement pipeline whose numbers only ever go up is telling you about its incentives, not about the economy.
total x402 settlement $54.05M attributed to a named service $52.26M (96.69%) peer (x402scan), comparable $52.77M our attributed figure, before the recent honesty passes ~$52.74M direction on getting stricter DOWN
The same doctrine that shaped the cut shapes the reporting: NULL is not zero. A row we exclude is not “volume that didn’t happen” — it happened, magnificently, to the tune of $6.35 billion; it just is not x402, and we can prove it. A wallet we can’t name is not a zero either, and a guessed name is worse than an honest gap. Subtraction with receipts beats addition with hope.
The principles, portable
None of this is x402-specific. If you build on-chain analytics — or consume them — these four rules travel.
“Verifiable” secures existence, not membership
The chain proves a transaction happened. It cannot prove the transaction belongs in your dataset. Every on-chain total you have ever seen is downstream of an unverifiable, off-chain, human-written admission rule — and that rule, not the cryptography, is where the number is won or lost. Ask any dashboard one question: what decides that a row is in scope? If the answer is a shape — token, chain, transfer pattern — assume the firehose is in the number.
Shape admits the firehose; provenance admits the payment
An x402 settlement leg looks like a USDC transfer because it is one. On a chain moving billions in that token, “looks like” is an open door. Admission has to trace lineage — which facilitator relayed it, which loader captured it under what qualifying evidence — because lineage is the only property the firehose doesn’t share.
Nothing predates its own genesis
The cheapest integrity check in this entire pipeline was one query against one date. It converted a suspicion into a disqualification — not “this looks wrong” but “this cannot be right” — and it generalizes to anything with a birthday. Impossibility beats anomaly every time you can get it, and it is usually one query away.
Evidence justifies exactly the rows it was gathered on
The cut was proved on Base, so the cut is scoped to Base; the Polygon rows under the same rail names stayed, all 1,792,636 of them. Scope discipline is what separates a forensic exclusion from a purge — and it is also what makes the exclusion defensible to someone who disagrees with you, because every removed row points at the specific evidence that removed it.
The figures in this note were measured on 2026-08-10 and will drift as the economy moves; the living versions, along with the itemised record of what we exclude and why, are on the Transparency and Integrity pages. The $6.35 billion is still out there on Base, real as ever, doing whatever it was honestly doing all along. It just isn’t in our number. That is the whole discipline: the chain records what happened. Deciding what it means — and owning that decision in public — is the part that can’t be outsourced to a signature.