Reconciliation for x402 follows one ironclad rule:Only on-chain Transfer events are recognized; no manual reports are accepted.This tool gives you three things: a reconciliation CSV template, a ready-to-run on-chain USDC deposit scanning script for the Base mainnet, and a reconciliation guide you can hand directly to finance (with rules, tolerance thresholds, and discrepancy handling already defined).
—
—
—
1 · Only on-chain Transfer events are recognized—not reports.The sole basis for reconciliation is the Base Mainnet USDC contract Transfer Events, by topics[2](Receiving address) filtering. Any "I think this should be the value" is invalid.
2 · Do not scan from block 0.Public nodes require a token to query archive status; scanning from genesis block will inevitably fail. Correct approach:Roll back 2,000 blocks from the chain head.As a starting point, subsequently record lastScanned for incremental scanning.
3 · Chunking + rate limiting.eth_getLogs Querying too many blocks at once triggers rate limiting. In production, we use 400-block segments with 250ms intervals between segments, and configure multi-node failover (publicnode / base.org / drpc as fallbacks).
4 · Amount tolerance: ±$0.02.Match credited amount against payable amount using "approximate matching" (±$0.02); do not enforce strict equality—on-chain amounts are integers in smallest units, and rounding may introduce cent-level discrepancies.
5 · Stop the service before modifying the data file.The service holds the full DB in memory; heartbeat writes to disk every 30 seconds; modifying JSON at runtime is overwritten by stale in-memory values (this occurred once during our fee rate migration).