Methodology

Data sources, attribution rules, coverage gaps, and known caveats — last updated May 2026

1. Overview

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.

2. Protocols Tracked

Chainflip

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.

  • Settlement data: Chainflip explorer GraphQL at explorer-service-processor.chainflip.io/graphql — polled every 5 minutes for new swap completions.
  • Affiliate model: Mandatory broker + optional affiliate. Every swap has exactly one broker (SS58 address). A separate affiliate address may be registered on top of the broker. This means every Chainflip settlement has at least one affiliate row, and 0% of settlements are "unattributed".
  • Database coverage (all-time): 219,866 settlements, $1.17B USD attributed. USD coverage: 93.7% of settlements priced.
Limitation — recipient coverage: Only ~42.6% of Chainflip settlements have a known recipient address in the 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.
Limitation — zero-USD records: ~74,800 Chainflip settlements have 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

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.

  • Settlement data: NEAR Intents explorer API at explorer.near-intents.org/api/v0/transactions-pages — polled every 5 minutes.
  • Affiliate model: Two mechanisms. (1) 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.
  • Database coverage (all-time): 975,777 settlements, $1.16B USD attributed. USD coverage: 55.5% of settlements priced (improves to 85.3% when only counting settlements with a price record, out of the full all-time set).
Caveat — multi-row fan-out: A single NEAR Intents settlement can generate up to 4 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

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.

  • Settlement data: Midgard API (vanaheimex.com) — polled every 5 minutes for completed actions of type swap.
  • Affiliate model: Optional memo-field code. Memo format: =: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.
  • Database coverage (all-time): 3,880,432 settlements, $1.88B USD attributed. USD coverage: 77.4% of settlements priced.
Limitation — 84.8% of THORChain USD is unattributed all-time. Verified via 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

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.

  • Settlement data: Garden API at api.garden.finance/v2/orders — polled every 5 minutes for completed orders.
  • Affiliate model: An 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.
  • Database coverage (all-time): 47,736 settlements, $159M USD attributed. USD coverage: 74.9% of settlements priced.
Caveat — historical attribution gap: Garden has 84.4% of all-time USD unattributed (but only 15.6% in the last 30 days). This is likely because affiliate parsing shipped mid-history — older Garden orders were collected before the parser was deployed. The parser correctly handles the current integrator/affiliate_fees JSON fields; the gap is temporal, not structural.

3. Why Per-Protocol Comparisons Aren't Apples-to-Apples

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.

Chainflip and NEAR Intents — marketplace protocols with comparable concentration

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:

RankChainflip% of CF USDNEAR Intents% of NI USD
1swap.chainflip.io31.4%Ledger26.0%
2Rango (direct API)22.8%NEAR Intents (official UI)19.8%
3THORSwap10.4%Trust Wallet15.8%
4Rango (via frontends)9.9%Rango (direct API)12.2%
5OKX Wallet9.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".

What 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.).

THORChain is direct-protocol-heavy

~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 uses an integrator field on quotes

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.

Recommended read: Compare per-protocol totals first, then drill into the affiliate breakdown within each protocol. The /affiliates page has a protocol filter for exactly this. A wallet appearing #1 on NEAR Intents and #5 on THORChain is not "worse" on THORChain — it is simply serving a smaller slice of a differently structured protocol with very different attribution incentives.

4. Two-Tier Attribution Model

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.

5. Canonical Label Consolidation

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.

Caveat — Chainflip multi-label over-count: A structural property of Chainflip means that ~31.8% of all-time Chainflip settlements have more than one distinct (label, address) combination — for example, a swap with one broker address and two affiliate addresses. Even after canonical-label collapse, this can cause the raw per-(label, address) CTE to attribute the same swap's USD volume to multiple identities. The dashboard's primary leaderboard uses the settlement_primary_affiliate table (one row per settlement, de-duped) to avoid this inflation. See reports/affiliate-volume-reconciliation.md for the full audit.

6. Coverage Limits

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%.
30-day USD coverage is below 35% across all protocols. The price-backfill script (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.

Quote rate accuracy (Monitor page)

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.

7. Data Refresh Schedule

All data collection runs as background cron jobs on the same server as the dashboard. The schedule (from src/index.ts):

JobFrequencyWhat it does
Quote collectionevery 1 minPolls Chainflip, NEAR Intents, THORChain, Garden, and others for BTC swap quotes at 4 input sizes
Price collectionevery 1 minFetches BTC, ETH, and other asset prices for USD normalisation
Fast prices (Binance)every 10 sHigh-frequency BTC price via Binance WebSocket for near-real-time USD conversion
Settlement collectionevery 5 minFetches new completed swaps from all four protocol APIs
Quote-settlement matchingevery 10 minMatches quotes to settlements within ±15 min window, computes rate deltas
Settlement timing enrichmentevery 2 minEstimates BTC first-confirmation time and NEAR completion latency
Recipient/sender extractionevery 10 minParses raw_json to populate settlement_users (recipient address, sender address)
Primary-affiliate attributionevery 10 minProcesses new settlement_affiliates rows, writes one row per settlement to settlement_primary_affiliate
BOB Gateway quotesevery 10 minFetches BOB Gateway quotes (slower cadence due to API constraints)
DEX quotes (Oku)every 5 minFetches 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.

8. Excluded Data

  • Relay: ~13.9M settlements in the database. Relay was excluded from the affiliate analytics primarily because its volume is dominated by very small swaps with low per-swap affiliate signal, and including it would overwhelm the other protocols visually. Relay settlements are still collected and stored but not surfaced in the /affiliates leaderboard.
  • Protocol-native token swaps: RUNE↔other on THORChain, FLIP-denominated swaps on Chainflip, NEAR as output on NEAR Intents, and SEED/GARDEN on Garden Finance are excluded from all cross-protocol USD volume comparisons to avoid inflating figures with tokens that have no BTC analogue.
  • Failed and cancelled swaps: Settlements where settled_out = 0 are not stored. Only successful completions appear in the database.
  • THORChain streaming swaps (partial): Large BTC swaps (>0.1 BTC) may execute over multiple blocks as streaming swaps. The settlement record uses the final outbound timestamp, not the first inbound deposit time. Intermediate partial fills are not tracked separately.

9. Open Questions / Known Gaps

  • Unmapped Chainflip SS58 addresses: Some broker and affiliate addresses visible in the raw data have not yet been identified. They appear as bare cF... addresses in the /affiliates leaderboard. Identification requires cross-referencing Chainflip explorer or direct protocol team attribution.
  • THORChain direct-user deduplication: The ~85% of unattributed THORChain volume cannot be broken down to individual entities without recipient-address heuristics. Two swaps from the same on-chain address have no shared identifier in the affiliate data. This is a structural property of the THORChain memo system.
  • Garden historical unattributed data: 104 unattributed Garden settlements in the 30-day window have non-null 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.
  • USD coverage in recent windows: 30-day coverage runs 15–34% across all protocols due to price-backfill lag. Volume figures for recent windows should be treated as lower bounds until backfill catches up. The dashboard displays raw counts alongside USD totals for transparency.
  • NEAR multi-label over-count for specific affiliates: 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.
  • Chainflip structural multi-label over-count: ~31.8% of Chainflip settlements have more than one distinct identity even after canonical-label collapse (broker + affiliate from separate entities). The de-duped primary-affiliate table is the correct source for volume attribution; the raw per-address breakdown overestimates total attributed Chainflip USD by ~25%.