← SmartFlow Observatory /verify
x402 growth, decomposed
The headline transaction count everyone screenshots is real, but it is not one thing. This page splits every tracked x402-era micro-USDC transfer on Base into what it actually is: smart-wallet plumbing, recycled wash volume, and the facilitator-settled core that survives scrutiny. Recomputed daily from our independent ledger. Every number on this page is verifiable against a sealed dataset.
23.5Mtransfers, last 30d
$12.17Mvolume, last 30d
682.4Kdistinct payers, last 30d
0.99%unflagged facilitator-settled core (tx share)
Decomposition, last 30 days
Share of the 23.5M tracked transfers. Categories overlap; they do not sum to 100 percent.
Wash-flagged (rules R1 to R5)16.9M tx · 72.14% of tx · $5.74M (47.18% of volume) · $0.339/tx avg
Facilitator-mediated10.1M tx · 42.83% of tx · $335.0K (2.75% of volume) · $0.033/tx avg
Bundler-mediated (ERC-4337 plumbing)1.6M tx · 6.77% of tx · $1.64M (13.51% of volume) · $1.03/tx avg
Unflagged facilitator-settled core233.1K tx · 0.99% of tx · $98.5K (0.81% of volume) · $0.423/tx avg
Average ticket by category: facilitator-mediated $0.033 per transfer vs bundler-mediated $1.03 (31x). Facilitator rails carry 42.83% of transfers but 2.75% of volume; that ratio, not the raw transfer count, is the honest way to read the facilitator headline.
Wash flags lag ingest by up to two days: 653.7K transfers from the most recent 48h are still pending classification and are counted as neither wash nor clean. Self-correction note: R5 channel flags were frozen 2026-06-25 to 2026-07-10 (backfilled 2026-07-10); clean-core figures shown here in that window were overstated.
Concentration check on the core itself: 39.29% of the 30d unflagged core flows into a single recipient (0x6839…1a2b), and 0.22% of that comes from one payer. The distributed unflagged core, excluding that pair, is 141.5K transfers. Caveat: the R5 channel pass refreshes daily since 2026-07-10, but a channel needs 14 active days to qualify, so brand-new automated pairs can inflate the core for up to ~3 weeks before flags catch up.
Where categories overlap
| Overlap | Transfers, 30d | Share of universe |
|---|---|---|
| Bundler-mediated that is also wash-flagged | 698,915 | 2.98% |
| Bundler-mediated that is also facilitator-mediated | 64,164 | 0.27% |
| Facilitator-mediated that is also wash-flagged | 9,804,563 | 41.77% |
97.5% of facilitator-mediated transfers also carry a wash flag. That is why the unflagged core is the number to watch, not the facilitator total.
Trend, 7 days vs previous 7 days (both windows exclude the newest 48h, so each side is past classifier maturity)
| Category | Previous 7d tx | Current 7d tx | Change |
|---|---|---|---|
| Universe (all tracked micro-USDC) | 4.3M | 8.1M | +89.4% |
| Wash-flagged (rules R1 to R5) | 2.9M | 6.5M | +124.2% |
| Facilitator-mediated | 1.5M | 4.6M | +201.5% |
| Bundler-mediated (ERC-4337 plumbing) | 361.6K | 369.6K | +2.2% |
| Unflagged facilitator-settled core | 51.0K | 47.7K | -6.4% |
Definitions
- Universe (all tracked micro-USDC)
- All USDC micro-transfers (0.0005 to 5.0 USDC) on Base captured by our independent tracker.
- Bundler-mediated (ERC-4337 plumbing)
- Transfers whose transaction sender is a known ERC-4337 bundler, i.e. smart-wallet plumbing rather than a person pressing pay.
- Facilitator-mediated
- Transfers settled through a recognized x402 facilitator contract path (is_facilitator_mediated = 1).
- Wash-flagged (rules R1 to R5)
- Transfers flagged by our wash-detection rules R1 to R5 (self-pay, burst, dust, loop, channel recycling).
- Unflagged facilitator-settled core
- Facilitator-settled transfers with no wash flag, at least 48h old so all wash passes (R1-R4 nightly, R5 daily) have had time to run.
What this does not show
- Only micro-USDC transfers between 0.0005 and 5.0 USDC on Base. Larger transfers are out of scope by design.
- is_facilitator_mediated is populated for a subset of the window; 9961955 of 23473786 30d transfers are unclassified, so the facilitator share is a lower bound.
- tx_sender is missing for 0 of 23473786 30d transfers, so the bundler share is a lower bound.
- Wash classification lags ingest by up to 48h. The most recent two days are reported as pending, not yet classified.
- The R5 channel rule needs 14 active days before a channel qualifies (requalified weekly), so a brand-new wash channel can be counted as clean for up to ~3 weeks. R5 flags were frozen 2026-06-25 to 2026-07-10 and were backfilled on 2026-07-10; clean-core figures published in that window were overstated.
- Trend windows (7d vs previous 7d) are both offset 48h back from the snapshot so each side is past the classifier maturity buffer.
- Timestamps are ingest times (hourly batch), not block times. Day boundaries can shift by up to an hour. Metrics stop at the effective bound, 2 hours before the source maximum timestamp, so asynchronous facilitator classification can settle before publication.
- The ledger stores one row per transaction hash. A transaction carrying several qualifying USDC transfers is recorded once (first leg), so the raw universe undercounts multi-transfer transactions. Measured 2026-07-24 on a stratified sample (n=1598): about 28 percent of transactions carry more than one qualifying transfer, and 99.6 percent of the additional legs settle outside the endpoint catalog, so attributed x402 figures are materially unaffected. A schema migration to (tx_hash, log_index) is planned.
- The unflagged core is not evenly distributed; a single recipient can dominate it. See clean_core_concentration_30d and cite the distributed core alongside the headline share.
How to verify
Do not trust this page. Recompute it.
- The full dataset behind this page is published at decomposed.json, including every category definition and limitation.
- The dataset is sealed:
sha256 584181df8a5aa7be360fc680c73b62b7dfa6337af9e1fe9e28b25ca54f981b72 - Recipe: Take the value of the top-level 'data' key, serialize with python: json.dumps(data, sort_keys=True, separators=(',', ':'), ensure_ascii=False), then sha256 the UTF-8 bytes.
- Recompute it yourself in python:
import json, hashlib, urllib.request
doc = json.load(urllib.request.urlopen("https://verify.smartflowproai.com/decomposed/decomposed.json"))
payload = json.dumps(doc["data"], sort_keys=True, separators=(",", ":"), ensure_ascii=False)
print(hashlib.sha256(payload.encode("utf-8")).hexdigest() == doc["seal"]["sha256"])
Data snapshot: 2026-08-22T06:04Z (ingest time) · generated 2026-08-22T06:51:36Z · bundler set: 210 addresses (n1-classification)