Order the prints. Join on the maker. Name the middleman, per pool.
was 3 wallets buying back what they just sold, inside one transaction — 29 times in 3.6 hours. The pair is #1 because of them.
Rina routes a mid-cap through the pool her wallet picked and is filled under the quote. She spends the evening convinced a bot ate her.
Every tool shows her volume and 24 h transactions — exactly the two numbers a wallet trading with itself inflates. So she picks the busiest pool and sets a loose cap "to be safe".
The last 800 real prints of a token from CoinMarketCap's keyless feed, ordered by block and log index, joined on the maker address. One row per pool. One line under it.

lgid ma side a0 (MOTO) a1 (WETH) a1/a0 202 0x9c97c0a6a0… buy 561,202.9606 0.699926 1.2472e-06 209 0xc9160fdab1… sell 842,991.8538 1.043025 1.2373e-06 ◀ leg 218 0xc9160fdab1… buy 829,640.6520 1.032594 1.2446e-06 ◀ leg 225 0xdd64c9d73e… sell 774,494.6589 0.958588 1.2377e-06
That is the whole definition. Sell 842,991 MOTO, buy 829,640 back, 1.6 % apart, one transaction. Divide a1 by a0 and you have the price each leg paid.
This wallet and two others did it 29 times in 3.6 h — $127,254 of the pool's $192,275. Take the legs out and an organic fill pays 15.5 bps, not the 55.3 the raw tape implies.
A trader reading the raw tape sizes a cap three and a half times too loose.



10 tokens on Ethereum, BSC and Solana, 445 pools; every receipt committed and re-derivable from its tape offline.
by 14 wallets. The widest gap between one token's pools: LINK, 22.9× — 0.6 bps median on Uniswap v4 (Ethereum) / ETH against 14.2 on Uniswap v3 (Ethereum) / USDC.
both the same wallet, front-running a seller on UNI and on LINK — for $0.95 and $2.19. A rate of 0.025 %.
This project was decided as the sandwich rate per pool. The day-1 spike found zero same-block sandwiches in 1,200 prints; the census found two in 8,000. So the headline changed before the build, not the caveat after — same feed, same ordering, same join; the sandwich is one named case of a middleman, and the number the page leads with is the one the join actually found. On 2026-09-20 the same command found 17 sandwiches in one window on a different pair — small on average is not small everywhere.
| endpoint | what the product takes from it |
|---|---|
/v1/dex/tokens/transactions | the engine — ma h lgid tp a0 a1 tx en t0a t1a per swap, lastId cursor |
/v1/dex/token/pools | pool address, venue, liqUsd — labels each (en, t0a, t1a) group |
/v1/dex/security/detail | buyTax / sellTax — a transfer tax is never scored as a middleman |
/v4/dex/pairs/quotes/latest | 24 h buys + sells — 15.7 % of the pair's 4,899 transactions is what 800 prints covered |
/v4/dex/spot-pairs/latest | the hero rule — #1 pair by no_of_transactions_24h, per chain |
/v1/dex/platform/list | explorer URL templates for the transaction links |
No key exists to charge. It survives the Oct 1 Basic reversion at zero credits.
A multi-chain swap indexer with maker attribution, a pool registry, a fee-on-transfer simulator, a pair-count aggregator, an explorer map.
From the missing CORS header to q rounded to two figures on Uniswap v4 rows — dated, with evidence.
$ python3 scripts/middleman.py hero rule → MOTO/WETH, the #1 Ethereum Uniswap v2 pair by 24h transactions MOTO · ethereum · 800 prints · 3.6 h · blocks 26006339–26007416 · captured 2026-09-18 22:36:19 UTC · keyless 66.2% of Uniswap v2 / WETH volume is 3 wallet(s) buying back what they just sold (29 round-trips, same transaction) pool prints organic round-trips sandw q→fill p50 / p90 tax liq Uniswap v2 / WETH 770 712 29 · 3 wallet(s) · 66.2% 0 15.5 / 60.9 bps 0/0 $956k ◀ route Uniswap v2 / USDC 17 17 — 0 66.5 / 137.8 bps 0/0 $39k Uniswap v2 / USDT 13 13 — 0 71.1 / 135.2 bps 0/0 $34k ▶ route via Uniswap v2 / WETH · cap slippage at 0.65 % (organic p90 60.9 bps, 1 candidate pool(s)) wrote docs/proof/moto.json (8.6 s wall clock · 11 calls, every one HTTP 200 · 0 credits — keyless)
3.6 h on the hero, 20 h on SHIB. The span is on every row; the receipt carries the window's share of the pool's 24 h count — 15.7 % here.
The feed carries no pool address. A row marked ×n is n pools sharing (venue, base, quote) — marked, never guessed. Filed as FEEDBACK.md §6.
Consecutive opposite-side prints straddle the fee twice, so p90 sits near 60 bps on every busy 0.30 % pool. It is used comparatively, across pools of one token in one window.
Same wallet, same block, opposite sides, size-matched. The rows and the definition are printed; nobody is labelled a bot. The anonymous tier throttles per IP — the tool backs off and exits 75 if the quota is spent.
$ git clone https://github.com/edycutjong/middleman.git $ cd middleman $ python3 scripts/middleman.py $ python3 scripts/verify_tape.py # every receipt vs its tape, offline
Between your quote and your fill:
two rows and one division.