route99 benchmethod

How the data is collected.

Everything on the bench comes from the collector at workers/latency-bench in the route99 tree. This page is generated from that code: every number, address and provider row below is read out of the collector's source, and the test suite fails if this page and the code ever disagree. What you read here is what runs.

1 · The edge series

A Cloudflare Worker cron fires every 30 min. Each firing serves one tick group of providers (the panel is split so a run stays inside the platform's per-invocation subrequest budget): each configured group is probed once per rotation, one timed quote request per (provider × chain). Before the timed probes, each provider's hosts get one untimed warm-up request, so a sample measures the service rather than TLS setup. The worker's own location is not pinned; every run records the Cloudflare colo it measured from, and requests carry Mozilla/5.0 (compatible; route99-latency-bench/1.0; +https://route99.xyz) with Referer: https://route99.xyz.

2 · The canonical probe

One trade per chain, wrapped native → the chain's dominant USD stable, ~$1–2k notional — big enough for real routing, small enough to be polite. The taker 0x1111111111111111111111111111111111111111 never holds or receives anything: quotes are priced and simulated, never executed.

chainidsell (wrapped native)buy (stable)amount
Ethereum10xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc20xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB480.5
BSC560xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d1
Base84530x42000000000000000000000000000000000000060x833589fCD6eDb6E08f4c7C32D4f71b54bdA029130.5
Polygon1370x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf12700x3c499c542cEF5E3811e1192ce70d8cC03d5c3359500
HyperEVM9990x55555555555555555555555555555555555555550xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb25
Arbitrum421610x82aF49447D8a07e3bd95BD0d56f35241523fBab10xaf88d065e77c8cC2239327C5EDb3A432268e58310.5

HyperEVM buys USD₺0 — the chain has no canonical USDC. A measured swap-mix draft (workers/latency-bench/mix.draft.json) exists to widen this matrix by pair class and size once per-swap distributions land.

3 · The panel

providertickchainsauth (Worker secrets)simulationgap
Nordstern1eth bsc base pol hyp arbnonefrom the quote300 ms
0x2eth bsc base pol hyp arbKEY_0Xfrom the quote300 ms
1inch2eth bsc base pol arbKEY_1INCHfrom the quote1100 ms
Enso3eth bsc base pol hyp arbKEY_ENSOfrom the quote300 ms
Bebop3eth bsc base pol hyp arbKEY_BEBOP + BEBOP_SOURCEfrom the quote300 ms
Bitget2eth bsc base pol arbBITGET_KEY + BITGET_SECRET + BITGET_PARTNER300 ms
Eisen3eth bsc base hyp arbKEY_EISENfrom the quote300 ms
Fly3eth bsc base pol arbKEY_FLY300 ms
KyberSwap0eth bsc base pol hyp arbnonevia one untimed build call2200 ms
LiFi1eth bsc base pol arbnonefrom the quote300 ms
OogaBooga2hypKEY_OOGABOOGA300 ms
OpenOcean0eth bsc base pol hyp arbnone300 ms
SushiSwap0eth bsc base pol arbnonefrom the quote300 ms
Velora1eth bsc base pol arbnonevia one untimed build call1100 ms

Providers whose secrets are not set are recorded as skipped in every run of their tick — a stated absence, never a silent hole or a fake failure. No public quote API at all: Barter. The rotation covers only ticks that have a configured provider, so setting a secret activates its tick with no deploy.

4 · Simulation (re-validation)

Where a quote carries executable calldata, the sample is re-validated through Nordstern's swap-simulation API: an eth_call with state overrides plants a proxy at the taker, funds and approves it synthetically, executes the exact quoted calldata against the latest block, and reports success, the real output delta and gas. The sim call is never timed into ms. Stored per sample: the quoted amount q and sim (ok / revert with reason / error).

5 · The twelve datacenters (geo sweep)

Every fourth edge slot is borrowed for a sweep from twelve deliberately picked AWS datacenters, each running our own probe endpoint — one Lambda function deployed identically to every region (workers/latency-bench/lambda/), gated by a shared token. DNS resolves locally at each endpoint, which is how a real integrator in that region experiences a DNS-geo-routed provider. The sweep is transport only (dns / tcp / tls / ttfb per region, cumulative ms from request start, one Base quote per provider; each invocation is a cold-ish environment, so dns includes the resolver's cold path — consistently across regions) and covers keyless providers only: not for trust — the fleet is ours — but because per-key rate limits make twelve concurrent same-key requests a violation, where twelve IPs sending one keyless request each is not. Currently that panel is Nordstern, KyberSwap, LiFi, OpenOcean, SushiSwap, Velora. Unlike the Worker vantage, Lambda egress keeps cf-ray intact, so Cloudflare-fronted providers are attributable per cell here.

datacenterregionendpoint
Virginiaus-east-1our Lambda endpoint (function URL)
Frankfurteu-central-1our Lambda endpoint (function URL)
Londoneu-west-2our Lambda endpoint (function URL)
Tokyoap-northeast-1our Lambda endpoint (function URL)
Singaporeap-southeast-1our Lambda endpoint (function URL)
Hong Kongap-east-1our Lambda endpoint (function URL)
Seoulap-northeast-2our Lambda endpoint (function URL)
Mumbaiap-south-1our Lambda endpoint (function URL)
Dubaime-central-1our Lambda endpoint (API Gateway front — the region lacks function URLs)
São Paulosa-east-1our Lambda endpoint (function URL)
Sydneyap-southeast-2our Lambda endpoint (function URL)
Cape Townaf-south-1our Lambda endpoint (function URL)

6 · Storage, health, and honesty rules

The sync guarantee. This page is rendered by bench/gen-method.mjs from the collector's exported configuration, probe table, panel registry and region list. npm test re-renders it and fails on any byte of drift. If you are reading a number here, the collector is running with it.