CoinMarketCap APIkeyless0 credits2026-09-18

The #1 Uniswap v2 pair on Ethereum, by transactions. 66.2% of it is 3 wallets trading with themselves.

Who stands between your quote and your fill, per pool.

Block 26006339: 5 prints of MOTO. The two orange bars are the same wallet selling and buying back the same size — a round-trip.
a print in block 26006339 — bar length is its MOTO amount; 5 of the block's prints are drawnlgid 209 sell 842,991.85lgid 218 buy 829,640.65 MOTO: the same wallet 0xc9160f…6d95, same transaction, sizes 1.6 % apart
MOTO · ethereum · 800 prints · 8 pages · 8.56 s captured 2026-09-18 22:36:19 UTC · reproduce ↓
The product

One row per pool. Orange is a middleman; green is where to route.

The token's last 800 prints, ordered by block and log index, grouped into pools, joined on the maker address. Then one line: where to route and what to cap. Switch tokens below — every one is a committed run, no request.

MOTO · Ethereum · last 800 prints · 3.6 h · blocks 26006339–26007416 · captured 2026-09-18 22:36:19 UTC · keyless · chosen by rule: the base token of the #1 uniswap-v2 pair on ethereum by 24h transactions at capture time

of Uniswap v2 / WETH volume is 3 wallets buying back what they just sold, in the same transaction.

29 round-trips · 0 sandwiches in 770 prints. Take the legs out and an organic fill here pays 15.5 bps median; the raw tape says 55.3.

pool prints organic round-trips sandwiches q→fill p50 / p90 tax liquidity
Uniswap v2 / WETH◀ route77071229 · 3 wallets · 66.2%015.5 / 60.9 bps0 / 0$956k
Uniswap v2 / USDC1717066.5 / 137.8 bps0 / 0$39k
Uniswap v2 / USDT1313071.1 / 135.2 bps0 / 0$34k
▶ route via Uniswap v2 / WETH · cap slippage at 0.65 %
rule: lowest organic p90 quote-to-fill among pools with ≥ 50 organic prints · organic p90 here 60.9 bps · 1 candidate pool

Uniswap v2 / WETH — raw rows (round-trip)

block 26006339 · the block that holds the first round-trip — both legs in orange · endpoint /public-api/v1/dex/tokens/transactions · the whole tape (opens in a new tab)
lgidmakersidea0 (base)a1 (quote)a1 / a0tx
2020x9c97c0a6…af7dbuy561,202.96060.6999261.2472e-060xe76474…9653 (opens in a new tab)
2090xc9160fda…6d95sell842,991.85381.0430251.2373e-060x1345be…028b (opens in a new tab)
2180xc9160fda…6d95buy829,640.65201.0325941.2446e-060x1345be…028b (opens in a new tab)
2250xdd64c9d7…30c5sell774,494.65890.9585881.2377e-060x3757ac…1cc7 (opens in a new tab)
2340xdd64c9d7…30c5buy762,222.46670.9490031.2450e-060x3757ac…1cc7 (opens in a new tab)
  • leg 1 lgid 209 0xc9160fdab187f2e55567b760d88a87ae7fe56d95 sell a1/a0 = 1.0430246602456774 / 842991.8537715519 = 1.237289133434893e-06
  • leg 2 lgid 218 0xc9160fdab187f2e55567b760d88a87ae7fe56d95 buy a1/a0 = 1.0325944136432206 / 829640.6520318444 = 1.2446285161103536e-06
  • same wallet · same block 26006339 · same tx · |Δa0| / a0 = 0.0158 ≤ 0.05 → round-trip
