Skip to main content
Geographic attribution is honest about its limits, at two levels. At the address level, addresses_geography records which wallets received a country and with what conviction — most wallets don’t, and that is signal, not missing data. At the transfer level, the corridor tables grade every dollar with a measurability value and an attribution tier, retaining the volume that cannot be placed so totals always reconcile. This page explains both.

Address-level measurability

Only ~25% of classified addresses carry a country in addresses_geography. The rest are eligible but lack a confident signal — mostly unlabeled self-custody wallets whose counterparties and timing don’t yield an attribution. A small set (contracts, tokens, bridges, genesis/burn addresses) is structurally excluded.

Hosted vs unhosted wallets: why they’re different

Hosted (custodial) addresses are controlled by a centralized entity — an exchange holding funds on behalf of users. Why hosted geography is comparatively knowable:
  1. Declared operating country — exchanges disclose their headquarters / primary jurisdiction
  2. Regulatory footprint — license requirements reveal operating countries
  3. Web traffic signals — where an exchange’s users browse from is observable
  4. Deposit patterns — where attributed wallets deposit from is observable on-chain
A single-country (local) exchange resolves to one jurisdiction. But a global exchange’s wallet has no single country — its geography is a distribution over its user base, which is exactly how the corridor tables treat it (see the fan-out below). Unhosted (self-custody) addresses — MetaMask, hardware wallets, general EOAs — are the bulk of the population and the hard case: Why unhosted geography is harder:
  1. No declared country — users don’t register with a jurisdiction
  2. Pseudonymous — no KYC
  3. Indirect signals only — geography must be inferred from counterparties, transaction timing, and wallet-relatedness clusters
  4. Multi-country usage — one wallet may be used from several countries (VPN, travel)
Attribution is therefore multi-stage inference:
  1. Direct labels — a labeled wallet with a known country
  2. Flow-based propagation — a wallet related to labeled wallets (direct two-way transfers, shared funders, shared CEX deposit wallets) inherits their country, weighted by relatedness
  3. Timezone inference — hour-of-day activity distribution as a supporting signal
The addresses_geography.reasoning column records, in plain language, exactly which signals drove each attribution (e.g. “Propagated from 20 related wallet(s) via shared funders within a 24-72h window.”).

Conviction levels

Attribution quality is a conviction tier (addresses_geography.confidence), not a probability:
addresses_geography.score is bounded to 0–1 (higher = stronger). The confidence tier is the safer filter, because it also accounts for how many independent signals corroborate the attribution. The corridor tables’ unhosted legs use only attributions with score > 0.5.

Transfer-level tiers

The corridor tables resolve each leg of each transfer and grade the result. Legs resolve four ways:

The exchange fan-out

An exchange leg is never assigned a single country — it is replaced by a weighted distribution (corridor_usd = transfer_usd × from_weight × to_weight). The weights blend web-traffic geography with on-chain deposit geography, calibrated against exchanges whose home country is known, and are renormalized to sum to exactly 1 — volume is conserved: nothing invented, nothing lost. A side effect is that n_transfers is fractional per row (a transfer fanned across 20 countries contributes weights that sum back to 1); sums remain correct.

How on-chain flows are used

On-chain deposit flows are the dollar-denominated corrector inside the fan-out weights. For every exchange, deposits from geographically attributed unhosted wallets give an observed country distribution of real money — a signal web traffic cannot provide (visits are not dollars, and traffic is distorted by VPNs and app-only users). But flow data has its own failure modes, so it is constrained three ways before it influences a weight:
  1. Quality scaling. Only a minority of each exchange’s inbound flow comes from wallets we can attribute. An exchange’s flow signal is weighted by how much of its flow is attributable — exchanges with rich attribution lean meaningfully on flows; exchanges with thin attribution stay traffic-driven.
  2. Hub discounting. Countries whose flow share across all exchanges vastly exceeds their traffic share are hosting/institutional artifacts (datacenter and custodial wallets), not user geography — their flow contribution is damped.
  3. Ground-truth calibration. The blend parameters are fitted and validated on exchanges whose home country is known independently. Flows earn their influence by demonstrably improving home-country recovery over traffic alone — where they don’t, their weight goes to zero.
The result: flows sharpen the geography where they are trustworthy (they are especially good at correcting markets where traffic misleads) without steering it where they are thin or contaminated.

Tiers and the measurability grade

The leg pair determines the tier, and the tier maps to measurability:
The x_* tiers are retained as rows, not dropped. SUM(usd) over any corridor slice without a measurability filter reconciles to total transfer volume — the not-measurable share is part of the answer, and corridors_coverage_daily exists to report it per chain and classification.

Why this matters for your analysis

  • Pick your grain deliberately. Region-grain results (2r_region included) are the most robust; exact country corridors (1_exact only) are the highest confidence and smallest slice; one-sided flows (3_partial) power country in/out totals even when counterparties are dark.
  • Coverage differences are findings. A chain where 20%+ of volume is measurable (retail-heavy) is telling you something different from one near 0% (bot/DeFi churn). Check corridors_coverage_daily before comparing chains.
  • Don’t mix attribution kinds. A country on an unhosted leg is an inferred user location; a region on an exchange fan is a distribution over a user base. The tier column keeps them separable — use it.

Next Steps

Table Reference

Full column-level schema for every table

Geographic Intelligence

Back to the geographic intelligence overview