Methodology

What the numbers mean

Stablecoin Garden exists to answer one question: which stablecoins are actually being used? Not which are biggest, not which earn the most yield — which ones move. This page is the editorial spec for every column on the leaderboard and every figure in the hero row.

The full version with rollout phases, data sources, and architectural tradeoffs lives in METRICS.md. This page is the human-readable summary.

Raw transfer volume

The total USD value of every Transfer event on the asset's monitored contracts in the selected window. Raw means we are not stripping anything out — DEX swap legs, CEX hot-wallet rebalancing, MEV routing, bridge in/out, and treasury moves all contribute to the figure.

Visa's Onchain Analytics team and Allium's adjusted-volume product exist precisely because raw on-chain numbers overstate stablecoin payment volume by roughly 10–100×. We agree with the diagnosis; our response in Phase 1 is the honest label, not a half-finished classifier. Phase 2 layers Allium's address attribution on top so the headline can be reframed as adjusted payment volume with the raw figure available as a toggle.

Mints and burns (transfers from or to the zero address) are identified structurally without a classifier and are tagged at ingest. A $1B issuer mint will not show up as a one-second spike on the headline number.

Turnover

volume / total supply, expressed as a percentage of supply that moved in the window. This is velocity in the textbook sense.

"USDC turned over 4.2% of its supply in the last 24 hours" is the cleanest one-sentence summary of what this dashboard exists to show. Turnover is also the metric that is arguably stronger under raw data than under adjusted — textbook velocity-of-money includes all transfers, not just payments — so the Phase 1 framing for this column is clean. Click the Turnover column header to flip the leaderboard out of its default market-cap sort and into the velocity ranking; the same set of assets reorders dramatically. That re-sort is the editorial centerpiece of this site.

Market cap

Circulating supply × peg price, in USD. The default sort on the leaderboard, because it matches the way most readers already mentally order the ecosystem (USDT and USDC at the top, long tail below). Reading market cap and turnover side-by-side is the editorial entry point: the largest assets by market cap are not, for the most part, the largest assets by velocity, and the gap is the story.

For USD-pegged stablecoins this is just on-chain supply. For non-USD pegs (EURC, BRLA, AUDD, JPYC, …) the dashboard converts the native supply to USD via the FX rate table at data/fx_rates.csv. The canonical formula is market_cap_usd = native_supply × fx_rates[peg_currency].usd_per_unit, with one edge case: KAU and KAG are quoted per gram of metal, so the per-troy-ounce XAU/XAG rates are divided by 31.1035 g/oz before multiplying. Hover the market-cap cell on a non-USD row to see the native supply, the FX rate, and the date the rate was last refreshed.

Transfers

Number of Transfer events in the window. Volume and transfer count read together tell the story: high volume with a low transfer count means treasury movement; high volume with a high transfer count means real usage.

In Phase 1 the count is inflated by DEX routing legs (one swap through an aggregator can produce several transfers). Phase 2 splits the count per category and defaults the page to the payments figure.

Active addresses

Number of distinct addresses that sent or received a transfer in the window. Distinguishes "ten whales moved" from "ten thousand people paid," and is the closest thing on-chain data offers to a user count.

One of the most robust metrics under raw data: DEX routers and CEX hot wallets are a small set of addresses, so they barely move the count.

Estimated issuer yield

Annualized, computed as reserves × short-duration rate. The reserve figures are hand-curated from the most recent issuer attestation; the rate is the FRED 3-month T-bill series.

This is flagged as an estimate because issuers hold different reserve mixes — Tether holds some BTC and gold, Circle is mostly short-duration USTs, PYUSD is different again — and a single rate is necessarily approximate. Hover the yield cell on a leaderboard row to see the attestation date for that specific issuer.

Active yield (annualized)

total annual issuer yield × turnover. The turnover framing answers "how much is moving?"; the active yield framing answers "how much of the issuer's yield is attributable to coins that actually moved in the window?" Same underlying ratio, rendered in dollars instead of percent.

The page shows total annual issuer yield right next to the active figure so the comparison reads in one beat: issuers earn $14B/yr in total; $400M of that comes from coins anybody used today. That gap — between coins served by payments and coins served by parking — is the editorial point of view of this site.

Methodology caveat — velocity vs touched supply

Turnover is textbook velocity. volume / supply counts how many times the average dollar moved, not how many distinct dollars participated. True touched supply would require per-address balance state that the aggregation pipeline does not carry.

The direction of the bias is editorially favorable: whenever active coins recirculate (most windows, most chains), velocity-based turnover overstates the moving share, so the displayed active yield figure is an upper bound on the true active yield. A more accurate measurement would only shrink the active number further and widen the gap the site exists to show.

Chains and per-chain rollups

The per-stablecoin headline number sums its per-chain figures. When 1M USDC is bridged from Ethereum to Base, the burn on one side and the mint on the other both count toward the rollup. There is no protocol-level way to deduplicate without a classifier; in Phase 2 the Allium catalog tags bridges and the payments category will exclude them, but the raw rollup will continue to double-count by design.

Click any leaderboard row to see the per-chain breakdown. Per-chain velocity is approximated by activity share in Phase 1 — chain-specific velocity multipliers are a real-data refinement that aren't worth faking against the mock.

Latest activity

Time since the most recent Transfer event for that asset. Updates on a wall-clock timer between frames so quiet assets count up smoothly even between data refreshes.

What we track (and what we don't)

The registry CSV at the monorepo root is comprehensive — 752 rows covering 193 canonical assets across 115 chains as of writing. The dashboard only computes aggregates for rows the curator has marked monitoring = true. That is the only ingest filter.

The CSV's tag column (USD stablecoin / Non-USD stablecoin / Tokenized money market fund / RWA) is a presentation filter, not an ingest filter — it powers the chip row above the leaderboard. The default chip is "USD stablecoin" because that matches the headline framing, but every monitored asset is always available behind the chips.

Phase 1 vs Phase 2

Phase 1 ships raw on-chain transfer activity under that honest label. Transfer events are pulled from chain RPC providers (Alchemy and equivalents) via eth_getLogs on a one-minute cadence by a cron-triggered Cloudflare Worker, aggregated into rolling-window sketches, and served to the browser through a polled /live/frame endpoint backed by Workers KV.

Phase 2 adds Allium's Identity catalog as an address-attribution layer. The ingestor begins tagging each transfer at write time as payments, defi, infrastructure, or cex; the median and percentile metrics return to the page; and the headline volume number is reframed as adjusted-by-default with the raw figure as a toggle. Phase 2 is purely additive — no metric defined here disappears.

The page feels live because of frontend interpolation, not because the backend pushes. The 5-minute backend cadence is hidden by smoothly easing displayed values toward each new total, distributing the bounded recent-payments ring across the polling interval, and ticking the per-card "since last payment" counters on a 500ms wall-clock timer. See ARCHITECTURE.md for the "feels live ≠ is live" reframing.

← Back to the leaderboard