Data sources, attribution rules, coverage gaps, and known caveats — last updated May 2026
This site monitors BTC-inbound cross-chain swaps across four protocols — Chainflip, Garden Finance, NEAR Intents, and THORChain — and compares quoted swap prices to actual settlement prices, tracks affiliate fee mark-ups, and maps the frontends, wallets, and aggregators driving each protocol's volume. Data is sourced directly from each protocol's public APIs and on-chain records; nothing here is self-reported by the protocols.
Out of scope: EVM-only DEX flow (tracked separately on the DEX page via Oku/Velora quotes), the Relay aggregator (which has ~13.9M settlements but low per-swap affiliate signal — see section 8), BOB Gateway quote comparisons (tracked on the Monitor page alongside other protocols), and any protocol-native token swaps (RUNE, FLIP, NEAR, SEED/GARDEN) which are excluded from cross-protocol volume comparisons to avoid inflating figures.
Chainflip is a native cross-chain AMM using a decentralised validator set and a just-in-time liquidity system. Every swap is routed through a registered broker, making affiliate attribution structurally complete.
explorer-service-processor.chainflip.io/graphql — polled every 5 minutes for new swap completions.settlement_users table. Older raw JSON lacked the destinationAddress field. This does not affect USD volume totals, but limits per-user analytics for swaps before early 2026.
from_amount_usd = 0 (not NULL) due to a price-feed gap on older settlements. True swap.chainflip.io volume is materially higher than what the USD sum shows — verified examples include 0.4 BTC and 0.62 BTC swaps that landed with $0 attributed.
NEAR Intents is a solver-auction marketplace on the NEAR blockchain. Users post intents and competing solvers fill them. There is no single canonical frontend — dozens of wallets and applications use the same underlying protocol.
explorer.near-intents.org/api/v0/transactions-pages — polled every 5 minutes.appFees — an array of {recipient, fee} pairs attached to the intent, where the recipient NEAR address identifies the frontend or aggregator. (2) referral — a plain string code. Many frontends use Foundation-controlled fee-collector addresses (e.g. 1csfundsadmin.sputnik-dao.near) as their appFees recipient; in those cases the referral or label field carries the real frontend identity.settlement_affiliates rows (one per unique appFees entry). After canonical-label collapse, ~0.7% of NEAR USD is still double-counted in the raw CTE. The dashboard's primary leaderboard uses the settlement_primary_affiliate table (one row per settlement) to avoid this.
THORChain is a decentralised cross-chain liquidity protocol using a UTXO-compatible vault system. Swaps are initiated via on-chain memo fields. No account registration is required to submit a swap — anyone can call the protocol directly.
vanaheimex.com) — polled every 5 minutes for completed actions of type swap.=:CHAIN.ASSET:ADDRESS:LIMIT:AFFILIATE:FEE. The AFFILIATE field is a short alphanumeric code (e.g. t for THORSwap, -_/tps for SwapKit-routed Trust Wallet). This field is absent on the majority of swaps.raw_json spot-checks: unattributed settlements show explicit "affiliateAddress":"" and "affiliateFee":"0". These are genuine direct on-chain users, not a parsing gap. The /affiliates page surfaces this as a "Unattributed (THORChain)" reference row.
Garden Finance uses atomic HTLCs (Hash Time-Locked Contracts) to enable trustless BTC swaps. Settlement is atomic but depends on Bitcoin confirmation time. Primarily serves BTC-to-stablecoin and BTC-to-wrapped-BTC routes.
api.garden.finance/v2/orders — polled every 5 minutes for completed orders.integrator field on quotes and a separate affiliate_fees array on completed orders. Main integrators observed: Phantom and SatsTerminal. Garden Finance itself is a major direct-use frontend.integrator/affiliate_fees JSON fields; the gap is temporal, not structural.
Chainflip, NEAR Intents, Garden and THORChain all expose a backend protocol that wallets, aggregators and DEX frontends integrate against. The structural difference is not whether there's a marketplace — it's how visible the per-frontend attribution is, and how much volume bypasses affiliate codes entirely.
Both expose a public SDK / broker API that any wallet or aggregator can integrate. Both also ship an official web UI (swap.chainflip.io; near-intents.near / new.intents-referral.near) which captures a meaningful share but does not dominate. The top affiliates by USD volume have roughly equivalent shares across protocols:
| Rank | Chainflip | % of CF USD | NEAR Intents | % of NI USD |
|---|---|---|---|---|
| 1 | swap.chainflip.io | 31.4% | Ledger | 26.0% |
| 2 | Rango (direct API) | 22.8% | NEAR Intents (official UI) | 19.8% |
| 3 | THORSwap | 10.4% | Trust Wallet | 15.8% |
| 4 | Rango (via frontends) | 9.9% | Rango (direct API) | 12.2% |
| 5 | OKX Wallet | 9.4% | LI.FI (direct API) | 9.8% |
The compositional mix differs in interesting ways: Chainflip volume is more concentrated in aggregators making direct API calls (Rango direct, Jupiter direct, LI.FI direct add up to ~35% of CF volume), while NEAR volume is more concentrated in wallets shipping their own swap UX (Ledger, Trust Wallet, etc., via SwapKit's SDK). But neither is "single-frontend-dominant" — both are real marketplaces. Chainflip's affiliate model is also mandatory: every settlement carries at least a broker, so 0% of Chainflip USD is "unattributed".
swap.chainflip.io specifically includes: the row labelled swap.chainflip.io covers traffic through one broker address (cFJySAo3RbrtKWWb9J86jqnfTjpDCXAQ4bcJR9kt6S37i7eey) — the broker operated by Chainflip Labs to power the official web UI. It does NOT include "direct API usage" generally. On Chainflip every swap requires a broker, so API/SDK users surface as separate entities: Chainflip SDK (direct), Broker as a Service, or each aggregator's own broker (Rango, Jupiter, SwapKit, etc.).
~85% of all-time THORChain USD volume has no affiliate code at all. The THORChain memo schema makes affiliate tagging optional — users hitting THORNode directly via scripts, custom apps, market-maker bots, or arbitrage systems leave the affiliate field empty. The /affiliates leaderboard's "Unattributed (THORChain)" reference row makes this visible. When reading THORChain affiliates, you are looking at the ~15% slice that chose to tag itself; the larger flow is anonymous-by-default.
Garden's affiliate model is smaller in scope: a few named integrators (Phantom, SatsTerminal) plus Garden's own frontend. The HTLC settlement model means Garden's data set is also smaller (~47K all-time vs ~3.9M for THORChain). Garden is best read as a specialist BTC-to-stablecoin venue with two dominant retail access points.
Each settlement with at least one affiliate row gets exactly one row in settlement_primary_affiliate. This table separates the end-user-facing surface (primary_label) from the routing infrastructure (aggregator_label). Four per-protocol rule sets (in src/enrichment/primary-affiliate.ts) determine how raw rows are resolved.
| Scenario | primary_label | aggregator_label | is_direct |
|---|---|---|---|
Trust Wallet app on NEAR Intents (routes through SwapKit SDK → trustswapkit.near) |
Trust Wallet | SwapKit | false |
| Developer hitting SwapKit's API on NEAR without a downstream wallet code | SwapKit (direct) | SwapKit | true |
Retail user on swap.chainflip.io with no aggregator behind it |
swap.chainflip.io | null | false |
THORChain swap with memo -_/tps (SwapKit prefix + Trust Wallet code) |
Trust Wallet | SwapKit | false |
THORChain swap with bare memo code t |
THORSwap | null | false |
THORChain swap with bare -_ (SwapKit, no sub-code) |
SwapKit (direct) | SwapKit | true |
| Chainflip swap: affiliate row = OKX Wallet, broker row = SwapKit | OKX Wallet | SwapKit | false |
| Chainflip swap: only a broker row present, broker = swap.chainflip.io | swap.chainflip.io | null | false |
The Chainflip rule picks the top-fee affiliate row as primary_label and checks whether the broker is a known aggregator. The NEAR rule picks the first wallet/frontend in the resolved rows, then looks for an aggregator row. The THORChain rule strips the -_/ SwapKit prefix and resolves the sub-code. Garden uses the integrator field directly. See src/enrichment/primary-affiliate.ts for the full logic.
A single affiliate often appears under multiple raw codes across protocols. Trust Wallet, for example, is trustswapkit.near on NEAR Intents and memo code tps on THORChain (via SwapKit prefix -_/tps). The src/affiliates/labels.ts module maps every known raw code to a single canonical name so cross-protocol analytics work.
Lookup is address-first, with label as fallback. The exception is NEAR Intents Foundation fee-collector addresses (1csfundsadmin.sputnik-dao.near, fefundsadmin.sputnik-dao.near, buybacks.multisignature.near, app-fee.near) — these are shared fee sinks, not wallet identities, so when they appear as the address, the label or referral field carries the real frontend name.
The map currently covers ~80 canonical names across all four protocols. Anything not in the map passes through as-is (raw address or short code). The map is human-maintained and will have gaps for newly onboarded affiliates that have not yet been identified.
settlement_primary_affiliate table (one row per settlement, de-duped) to avoid this inflation. See reports/affiliate-volume-reconciliation.md for the full audit.
The table below summarises all-time settlement and USD coverage as of the May 2026 audit. The 30-day figures are lower due to a price-collection lag (see note below table).
| Protocol | Settlements (all-time) | USD Covered | USD Coverage % | Recipient Coverage % | Key Caveat |
|---|---|---|---|---|---|
| Chainflip | 219,866 | $1.17B | 93.7% | 42.6% | ~74,800 settlements have from_amount_usd = 0 (price gap, not NULL); true volume higher. 30d coverage: 31.5%. |
| NEAR Intents | 975,777 | $1.16B | 55.5% | ~100% | Multi-row fan-out in raw CTE inflates named-affiliate USD by 13–19%; primary-affiliate table is de-duped. 30d coverage: 33.8%. |
| THORChain | 3,880,432 | $1.88B | 77.4% | ~100% | 84.8% of all-time USD is unattributed (direct on-chain users, not parsing gap). 30d USD coverage: 21.4%. |
| Garden Finance | 47,736 | $159M | 74.9% | 95.2% | 84.4% of all-time USD unattributed (historical; recent 30d is 84.4% attributed). 30d USD coverage: 15.1%. |
scripts/backfill-settlement-usd.ts) runs on a slower cadence than settlement collection. The most recent ~30 days are under-priced. Coverage stabilises at 80–94% at all-time scope. Dashboard window selectors show the raw settlement count alongside USD totals so users can assess how much of the window is priced.
The Monitor page tracks how closely quoted swap rates match actual settled rates (in basis points). Matching uses a ±15-minute window: for each completed settlement, any quote from the same protocol within 15 minutes before settlement becomes a candidate match. The primary delta is (settled_rate - quoted_rate) / quoted_rate × 10,000. Negative values mean the user received less than quoted; positive means they received more. Quotes are polled every 1 minute for BTC input sizes 0.001, 0.01, 0.1, and 1.0 BTC.
All data collection runs as background cron jobs on the same server as the dashboard. The schedule (from src/index.ts):
| Job | Frequency | What it does |
|---|---|---|
| Quote collection | every 1 min | Polls Chainflip, NEAR Intents, THORChain, Garden, and others for BTC swap quotes at 4 input sizes |
| Price collection | every 1 min | Fetches BTC, ETH, and other asset prices for USD normalisation |
| Fast prices (Binance) | every 10 s | High-frequency BTC price via Binance WebSocket for near-real-time USD conversion |
| Settlement collection | every 5 min | Fetches new completed swaps from all four protocol APIs |
| Quote-settlement matching | every 10 min | Matches quotes to settlements within ±15 min window, computes rate deltas |
| Settlement timing enrichment | every 2 min | Estimates BTC first-confirmation time and NEAR completion latency |
| Recipient/sender extraction | every 10 min | Parses raw_json to populate settlement_users (recipient address, sender address) |
| Primary-affiliate attribution | every 10 min | Processes new settlement_affiliates rows, writes one row per settlement to settlement_primary_affiliate |
| BOB Gateway quotes | every 10 min | Fetches BOB Gateway quotes (slower cadence due to API constraints) |
| DEX quotes (Oku) | every 5 min | Fetches EVM DEX quotes via Oku meta-aggregator |
API response caching: live endpoints are cached for 10 minutes; heavy pre-computed views (e.g. aggregator comparison matrices) are cached for up to 1 hour.
settled_out = 0 are not stored. Only successful completions appear in the database.cF... addresses in the /affiliates leaderboard. Identification requires cross-referencing Chainflip explorer or direct protocol team attribution.raw_json. It is possible the parser misses some older Garden order format variants. A manual spot-check of those 104 records would confirm whether the gap is structural or incidental.blackmarket.tg and a small set of other NEAR affiliates appear with multiple distinct addresses per settlement (4 addresses, same canonical label). The settlement_primary_affiliate table resolves this to one row per settlement, but the raw affiliate leaderboard tab can show inflated per-affiliate USD for those names.