On Arc, an x402 payment always ends the same way: someone calls an EIP-3009 authorization function on the USDC contract. That is the fingerprint Wicket looks for, and it is the entire rule:
// A transaction is an x402 settlement if both are true:
tx.to === "0x3600000000000000000000000000000000000000" // the USDC predeploy on Arc
decodeFunctionData(AUTH_ABI, tx.input) !== null // it is an EIP-3009 authorization
// Then:
facilitator = tx.from // whoever broadcast it and paid the gas
payer = args.from // whose USDC moved
payee = args.to // who received it
value = args.value // atomic units, 6 decimals
status = receipt.status === "success" ? 1 : 0All four EIP-3009 entry points are decoded, both the split-signature and packed-signature variants:
transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)
transferWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes)
receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32)
receiveWithAuthorization(address,address,uint256,uint256,uint256,bytes32,bytes)| Starting point | Block 21,108,966 — the first public block of Arc mainnet, 16 Sep 2026. There is no gap before it. |
| Coverage | Every block is fetched with its full transaction list. No log filters, no sampling, no skipping. |
| Confirmations | One block behind the head. Arc finalises in under a second, so deeper waiting buys nothing. |
| Currently at | Block 22,673,309 |
| Re-reads | Safe. tx_hash is the primary key, so reading a range twice cannot create a duplicate row. |
| Single writer | A lease in the database guarantees only one indexer writes at a time, and the read cursor can only ever move forward. |
Every aggregate on this site — leaderboards, 24-hour figures, charts, shares — is computed with a GROUP BY over the raw table at the moment you load the page. Nothing is kept in a running counter.
That is a deliberate trade. Counters are faster, but a counter drifts the moment a block range is read twice, and a drifting counter is invisible until the numbers stop adding up. Deriving everything from the rows means the total and the sum of its parts are the same number by construction.
Wicket sees the on-chain half of an x402 exchange. The HTTP half — the request, the 402 response, the retry — happens between two servers and is invisible to any chain. Be careful with the following:
transfer() of USDC is not an x402 settlement and is deliberately not counted, even between the same two addresses.Nothing here requires trusting this site. Take any transaction hash from the feed, open it on explorer.arc.io, and you will find the same sender, the same calldata and the same amount. The rule above is the whole algorithm — fifty lines of it — and re-running it against Arc from block 21,108,966 will reproduce every figure on this site.
Found a settle that Wicket missed, or a row that should not be there? Say so on @wicketprotocol. A counter-example is more useful than a compliment.