next · esc overview · p notes
Elephant Tracks

Net flow is a sum.
Summing is lossy.

Split the swaps by maker. See what the sum destroyed.

Build with CMC · API Hackathon Built on the CoinMarketCap API Data & Visualisation v0.0.0-dev
Elephant Tracks — splitting the tape
AUSD on Ethereum · 800 swaps · 2026-09-07 07:00:52 UTC
+2.1%
net flow — the only number a flow dashboard prints

One address sold $25.5M in 12 swaps — 62.0% of the sell side — into 212 different buying wallets.

The problem

Two opposite markets.
One identical number.

A — one desk, a thousand buyers
sell · 1 wallet · $1,000,000buy · 1,000 wallets · $1,000 each
net flow0.0%top seller's share100%top buyer's share0.1%
B — a thousand sellers, a thousand buyers
sell · 1,000 wallets · $1,000 eachbuy · 1,000 wallets · $1,000 each
net flow0.0%top seller's share0.1%top buyer's share0.1%

Marcus checks flow on Monday, reads "balanced", and holds — through a week of being distributed into. Nothing recovers a split from a sum.

The mechanism

Never sum. Split the tape by maker.

01 · PULL

Individual swaps

/v1/dex/tokens/transactions, keyless. Per swap: side tp, USD value v, maker ma.

02 · SPLIT

Partition on the side

Buys in one bucket, sells in the other. Net flow is computed too — only so it can be shown losing.

03 · ATTRIBUTE

Sum per wallet, take the top

Per side, Σ v grouped by ma. The largest wallet's share of its side is the number.

# scripts/split_tape.py — split(), the whole product
by_maker[side][swap.ma] += swap.v                    # per side, per wallet
top_share[side] = max(by_maker[side].values()) / Σ side.v
net_flow = (Σ buys.v − Σ sells.v) / (Σ buys.v + Σ sells.v)   # shown beside it, losing
The number · AUSD · ethereum · 800 swaps · 2026-09-07 07:00:52 UTC
what every dashboard prints net flow +2.1%
sell · 333 swaps · 111 wallets · $41,049,941
62.0%
one wallet · $25,459,824 in 12 swaps
buy · 467 swaps · 212 wallets · $42,823,716
11.7%
largest wallet · $4,998,916 in 4 swaps

The bar is $83,873,656 of swaps, drawn to volume: sell 48.9%, buy 51.1%. The halves are equal; the populations are not.the largest single wallet on that sideevery other wallet on it

Check it by hand — thirty seconds

The receipt row, verbatim

{
  "symbol": "AUSD",
  "platform": "ethereum",
  "swaps": 800,
  "net_flow_pct": 2.1148175505180515,
  "sells": 333,
  "sell_wallets": 111,
  "sell_vol": 41049940.75883942,
  "sell_top_maker": "0x9f681e397f51137215b8240b8bf4e523d898661b",
  "sell_top_swaps": 12,
  "sell_top_vol": 25459823.583279844,
  "sell_top_share": 0.6202158422798087,
  "buys": 467,
  "buy_wallets": 212,
  "buy_top_share": 0.11673241056880844,
  "confidence": "ok"
}
sell_top_vol ÷ sell_vol = 25,459,823.58 ÷ 41,049,940.76 = 0.6202 → 62.0%

The 12 swaps, raw, with a running sum

#time UTCtxvenuev (USD)running
108-31 15:35:350xf324…7547Uniswap v3$5,000,016.38$5,000,016.38
208-31 15:45:110xc4e0…cb84Uniswap v3$333,324.58$5,333,340.97
308-31 15:57:470xc8ea…34a2Uniswap v3$847,105.36$6,180,446.33
408-31 16:44:590xca5b…0568Uniswap v3$3,291,115.23$9,471,561.56
508-31 16:57:350x5cc5…9023Uniswap v3$527,666.60$9,999,228.15
609-01 17:01:230xc029…475dUniswap v3$5,000,006.77$14,999,234.92
709-01 17:44:470xe972…a77eUniswap v3$2,652,498.67$17,651,733.59
809-01 18:57:470x253c…3c89Uniswap v3$347,138.65$17,998,872.24
909-02 17:57:350x4e17…d86cUniswap v3$992,842.73$18,991,714.97
1009-02 20:25:590x114d…3957Uniswap v3$4,344,882.05$23,336,597.02
1109-03 07:28:590xd688…aebdUniswap v3$1,428,198.57$24,764,795.58
1209-03 08:51:590x2ea3…ddeaUniswap v3$695,028.00$25,459,823.58
Σ v = sell_top_vol$25,459,823.58