raw JSON of these rows, verbatim from the API
[
 {
  "a0": 561202.9605965281,
  "a1": 0.6999255340085679,
  "eid": 1069,
  "en": "Uniswap v2",
  "ex": false,
  "f": "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f",
  "h": "26006339",
  "lgid": "202",
  "ma": "0x9c97c0a6a00b1a9f74dbe09a4c55ec9f09f8af7d",
  "q": 1.247187885939e-06,
  "qi": 1,
  "t0a": "0xbd965230588eaa536de6aa45e8ebbc01638535e0",
  "t0pt": "add",
  "t0pu": 0.0032583767444015633,
  "t0s": "MOTO",
  "t0t": true,
  "t1a": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
  "t1pt": "reduce",
  "t1pu": 2612.578891391966,
  "t1s": "WETH",
  "t1t": false,
  "tc": "119",
  "tp": "buy",
  "ts": "1789757999000",
  "tx": "0xe764743a031d5ad70cc6d4ac0603b33b2ad2240b243d925295c33899a4ec9653",
  "txId": "155",
  "txtp": 0,
  "v": 1828.6106756970341
 },
 {
  "a0": 842991.8537715519,
  "a1": 1.0430246602456774,
  "eid": 1069,
  "en": "Uniswap v2",
  "ex": false,
  "f": "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f",
  "h": "26006339",
  "lgid": "209",
  "ma": "0xc9160fdab187f2e55567b760d88a87ae7fe56d95",
  "q": 1.237289133435e-06,
  "qi": 1,
  "t0a": "0xbd965230588eaa536de6aa45e8ebbc01638535e0",
  "t0pt": "reduce",
  "t0pu": 0.0032325154725606586,
  "t0s": "MOTO",
  "t0t": true,
  "t1a": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
  "t1pt": "add",
  "t1pu": 2612.578891391966,
  "t1s": "WETH",
  "t1t": false,
  "tc": "81",
  "tp": "sell",
  "ts": "1789757999000",
  "tx": "0x1345bed7cd96a35ae5543fdbfde710c1f7b41a3a365fc31b4c3c52e47512028b",
  "txId": "156",
  "txtp": 0,
  "v": 2724.9842105591338
 },
 {
  "a0": 829640.6520318444,
  "a1": 1.0325944136432206,
  "eid": 1069,
  "en": "Uniswap v2",
  "ex": false,
  "f": "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f",
  "h": "26006339",
  "lgid": "218",
  "ma": "0xc9160fdab187f2e55567b760d88a87ae7fe56d95",
  "q": 1.244628516111e-06,
  "qi": 1,
  "t0a": "0xbd965230588eaa536de6aa45e8ebbc01638535e0",
  "t0pt": "add",
  "t0pu": 0.003251690188814415,
  "t0s": "MOTO",
  "t0t": true,
  "t1a": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
  "t1pt": "reduce",
  "t1pu": 2612.578891391966,
  "t1s": "WETH",
  "t1t": false,
  "tc": "81",
  "tp": "buy",
  "ts": "1789757999000",
  "tx": "0x1345bed7cd96a35ae5543fdbfde710c1f7b41a3a365fc31b4c3c52e47512028b",
  "txId": "156",
  "txtp": 0,
  "v": 2697.734368453542
 },
 {
  "a0": 774494.6589395582,
  "a1": 0.9585884495481751,
  "eid": 1069,
  "en": "Uniswap v2",
  "ex": false,
  "f": "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f",
  "h": "26006339",
  "lgid": "225",
  "ma": "0xdd64c9d73ea795b9e92b217cab92bf44d91d30c5",
  "q": 1.237695364951e-06,
  "qi": 1,
  "t0a": "0xbd965230588eaa536de6aa45e8ebbc01638535e0",
  "t0pt": "reduce",
  "t0pu": 0.003233576784442562,
  "t0s": "MOTO",
  "t0t": true,
  "t1a": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
  "t1pt": "add",
  "t1pu": 2612.578891391966,
  "t1s": "WETH",
  "t1t": false,
  "tc": "41",
  "tp": "sell",
  "ts": "1789757999000",
  "tx": "0x3757aca12af6fcb7787c577c0517ec6ab0c29af7eb8fbe27e8ba24206ab51cc7",
  "txId": "158",
  "txtp": 0,
  "v": 2504.387948821715
 },
 {
  "a0": 762222.4666825428,
  "a1": 0.9490025650526934,
  "eid": 1069,
  "en": "Uniswap v2",
  "ex": false,
  "f": "0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f",
  "h": "26006339",
  "lgid": "234",
  "ma": "0xdd64c9d73ea795b9e92b217cab92bf44d91d30c5",
  "q": 1.245046697696e-06,
  "qi": 1,
  "t0a": "0xbd965230588eaa536de6aa45e8ebbc01638535e0",
  "t0pt": "add",
  "t0pu": 0.003252782721197481,
  "t0s": "MOTO",
  "t0t": true,
  "t1a": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
  "t1pt": "reduce",
  "t1pu": 2612.578891391966,
  "t1s": "WETH",
  "t1t": false,
  "tc": "41",
  "tp": "buy",
  "ts": "1789757999000",
  "tx": "0x3757aca12af6fcb7787c577c0517ec6ab0c29af7eb8fbe27e8ba24206ab51cc7",
  "txId": "158",
  "txtp": 0,
  "v": 2479.344069333498
 }
]

