
Where large transfers land
We grouped every indexed transfer of $100,000 or more by the type of the recipient. Of 4,315 rows, 97.71% went to an address with no label. Rows to labeled exchanges were 1.00% of the count and 1.14% of the USD value. This result says more about the size of the label set than about the destination of the money.
#How long the index had run
| Item | Value |
|---|---|
| Snapshot taken | 2026-11-04T19:48:37Z |
measuring_since from GET /status | 2026-11-04T19:03:49.590Z |
| Oldest row in this data | 2026-11-04T19:03:49Z |
| Newest row in this data | 2026-11-04T19:48:31Z |
| Span | 44 minutes 42 seconds |
| Process restarts in the span | At least 3, for code updates. Blocks that pass during a restart are not read later |
The data store also holds 210 rows under $100,000, with ids from 7 to 550. An earlier setup threshold wrote them between 19:03:47Z and 19:06:25Z. We excluded them with min_usd=100000. GET /transfers/stats includes those rows, so we did not use it for these tables.
#Method
We paged through the transfer list, 100 rows per call, until next_cursor was empty. That took 44 calls. Then we grouped the rows in our own script. Each call costs 1 unit, so a run of this size with no key has to wait for the limit of 30 units per minute.
curl -s "https://farbeamlabs.com/api/v1/transfers?limit=100&min_usd=100000"
# For the next page, add &before=<meta.next_cursor>const base = "https://farbeamlabs.com/api/v1/transfers?limit=100&min_usd=100000";
const rows = [];
let cursor = null;
do {
const res = await fetch(base + (cursor ? `&before=${cursor}` : ""));
const body = await res.json();
rows.push(...body.data);
cursor = body.meta.next_cursor;
} while (cursor);
const byType = {};
for (const r of rows) {
const key = r.to_type ?? "none";
byType[key] = (byType[key] ?? 0) + r.usd;
}
console.log(byType);import requests
from collections import Counter
base = "https://farbeamlabs.com/api/v1/transfers?limit=100&min_usd=100000"
rows, cursor = [], None
while True:
url = base + (f"&before={cursor}" if cursor else "")
body = requests.get(url, timeout=30).json()
rows += body["data"]
cursor = body["meta"]["next_cursor"]
if not cursor:
break
by_type = Counter()
for r in rows:
by_type[r.get("to_type") or "none"] += r["usd"]
print(by_type)#Totals
| Measure | Value |
|---|---|
| Rows | 4,315 |
Sum of usd | $3,502,529,586 |
| Distinct transactions | 3,056 |
| Distinct recipients | 737 |
| Rows from $100,000 to under $1m | 4,041 |
| Rows from $1m to under $10m | 226 |
| Rows of $10m or more | 48 |
#By recipient type
to_type | Rows | Share of rows | USD | Share of USD |
|---|---|---|---|---|
| No label | 4,216 | 97.71% | $3,365,777,357 | 96.10% |
infrastructure (Null address) | 41 | 0.95% | $91,279,429 | 2.61% |
exchange (Coinbase 10) | 43 | 1.00% | $39,845,404 | 1.14% |
dex | 14 | 0.32% | $5,018,809 | 0.14% |
staking (Lido stETH) | 1 | 0.02% | $608,587 | 0.02% |
Coinbase 10 was the only labeled exchange that received a row in this data. The dex rows were CoW Protocol Settlement with 12 rows and $4,019,113, and Curve 3pool with 2 rows and $999,697.
The largest row to an exchange label was $11,996,244 of USDC to Coinbase 10 on Ethereum, at 19:08:59Z in block 26343447. Its transaction hash starts with 0x635ceb54. You can open any such row on the transaction page.
#By chain
| Chain | Rows | USD | Share of USD | Median row | Largest row | Rows to a label |
|---|---|---|---|---|---|---|
| Ethereum | 1,156 | $2,504,122,119 | 71.49% | $329,897 | $100,169,138 | 7.53% |
| Base | 2,960 | $895,672,244 | 25.57% | $220,086 | $3,478,170 | 0.20% |
| BNB Chain | 147 | $86,315,705 | 2.46% | $174,159 | $49,984,200 | 0.00% |
| Arbitrum One | 49 | $13,169,927 | 0.38% | $198,110 | $936,770 | 12.24% |
| Solana | 3 | $3,249,591 | 0.09% | $679,207 | $1,891,178 | 0.00% |
Base has the most rows and Ethereum has the most value. Do not compare the chains directly from this table, because each one has a different token list and a different level of coverage. See the limits below.
#By token
| Token | Rows | USD | Share of USD |
|---|---|---|---|
| USDC | 1,805 | $1,981,420,436 | 56.57% |
| WETH | 1,201 | $744,887,155 | 21.27% |
| USDT | 453 | $323,492,382 | 9.24% |
| cbBTC | 636 | $188,997,101 | 5.40% |
| DAI | 63 | $156,605,319 | 4.47% |
| ETH | 126 | $90,795,751 | 2.59% |
| WBTC | 18 | $11,309,849 | 0.32% |
| Others | 13 | $5,021,593 | 0.14% |
"Others" here is PYTH, BTCB, SOL, wSOL and WBNB.
#Why the sum is not money moved
The total of $3.5bn counts the same money more than once. One transaction can write several rows, for example when a contract routes funds through other contracts.
- 741 transactions wrote 2 or more rows. Together they hold 2,000 rows and $2,062,376,450, which is 58.88% of the total.
- In 250 rows, the same transaction had already moved the same token for the same whole-dollar amount. Those repeats add $672,999,777 to the sum.
- The two largest transactions wrote 4 rows each, and each one adds about $398m.
Treat the sum as a measure of activity. It does not show how much value changed owner.
The same issue affects recipients. The top 10 recipients hold 46.64% of the USD value. Nine of them have no label, and the other is the Null address. We have no evidence about what the unlabeled addresses are, so we draw no conclusion about them.
#Limits
- Labels. The set has 54 hand-curated addresses, of which 23 are exchange wallets. Exchanges use many more addresses than that. "No label" means only that the address is not in this list. It does not mean a private wallet.
- Tokens. The index covers a curated token list on each chain. A transfer of any other token is absent.
- Threshold. Rows under $100,000 are not stored, so split transfers below it are absent.
- Arbitrum. When this sample ran on 2026-11-04, the scan window was 41 blocks and a median of 59 blocks passed per poll, so about 29% of Arbitrum blocks were not scanned. The Arbitrum figures here are low for that reason. The scan now catches up, so this gap no longer applies to new data.
- Solana. The reader takes one finalized block per poll, plus a small watch list of exchange wallets. Three rows do not describe Solana.
- Optimism and Polygon. These chains have no large-transfer index. Tron is not covered at all.
- Restarts. At least 3 restarts left small gaps in this window.
These figures are data about public transfers. They are not financial advice.