Every swap in the window with ma = the top seller and tp = sell. v values as returned by the API; full file in docs/proof/ausd.json.

The map · four tokens, all within ±5% of balanced
25%25%50%50%75%75%100%100%0 distribution to retail one seller, many buyers accumulation from a crowd one buyer, many sellers wash-shaped symmetry one wallet on both sides churn crowds on both sides AUSD net +2.1% SHFL net +0.9% BINGO net −0.4% GME net −0.9% top maker's share of the SELL side → top maker's share of the BUY side →
AUSDethereum · net +2.1%
Distribution. Sell 62.0% one wallet · buy 212 wallets
SHFLethereum · net +0.9%
Accumulation. Buy 54.1% one wallet, 120 swaps · sell 425 wallets
BINGOsolana · net −0.4%
Wash-shaped. 97.9% / 99.3% — the same wallet on both sides
GMEsolana · net −0.9%
Churn. 2.9% / 3.7% — 217 sellers, 175 buyers
The CoinMarketCap API · keyless

One neglected endpoint is the engine.

endpointrolekey
/v1/dex/tokens/transactionsPer-swap tp, v, ma · cursor on data.lastIdnone
/v4/dex/spot-pairs/latestUniverse enumeration for the sweepnone
/v4/dex/pairs/quotes/latestLiquidity context — its 24h buy/sell volumes deliberately unusednone
/v1/dex/holders/countOffline holder-count collector, not on the judged pathStartup
pagination
100 → 800

The cursor is data.lastId on the envelope, not on the last swap. Fixing that turned a 100-swap window into 800 in eight calls.

identity
89 / 91 / 100

Distinct tx / lgid / swaps on one page. Neither is a key alone; the pair is. Dedup on tx dropped 11%.

aggregate fields
6 / 200

24h_buy + 24h_sell reconciled with volume_24h on six pairs of 200. So: individual swaps, never the aggregate.

It runs · keyless · no install
elephant
$ python3 scripts/split_tape.py --address 0x0000…012a --symbol AUSD --pages 8

splitting the tape — keyless, 8 page(s) x 100 swaps per token

token    swaps   buy w  sell w  top buy  top sell  net flow
AUSD       800     212     111    11.7%     62.0%      2.1%

HERO — rule: max top-maker share of either side among |net flow| < 5.0%
  AUSD: one wallet is 62.0% of the sell side
        while net flow reads +2.1%
  sell: $25,459,824 in 12 swaps from 0x9f68…661b
  buy:  467 swaps from 212 distinct wallets

wrote ausd.json  (29.4s wall clock, 0 credits — keyless)
29.4 s
800 swaps · 8 calls · clean run
0
credits · no API key
36
tests · 5 against live CMC
2,000
property cases · 0 failing
CI runs the real split
every push · no secret configured · stdlib only
Honest limits

What this is not.

Not a live page

CMC sends no Access-Control-Allow-Origin, so the site is a dated snapshot with receipts. The live thing is the CLI.

A wallet is not an entity

One entity can span wallets — the share is a floor. A router can pool many users into one maker — it inflates. We claim the address-level number, nothing more.

A window, not a day

The most recent 800 swaps at capture — days for a stablecoin, minutes for a meme coin. Rows failing the published floors are shown with the reason, never hidden.

Ticket size was retired

At flat net flow the ticket ratio equals the count ratio — one quantity measured twice, best real value 5.2×. It stays as a column, not the headline.

The ask

Run it before
you score it.

thirty seconds on a clean run · no key
$ git clone https://github.com/edycutjong/elephant.git
$ cd elephant
$ python3 scripts/split_tape.py \
    --address 0x00000000efe302beaa2b3e6e1b18d08d69a9012a \
    --symbol AUSD --pages 8

Net flow is one number.
The split is four.

Elephant Tracksv0.0.0-devcaptured 2026-09-07 07:00:52 UTC
01 / 11
speaker notes