For judges

Everything on one page. No setup, no key, no account, no cookies. Built on the CoinMarketCap API for the Build with CMC: API Hackathon — Markets and Trading Tools.

The claim

A DEX trader sees a quote and a fill and cannot tell what stood between them. Middleman orders a token's real prints by block and log index, joins them on the maker address, and names it: the wallet on both sides of a block, or the pool itself. Then it says where to route and what slippage cap to set.

The 30-second path

  1. Read the headline on the front page. 66.2 % of Uniswap v2 / WETH volume is 3 wallets buying back what they just sold, in the same transaction. CoinMarketCap ranks that pair #1 on Uniswap v2 by transactions; the join shows why.
  2. Open the raw rows. Two orange rows: same maker, same block, same transaction hash, opposite sides, size within 5 %. Divide a1 by a0 and you have the price each leg paid — the panel does the arithmetic inline, the JSON is verbatim from the API.
  3. Open /evidence. Every request behind the page — URL, HTTP status, UTC, sha256 of the body, the envelope's credit_count (1 per keyless call, against no account — 0 charged). 108 calls across 10 tokens.
  4. Paste any token into the box on the front page. The browser runs the same engine on rows fetched live through a keyless proxy. Or run it from a clone — the command is below and takes about ten seconds.

Receipt — the capture behind the page, 2026-09-18 22:36:19 UTC

wall clock8.56 s — 8 keyless pages of 100 prints + 3 labelling calls, no backoff fired
prints800 — MOTO on Ethereum, chosen by rule: the base token of the #1 uniswap-v2 pair on ethereum by 24h transactions at capture time
API calls11, every one HTTP 200
credits used0 — keyless /public-api; no key exists to charge
credentialsnone — every CoinMarketCap environment variable explicitly unset (none — CoinMarketCap keyless /public-api surface)
round-trips29 · 3 wallets · 66.2 % of the pool's volume ($127,254 of $192,275), all inside one transaction
sandwiches0 on this pair · 2 in 8,000 prints across the 10-token census, both by one wallet
quote-to-fillorganic 15.5 bps median, p90 60.9 — the raw tape says 55.3
routeUniswap v2 / WETH · cap slippage at 0.65 % (organic p90 60.9 bps)
tests145 tests (139 offline, 6 live) · property-based: 1,000 generated blocks, 0 violations · JS ↔ Python parity on every committed tape · the proxy's boundary pinned by test
engine latencyp50 3.3 ms per 800 prints (p95 3.7 ms, n=200)
live fetch latencyp50 1.5 s per page (p95 16.4 s, n=8 — one iteration sat through the throttle backoff)
raw receiptsmoto.json · census.json · live_run.json · live_run_quiet.json · bench_live.json · bench_replay.json

The same command 24 minutes later measured 27.5 % — the wallets had gone quiet; an hour and a half after that the window was clean; two days later the rule picked a different pair and the join found 17 sandwiches in one window. A number that moves with the market is the proof it is measured, not asserted. All four transcripts are in DEMO.md.

Reproduce — the real path

git clone https://github.com/edycutjong/middleman.git && cd middleman
python3 scripts/middleman.py                                   # the hero by rule, live, keyless, ~10 s
python3 scripts/middleman.py --address 0xbd965230588eaa536de6aa45e8ebbc01638535e0 --symbol MOTO --pages 8 --json today.json
python3 scripts/verify_tape.py                                 # every receipt vs its tape, offline
make test                                                      # 139 offline tests
make test-live                                                 # 6 tests against the real contract

CI / deterministic replay — not the product: make bench times the engine over data/tape_moto.json, a recording made by scripts/seed.py. Nothing on the judged path reads a tape; scripts/middleman.py always fetches live and has no offline flag. If CoinMarketCap's anonymous tier is throttling your IP the run says so and backs off; an exhausted quota exits 75 with the way through.

Honest limitations

Links

run itDEMO.md — four real transcripts with receipts
how it worksARCHITECTURE.md — derived from the code · docs/METHOD.md — the definitions
API feedback for CMCFEEDBACK.md — eight dated, evidenced findings
the enginemiddleman/ — six stdlib modules · scripts/middleman.py — the door
the teststests/ — 145 tests, each regression named for the defect it pins
live pagemiddleman.edycu.dev · /evidence · /api/health
repositorygithub.com/edycutjong/middleman · MIT
eventBuild with CMC: API Hackathon — Markets and Trading Tools · @edycutjong

This page is rendered from the committed receipts by scripts/render_site.py and mirrors JUDGE.md in the repository. No number on it was typed by hand; make check fails if it drifts.