Farbeam

Where large transfers land

2026-11-04 UTC · Farbeam research

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

ItemValue
Snapshot taken2026-11-04T19:48:37Z
measuring_since from GET /status2026-11-04T19:03:49.590Z
Oldest row in this data2026-11-04T19:03:49Z
Newest row in this data2026-11-04T19:48:31Z
Span44 minutes 42 seconds
Process restarts in the spanAt 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

MeasureValue
Rows4,315
Sum of usd$3,502,529,586
Distinct transactions3,056
Distinct recipients737
Rows from $100,000 to under $1m4,041
Rows from $1m to under $10m226
Rows of $10m or more48

#By recipient type

to_typeRowsShare of rowsUSDShare of USD
No label4,21697.71%$3,365,777,35796.10%
infrastructure (Null address)410.95%$91,279,4292.61%
exchange (Coinbase 10)431.00%$39,845,4041.14%
dex140.32%$5,018,8090.14%
staking (Lido stETH)10.02%$608,5870.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

ChainRowsUSDShare of USDMedian rowLargest rowRows to a label
Ethereum1,156$2,504,122,11971.49%$329,897$100,169,1387.53%
Base2,960$895,672,24425.57%$220,086$3,478,1700.20%
BNB Chain147$86,315,7052.46%$174,159$49,984,2000.00%
Arbitrum One49$13,169,9270.38%$198,110$936,77012.24%
Solana3$3,249,5910.09%$679,207$1,891,1780.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

TokenRowsUSDShare of USD
USDC1,805$1,981,420,43656.57%
WETH1,201$744,887,15521.27%
USDT453$323,492,3829.24%
cbBTC636$188,997,1015.40%
DAI63$156,605,3194.47%
ETH126$90,795,7512.59%
WBTC18$11,309,8490.32%
Others13$5,021,5930.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.

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

These figures are data about public transfers. They are not financial advice.

#Live pages