Transfers vs trades
A transfer row records that a token balance moved from one address to another. It is not a trade. It does not name a buyer or a seller, and it holds no price paid, no intent and no view on what happens next.
Most wrong conclusions from on-chain data start here, so this page sets out what the row supports.
#What a row states
| The row states | Source |
|---|---|
Token units moved from from to to in transaction tx | ERC-20 Transfer log, or a balance change on Solana |
| The block or slot | Chain data |
| The USD value at a reference price at index time | CoinGecko price |
A name for from or to, when the address is in the label set | Hand-curated list |
#What a row does not state
| Common reading | Why the row cannot support it |
|---|---|
| "Someone bought X" | A token moved. A swap, a loan, a deposit, a bridge or an internal sweep produces the same log. |
| "Someone paid this price" | usd is a reference value. The row holds no execution price. |
| "This wallet is one person" | Addresses are not people. No clustering exists here. |
| "Sent to an exchange means a sale is coming" | A deposit is a deposit. Exchanges move funds between their own wallets too. |
| "From an exchange means accumulation" | A withdrawal can go to another exchange, a market maker or a custody address. |
| "Total volume was $X" | Rows repeat value across hops and cover only the curated tokens. |
#One transaction, many rows
Each qualifying log becomes its own row. A route through several contracts produces several rows that carry the same value.
This real transaction on Ethereum was captured on 2026-11-04 UTC. It moves about 1.48 million USDC through four hops in one transaction.
| Log index | Token | Amount | USD | From (prefix) | To (prefix) |
|---|---|---|---|---|---|
| 537 | USDC | 1,482,328.31 | 1,481,842 | 0xa56da9 | 0x029125 |
| 540 | USDC | 1,482,328.31 | 1,481,842 | 0x029125 | 0xe01810 |
| 544 | USDC | 1,482,328.31 | 1,481,842 | 0xe01810 | 0xce0b17 |
| 548 | USDC | 1,482,328.31 | 1,481,842 | 0xce0b17 | 0xbbbbbb |
Transaction: 0x113d561da2487dec35344a17047525e51bb20cb264e1e80369abb9e2fede8f6c.
Summing usd on these rows gives $5.93 million for a movement of $1.48 million. Transfer statistics sum rows this way, so read them as "value of qualifying logs", and not as money moved.
To count distinct movements, group by tx and take the largest value per token.
curl -s "https://farbeamlabs.com/api/v1/transfers?chain=ethereum&limit=100" \
| jq '[.data[]] | group_by(.tx + .token) | map(max_by(.usd).usd) | add'const res = await fetch("https://farbeamlabs.com/api/v1/transfers?chain=ethereum&limit=100");
const { data } = await res.json();
const best = new Map();
for (const row of data) {
const key = `${row.tx}:${row.token}`;
best.set(key, Math.max(best.get(key) ?? 0, row.usd));
}
console.log([...best.values()].reduce((a, b) => a + b, 0));import requests
rows = requests.get(
"https://farbeamlabs.com/api/v1/transfers",
params={"chain": "ethereum", "limit": 100},
timeout=30,
).json()["data"]
best = {}
for r in rows:
key = (r["tx"], r["token"])
best[key] = max(best.get(key, 0), r["usd"])
print(sum(best.values()))#Patterns that look like something else
| What you see | What it often is |
|---|---|
from_label is Null address | A mint. New supply, or a wrapped asset being issued. |
to_label is Null address | A burn or a redemption |
Same value, several rows, one tx | A route through contracts |
Two tokens of near-equal value, one tx | Possibly a swap. Open the transaction. A row alone cannot confirm it. |
SOL and wSOL rows of equal value | Wrap or unwrap, or a Solana swap counted on both scans |
| Exchange to exchange, same name | An internal move |
| An address with no label | Unknown. It is not "a whale" or "a retail wallet". |
#What a row needs to become a claim
If you want to say more than "a transfer happened", gather more.
- Read the full transaction with Transaction lookup: status, method and all token movements.
- Read both addresses with Wallet overview, and check
is_contract. - Look at the label and its
type, and remember a missing label means nothing. - State what you do not know.
#Failed transactions
ERC-20 rows come from logs, which exist only in successful transactions. Native ETH rows are read from the block's transaction list, and each gets a receipt check, so a reverted native transfer is not stored. Failed Solana transactions are skipped.
#Using this data responsibly
Farbeam shows that movements happened. It makes no statement on why, and makes no buy or sell calls. Large transfers do not predict price. Nothing here is financial advice. Read the disclaimer.