Paste any token — the same engine, live, keyless

The browser runs the engine's JavaScript port on rows fetched through a keyless proxy; it is parity-tested against the Python engine on every committed tape. Taxes and liquidity stay blank on this path — the CLI fills them. The proxy shares one IP across every visitor, so a 429 is shown as a 429, with the command to run instead.

committed run
The census

10 tokens, 3 chains, whatever they said.

The same engine over the hero pair on each chain — chosen by the same rule — and 7 pinned Ethereum tokens. Every receipt is committed; every number re-derives from its tape with the network unplugged.

8,000prints, 10 tokens
445pools recovered from the rows
45round-trips by 14 wallets
2sandwiches — 0.025 % of prints
22.9×widest sibling-pool spread, LINK

LINK: 0.6 bps median quote-to-fill on Uniswap v4 (Ethereum) / ETH against 14.2 on Uniswap v3 (Ethereum) / USDC — same token, same hours. Also measured by the same rule: USDT/WBNB on BSC, USDC/wSOL on Solana. The sandwich rate this project was decided to headline is 0.025 %, and the page says so: both sandwiches are one wallet, and the join found them.

The receipt

Every number on this page came from a call you can replay.

Each request behind the table — URL, HTTP status, UTC, sha256 of the body, credits — is listed on /evidence. The block below follows the table: switch a token or paste one and it updates.

endpoint
/public-api/v1/dex/tokens/transactions
calls
11 · 8 pages of 100 · HTTP 200
credits used
0 — none — CoinMarketCap keyless /public-api surface
captured
2026-09-18T22:36:19Z · 8.56 s wall clock
first page sha256
7171f3b8ef10dc0e177b85e91d228285c456f9972308c96ae087ef792361ed0d
first request
re-derive
python3 scripts/verify_tape.py · docs/proof/ (opens in a new tab) · every call →
The API

6 keyless endpoints. One of them is the whole engine.

CoinMarketCap publishes, per swap and with no key, the maker address, the block, the log index, the side and both amounts. Order the prints, join on the maker: a middleman has to print, so the row order alone names it. No mempool view, no MEV labels — and none needed.

endpointused forkeycalls behind this page
/public-api/v1/dex/tokens/transactionsthe engine — ma, h, lgid, tp, a0, a1, tx, en, t0a, t1a per swapnone80
/public-api/v1/dex/token/poolspool address, venue, liqUsd — labels each (en, t0a, t1a) groupnone10
/public-api/v1/dex/security/detailextra.buyTax / extra.sellTax — a transfer tax is not a middlemannone10
/public-api/v4/dex/pairs/quotes/latest24h buy / sell counts — how much of a day the window coversnone8
/public-api/v4/dex/spot-pairs/latestthe hero rule — #1 pair by 24h transactions, per chainnone0
/public-api/v1/dex/platform/listexplorer URL templates for the transaction linksnone0
finding 1 · CORS
3 headers sent

A keyless 200 carries Allow-Headers, Allow-Methods and Max-Age — and not Access-Control-Allow-Origin. The browser discards a body it already has. Every web tool on /public-api needs a proxy; this one's is /api/swaps, which also puts every visitor behind one IP.

finding 2 · the throttle
p50 1.5 s · p95 16.4 s

One keyless page, 8 iterations: most took about a second and a half; one sat through a 15 s backoff because the anonymous tier reports its per-IP limit as HTTP 500 as often as 429, with no Retry-After. The tool backs off 15 / 30 / 60 s and exits 75 when the quota is spent.

finding 3 · the price field
26 of 400 rows

q equals a1 / a0 on 374 of 400 PEPE rows; on 22 Uniswap v4 rows and 4 Uniswap v3 rows it is rounded to two significant figures, or zero. Invisible in a chart, fatal in a basis-point comparison — so the engine never reads q; it divides a1 by a0 itself.

8 dated, evidenced findings for the CoinMarketCap team — and what is worth protecting — in FEEDBACK.md (opens in a new tab). Every endpoint the code calls is named above; tests/test_published_counts.py fails if one ever is not.

