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.
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.
| wall clock | 8.56 s — 8 keyless pages of 100 prints + 3 labelling calls, no backoff fired |
| prints | 800 — MOTO on Ethereum, chosen by rule: the base token of the #1 uniswap-v2 pair on ethereum by 24h transactions at capture time |
| API calls | 11, every one HTTP 200 |
| credits used | 0 — keyless /public-api; no key exists to charge |
| credentials | none — every CoinMarketCap environment variable explicitly unset (none — CoinMarketCap keyless /public-api surface) |
| round-trips | 29 · 3 wallets · 66.2 % of the pool's volume ($127,254 of $192,275), all inside one transaction |
| sandwiches | 0 on this pair · 2 in 8,000 prints across the 10-token census, both by one wallet |
| quote-to-fill | organic 15.5 bps median, p90 60.9 — the raw tape says 55.3 |
| route | Uniswap v2 / WETH · cap slippage at 0.65 % (organic p90 60.9 bps) |
| tests | 145 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 latency | p50 3.3 ms per 800 prints (p95 3.7 ms, n=200) |
| live fetch latency | p50 1.5 s per page (p95 16.4 s, n=8 — one iteration sat through the throttle backoff) |
| raw receipts | moto.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.
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.
| run it | DEMO.md — four real transcripts with receipts |
| how it works | ARCHITECTURE.md — derived from the code · docs/METHOD.md — the definitions |
| API feedback for CMC | FEEDBACK.md — eight dated, evidenced findings |
| the engine | middleman/ — six stdlib modules · scripts/middleman.py — the door |
| the tests | tests/ — 145 tests, each regression named for the defect it pins |
| live page | middleman.edycu.dev · /evidence · /api/health |
| repository | github.com/edycutjong/middleman · MIT |
| event | Build 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.