Run it before you score it

No key. No install. About ten seconds.

The judged capability is a stdlib-only script against the keyless surface. With no flags it asks CoinMarketCap's own ranking which Uniswap v2 pair is busiest, pulls that token's last 800 prints and names the middleman. The transcript is the bare command's own output, receipt kept.

middleman — keyless
$ git clone https://github.com/edycutjong/middleman.git && cd middleman
$ python3 scripts/middleman.py

middleman 0.1.0 — keyless, live

hero rule: the base token of the #1 Ethereum Uniswap v2 pair by 24h transactions at capture time
  → MOTO/WETH  0xbd965230588eaa536de6aa45e8ebbc01638535e0

MOTO · ethereum · 800 prints · 3.86 h · blocks 26006381–26007537 · captured 2026-09-18T23:00:20Z · keyless

  27.5% of Uniswap v2 / WETH volume is 1 wallet(s) buying back what they just sold (8 round-trips, same transaction)

  Uniswap v2 / WETH  771 prints · 755 organic · 8 · 1 wallet(s) · 27.5% · 39.2 / 60.8 bps  ◀ route
  Uniswap v2 / USDC  16 prints · 16 organic ·  · 70.4 / 137.8 bps
  Uniswap v2 / USDT  13 prints · 13 organic ·  · 71.1 / 135.2 bps

  ▶ route via Uniswap v2 / WETH · cap slippage at 0.65 %   (organic p90 60.8 bps)
wrote docs/proof/live_run.json  (11.3s wall clock, 0 credits — keyless)
22:12 UTC
80.0%
56 round-trips · 3 wallets · the day-1 spike · spike.json (opens in a new tab)
22:36 UTC
66.2%
29 round-trips · 3 wallets · the capture behind this page · moto.json (opens in a new tab)
23:00 UTC
27.5%
8 round-trips · 1 wallet · the bare command, 11.3 s · live_run.json (opens in a new tab)
00:28 UTC
0.0%
0 round-trips · every print organic · the bare command, 11.0 s · live_run_quiet.json (opens in a new tab)

4 windows on the same pair, one night. The wallets come and go; the ranking that put the pair at #1 does not — and a tool that can print zero on its own headline is the one whose non-zero you can believe. Also in the repository: 145 tests (139 offline, 6 live), 1,000 generated blocks with 0 violations of the join's own definition, the browser engine parity-tested against Python on every committed tape, and an engine that takes 3.3 ms per 800 prints (p95 3.7 ms, n=200).

Questions a judge will ask

Honest limits.

Is this page live?

The table is rendered from a committed run, captured 2026-09-18 22:36:19 UTC, and says so on every number. The paste box is live: it runs the same engine in the browser on rows fetched through a keyless proxy. The proxy shares one IP against a per-IP anonymous limit, so a 429 is shown as a 429 with the command to run instead — the CLI is the primary live path, and every reader has their own quota there.

How wide is the window?

The last 800 prints, not 24 hours — 3.6 h on the hero pair, 23 h on Mog. The span is on every row, and the receipt carries the window's share of the pool's 24 h transactions (16% here).

Is a round-trip a verdict on a person?

No. It is a shape: same wallet, same block, opposite sides, size within 5 %. The page prints the rows and the definition, never a label on a person. A router contract can appear as one maker for many users; the number is "the same address on both sides", exactly as the API reports it, and nothing more is claimed.

Why does p90 sit near 60.9 bps on the routed pool?

Quote-to-fill is a realised, fee-inclusive print-to-print move: on a 0.30 % pool two consecutive opposite-side prints straddle the fee twice, so p90 lands near 60 bps on every busy v2 pool. It is used comparatively, across the pools of one token in one window, where that bias is shared — which is also why the rule prefers the 0.05 % tiers when they are deep enough.

Why is a pool marked ×2 or ×3?

The feed carries no pool address, so pools are recovered from (venue, base, quote). Uniswap v3 fee tiers of one pair share that key and merge; a row marked ×n is n pools, and its number is per pair, not per tier. Filed as a finding in FEEDBACK.md.

What is not built?

No prediction, no wallet labelling, no composite score, no alerts, no watchlists, no key. The product names the middleman and says where to route; that verb is the whole scope. When no pool clears the routing floor the rule is printed, never widened.

A middleman has to print

Name the middleman on a token you care about.