route99.xyzroute
← Back to the rankings
CANONICAL SPEC · SIX RULES · DATA: ENSO SHIELD, 18 JUL 2026

The rule book.

This is the canonical spec route99 runs on: the code implements these rules, step by step. Every number on the rankings page is produced by the six rules below, in this order. Read it top to bottom and you can reconstruct any figure by hand.

Two kinds of input go in: measured facts, produced by Enso Shield and never altered by us, and your setup (the controls you set). Everything else on the page is derived from these six rules. DFC Research re-grades and re-plots; it does not change a measured value. Standing assumption: integrations quote several aggregators per swap and take the best result, so every grade treats an aggregator as one member of that set. That is why no-quote weighs less as your set grows (why multi-aggregator ↗).

Measured factsEnso Shield · never altered + Your setupchain · simulate · budget · volume · pricing · route Six rulesapplied identically to every aggregator Every number herescore · gauge · charts
01

Inputs & provenance

PROVENANCE

Each aggregator carries six measured figures from Enso Shield's 7-day window (retrieved 18 Jul 2026), collected by quoting every aggregator on the identical swap and re-simulating against live chain state:

  • No-quote rate: share of requests that return no quote at all.
  • Sim-failure / revert rate: share whose quote fails simulation (or, with Simulate off, reverts on-chain).
  • Median and p95 latency: typical and tail response time, in ms.
  • Overquote rate and quote→fill drift: how often, and how far, the delivered price undershoots the quote (bps). The gap used throughout this page is Shield's immediate, same-block re-simulation — the first of the five points Shield measures (t=0, then +12s, +24s, +36s, +48s). It is therefore drift at zero elapsed time, the most conservative of the five, and the reason Rule 2 models a separate survival term for real execution delay rather than reusing this number as-is. Pinned-block figures are not used.
  • Underquote rate is carried in the dataset and deliberately not scored: a fill better than quoted costs the integration nothing, so grading it would punish a provider for quoting conservatively.

Coverage and API pricing come from each provider's own docs, linked in every row. Your setup is the rest: chain, Simulate on/off, latency budget, monthly volume, the Standard/Negotiated pricing lens, and the route you select. Rule: measured facts are never changed, only re-graded for your setup.

02

The reliability gauge

PROBABILITY

The headline % is the chance your route (the set of aggregators you selected) returns at least k usable quotes on a request. An aggregator is usable when it returns a quote, arrives inside your latency budget, when Simulate is on survives simulation, and survives its own overquote drift.

// per-aggregator usable probability avail = 1 - qerr/100 // returned a quote inTime = Φ( (ln B - μ) / σ ) // B = latency budget p95 = max(p95, med × 1.02) // guard: see below μ = ln(med), σ = max((ln(p95) - μ)/1.645, 0.05) arrive = avail (no budget set) = avail × inTime (budget B set) oqCost = (oq/100) × max(0, gap) // same quantity as Rule 3 oqSurv = max( 1/(1 + oqCost/(Simulate? 8 : 2)), 1 - oq/100 ) // floored: see below u_i = arrive × (1 - sim/100) × oqSurv // Simulate ON = arrive × oqSurv // Simulate OFF

With Simulate on, aggregators are treated as independent and the route's reliability is the exact probability of ≥ k usable quotes across them (a Poisson-binomial sum). k = 2 for “Optimize for price” (you need two quotes to compare); k = 1 otherwise.

// Simulate OFF: you route by best price, so the winner's revert // and overquote-drift risk are uncorrelated with which // aggregator wins: use the honest average of each reliability = ( 1 - ∏(1 - arrive_i) ) × ( 1 - avg(sim)/100 ) × avg(oqSurv)

The target is 99.9% (0.1% failure). An aggregator's “green” band for redundancy-covered failures is the per-aggregator rate at which N independent aggregators still clear 99.9% — which depends on both N and k, capped at 10%, beyond which correlated failures dominate. At k=1 that is the closed form 0.001^(1/N); at k≥2 there is no closed form, so the band is solved numerically against the same Poisson-binomial above.

green band, max per-aggregator failure % // solved for P(≥k) ≥ 99.9% N=2 k=1 3.16% k=2 0.05% N=3 k=1 10.00% k=2 1.84% N=4 k=1 10.00%* k=2 6.40% * uncapped 17.78% N=5 k=1 10.00%* k=2 10.00%* * uncapped 25.12% / 12.20%

Why k has to be in this band. A single number for both goals was wrong by more than a rounding step. Under Optimize for price the route needs two usable quotes, not one, and at its default N=3 the k=1 band (10%) is 5.4× more lenient than the k=2 truth (1.84%) — it painted green on aggregators this profile's own arithmetic disqualifies. The gauge always used the correct k; only the colour bands and this caption did not, and they now do.

A consequence worth knowing. With Simulate on, adding an aggregator can never lower route reliability: a weak aggregator simply contributes fewer usable quotes, and the P(≥k) sum is monotone. With Simulate off, it can: the route inherits the average revert rate and average overquote-drift risk of the set, so one high-revert or heavy-overquote aggregator drags the expectation down for every swap it wins on price. The gauge names the offending aggregator when this happens. This asymmetry is the quantitative case for simulation.

Coverage is part of reliability, not a separate topic. The gauge models N aggregators quoting in parallel on every request, which is only true where all N are live. On the pooled All chains view they often are not: Barter is measured on Ethereum alone while claiming 8 chains, OogaBooga on HyperEVM alone. A route can therefore show 99.92% pooled and realise 91.2% on a chain where two of its four members do not exist — and with fewer than k members present, price cannot be compared there at all. So per-chain reliability is recomputed from each chain's own measured rows, restricted to the route members present, and on All chains the headline is that realised floor — the weakest chain the route serves — with the full per-chain breakdown on hover over the number. The pooled average appears in “How it’s computed” whenever the two differ. Coverage also enters assembly, in two bounded ways. Auto-pick guarantees a feasibility floor: every chain the route serves must have at least k members live on it, because below that price cannot be compared there at all and P(≥k) is exactly zero rather than merely low. Short chains are topped up with the highest-scoring eligible aggregator measured there, never one that would break the goal's own filter. And coverage breaks near-ties: where two aggregators sit within 0.15 points, the one measured on more chains wins, since on the pooled view an absent member contributes nothing. Coverage never licenses breaking a goal's own filter: where a goal's eligible pool genuinely cannot reach a chain within the 5-member cap, the route stays as it is and the headline shows the shortfall honestly — only five aggregators are measured on all six chains, so this binds exactly where the field is thinnest.

Two guards on the latency fit, both load-bearing. The σ floor of 0.05 stops a degenerate p95 ≈ med from collapsing the distribution to a point mass; on current data the smallest real σ is 0.139, so it never binds — it is a guard against future rows, not an active adjustment. The p95 = max(p95, med × 1.02) guard handles the arithmetically impossible case of a reported p95 at or below the median (rounding, or a thin sample), which would otherwise give a negative or zero σ and an inTime of 0 or 1 with no middle. Both are stated here because a reader reconstructing inTime by hand from the two published quantiles would otherwise not reproduce our number.

A two-point fit has no slack in it. A log-normal has two free parameters, and this page has exactly two published quantiles — median and p95 — to fit them from. That pins the curve with zero degrees of freedom: there is no third point to check the shape against, so a real latency distribution with a heavier tail than log-normal (a slow RPC, a congested block) will read as more "in time" at your budget than it actually is, especially past p95 where the fit is pure extrapolation, not data. This is a property of fitting any two-parameter curve to two quantiles, not a bug in this implementation, and it is the reason the guard above exists rather than a shape check: with only two points there is nothing left to check the shape against. Treat inTime as the best estimate the published data supports, most reliable near the median and least reliable in the tail your budget actually depends on.

What the sim-failure input actually is. Enso Shield measures failure of an immediate re-simulation against the latest block, with RPC-error simulations excluded. That is not the same event as a revert after your own execution delay — wallet confirmation, gas movement, settlement windows and mempool exposure all sit between a quote and a landed trade. With Simulate on the distinction barely matters, because the check happens pre-trade either way. With Simulate off this page uses that number as a modelled proxy for revert risk, and the oqSurv term above exists precisely because the proxy is known to understate delayed execution. Read the sim-off gauge as the best available estimate, not as a measured revert rate.

Why overquote is now part of usable. A slippage tolerance is normally sized off the quoted output, not the true one. An inflated quote eats into that cushion before any real market movement happens, so the same drift that costs score points also raises the odds the trade reverts instead of executing — this is exactly the mechanism Enso Shield's own quote-decay research describes. It matters more than a same-block check suggests: Shield's benchmark quotes and simulates essentially instantly (same block), but real routes often don't execute that fast — a wallet-confirmation click or a bridge settlement window can run well past the seconds-scale delay where Shield's own data shows overquote gaps continuing to widen. So the measured sim rate is closest to revert risk at zero elapsed time, not at realistic execution time, and oqSurv is this app's stand-in for that gap: it starts from the same oqCost priced in Rule 3, gated gentler under Simulate (a pre-commit check catches most drift before it's acted on) and steeper without it (the quote is committed, cushion and all). Unlike the score weight in Rule 3, this term is not gated by profile: reliability is a physical estimate of what actually happens, not a preference, so it applies the same way under every goal.

The floor, and why this is not the same number as the score's overquote grade. A quote that was never inflated cannot fail because it was inflated, so at most oq% of an aggregator's quotes can be lost this way: oqSurv is floored at 1 - oq/100. That bound is what separates the two uses of oqCost. This one is a probability and has to stay physically plausible; the Rule 3 grade is a preference scale, free to be as steep as it needs to be to rank aggregators apart. For a while both read off one shared number, which sounded tidy but forced one of them to be wrong: a grade steep enough to separate the field implied more quotes failing than were ever overquoted, and a probability gentle enough to be plausible left the grade unable to punish anything. They now share the input and calibrate separately.

03

The 0–10 score

GRADING

Each aggregator is graded on six criteria in three pairs: reliability (no-quote, sim-failure), price (all-in cost, overquote), latency (median, p95). Every criterion yields a points-kept fraction gc in [0,1]; the score is their weighted average, times ten.

score = Σ(gc_i × w_i) / Σ(w_i) × 10 lost_i = (1 - gc_i) × w_i / Σ(w_i) × 10 // what tooltips show

The reliability pair grades on a raw scale, then passes through a difficulty curve so perfection stays at 10 but small imperfections still cost real points:

No-quote g = 1 - min(1, qerr/85) // 85% -> 0 Sim-failure g = 1 - min(1, sim / (Simulate? 30 : 15)) gc = 1 - sqrt(1 - g) // difficulty curve

Why 85% and 30/15%, not a round 100%. These zero-points aren't the value that "should" mean total failure — they're calibrated with roughly the same headroom above the worst aggregator Enso Shield currently measures that Cost's own zero-point already carries (38 bps against a 27.06 bps worst case, 1.40×). Applied here: the worst measured no-quote rate is 59.52% and the worst sim-failure is 20.84%, so 85% and 30% give each about that same margin (1.43× and 1.44×). Sim-off stays deliberately twice as strict as sim-on, because an uncaught failure reverts on-chain rather than being caught pre-trade. An earlier calibration used 10% and 10/5%, tight enough that an aggregator with 95% real-world availability graded as if it barely worked at all. A single extreme outlier (an aggregator failing outright, most of the time) still lands near the bottom; an aggregator that's merely imperfect no longer reads as broken.

Calibrated against per-chain rows, not the all-chain aggregate. This is the correction that produced the numbers above, and it is worth stating plainly because the previous ones were justified against the wrong population. The constants used to be sized on the all-chain view (~42% no-quote, ~13% sim-failure), but grading runs on per-chain rows, where the real worst cases are 59.52% (Eisen on BSC) and 20.84% (Velora on Base). That left 1.008× and 0.96× headroom instead of 1.4× — and 0.96× means the scale had run out: Velora on Base graded exactly 0.000 on sim-failure, so the criterion could no longer tell 21% apart from 45%. A zero-point a live row can reach is not a zero-point. The rule is now that every constant is sized against the worst value any gradeable row can take, and the check is re-run against per-chain data on each refresh.

The latency pair is graded two ways, because setting a budget changes the question. Every goal but Low latency measures against a 1,200 ms budget by default (Low latency uses a stricter 400 ms); Off is the deliberate opt-out, for reading raw speed with no deadline attached.

Budget set — the default: two questions, both graded. A deadline adds a compliance question without removing the speed question, because 400 ms can clear a 400 ms budget and still feel slow. So a budget re-aims the pair instead of replacing half of it:

in-time = Φ( (ln B - μ) / σ ) // same fit as Rule 2 gc(compliance) = in-time // 98% inside budget -> 9.8 gc(speed) = anchored curve on the median, L = 800 ms // budget-independent: fast is fast

The tail is never dropped: p95 is what sets σ, so a heavy tail directly lowers the in-time share. In the weights table below, Median and p95 are the primary and secondary latency criteria; with a budget set they read as compliance and speed.

Off — “how fast is it?”, no deadline. Graded on an anchored scale instead. L is the half-credit point (800 ms typical, 2,200 ms tail). Below L each halving earns a point; above L each extra L/2 costs one.

points = 5 + log2(L / t) if t <= L // 400->6 . 50->9 = 5 - (t - L) / (L/2) if t > L // 1200->4 . 2800->0 gc = clamp(points, 0, 10) / 10

Why a budget is the default, and why 1,200 ms. On this field the anchored scale has an unreachable top: a category grade of 8.0 needs roughly a 100 ms median and a 275 ms p95, and 9.0 needs 50 ms/137 ms. Nothing measured here is that fast, so the whole 15-aggregator field lands in 3.4–8.0 with the top two points of the scale dead — and since green starts at 8.0, only the single fastest aggregator ever cleared it, rendering the second-fastest in the field amber. That reads as “this aggregator is mediocre at latency,” which is false. Re-weighting cannot repair it: the median and p95 grades are collinear on this data, so however the pair is weighted the latency category moves by at most ~0.13 points. A budget is the only lever with real separation in it. 1,200 ms rather than 800 because at 800 the curve cliffs just past the anchor — a 1,025 ms and a 1,133 ms aggregator both collapse to 2.4, overstating the difference between 800 ms and 1,000 ms — where 1,200 grades them 6.6 and 5.1: clearly worse, not annihilated. And not 400 ms everywhere, because 400 is genuinely selective (a 576 ms median falls to 2.8): right for the goal whose job is finding fast aggregators, wrong as a global default.

Why two modes at all. A budget is a deadline, not a ratio. The anchored curve grades ratios of milliseconds and is deliberately gentle, which caps how far apart two aggregators can land: 93 ms and 628 ms are 2.75 doublings apart, so no one-point-per-doubling curve can separate them by more than 2.75 points, whatever the anchor. Against a 400 ms deadline that is the wrong answer, because the first aggregator beats it on 98% of quotes and the second on 7%. Grading compliance by the in-time share puts the steepness exactly at the deadline, where the decision turns, while the speed criterion keeps rewarding genuinely fast aggregators inside it.

Why the anchored scale is anchored, not zero-based. The difficulty curve assumes perfection is attainable: 0% reverts is, and several aggregators reach it. A 0 ms quote is not. Grading latency from zero crushed the whole field, so the scale anchors at a realistic half-credit point instead, keeping a reachable top end while staying strict about real slowness. One consequence is visible in the colour: because that scale's 10 is unreachable, the latency column bands against the achievable range when the budget is Off (green from 7.5, amber from 5) rather than the 8.0/5.5 cut every other column uses. With a budget set the scale is reachable and the ordinary cut applies.

The two price criteria carry their own reciprocal gc (no square-root curve), so cost is never double-penalised. Fees come from the cost model (Rule 4); overquote is costed as expected loss from inflated quotes. Overquote is weighted only under Optimize for price — every other profile carries it at w=0, so an aggregator that overquotes isn't scored down by a goal that isn't price. The criterion is still computed and shown in every breakdown; outside price it just costs zero score points (rendered as “–”, not “0”). The reliability gauge (Rule 2) starts from the same oqCost but calibrates it separately, as a bounded probability rather than a preference scale; that half is also not profile-gated, since reliability estimates what happens rather than what you prefer.

Why overquote's divisor is so much smaller than cost's. The two look like the same kind of number and are not. All-in cost is a realized bps figure. oqCost is an expected one: a frequency multiplied by a magnitude, which collapses toward zero even when both inputs are alarming. Grading an expected cost on a realized-cost scale was a real defect, not a matter of taste: with a divisor of 8 the curve emptied out around 152 bps, so the criterion Optimize for price advertises as one of its two leading concerns could not move a ranking — the field's worst overquoter gave up half a point out of ten, and seven of thirteen aggregators lost nothing at all. The divisor is sized on per-chain rows for the same reason the reliability pair is: the worst measured oqCost is 10.03 bps (Odos on Ethereum, 63.4% of quotes inflated), not the 2.09 bps of the all-chain view. A divisor of 0.5 empties the curve at 9.5 bps — below that worst case, leaving the field's heaviest overquoter past the end of the scale. At 0.75 it empties near 14.25 bps: 1.42× headroom, matching Cost's 1.40× and the reliability pair's 1.43×.

drift = max(0, gap) allIn = drift + min(fee_bps, 60) Cost gc = 1 / (1 + allIn/2) // 0->1.00 . 2->0.50 . 10->0.17 oqCost = (oq/100) × max(0, gap) Overquote gc = 1 / (1 + oqCost/(Simulate? 0.75 : 0.1875))
The difficulty curve

reliability pair · gc = 1 − √(1 − g)

00.51.00%50%100% cleanlinear (no curve)75% clean → half points
The cost curve

points kept vs all-in cost · gc = 1 / (1 + bps/2)

00.51.001020 bps2 bps → half points10 bps → 0.17
The latency curve

budget = Off only · log below L, linear above

05100800 (L)2800 ms100 ms → 8L → 5 (half credit)

The active profile sets the weights. The leading pair is emphasised; everything else stays at 1 — except overquote, which is 0 everywhere except Optimize for price:

ProfileNo-quoteSim-failCostOverquoteMedianp95
Balanced111011
Optimize for price113211
Low revert rate131011
Low latency111032

Overquote only scores under Optimize for price. Elsewhere its weight is 0: the criterion is still computed and its bps cost still shows in every score breakdown, but it keeps zero points from every other goal's ranking. Low revert rate and Low latency already say as much in their own descriptions above (simulation re-prices overquotes; overquoters are allowed); this is that same intent enforced in the weights, not just the copy.

The scales are absolute, not relative to the field. Every cap, divisor and anchor above is a fixed constant. The worst value in the measured field is used only as a sanity check when choosing a constant, never as an input while grading: nothing here is a percentile, a rank, or a curve fitted to the current dataset. Two consequences worth being explicit about. A score means the same thing across weekly refreshes, so an aggregator improving its own numbers moves its own score and nobody else's. And removing an aggregator, even the worst one on a criterion, leaves every other score bit-identical: drop the field's heaviest overquoter and no remaining grade shifts by so much as a rounding step. The alternative, grading on a curve against the current field, would mean an aggregator's score changed when a competitor changed, and week-to-week comparisons would be meaningless.

The radar chart deliberately does not use these curves. It plots the raw measured dimensions on plain linear axes, sharing this rule's endpoints (no-quote empties at 85%, sim-failure at 30%) but none of its transfer functions. That is on purpose: the curves above are each shaped differently on purpose (square-root for reliability, reciprocal for price, anchored log for latency) because each encodes its own judgment about what counts as bad, which is right for collapsing six things into one number and wrong for a shape you read axis-against-axis. The radar also splits overquote into rate and magnitude across two axes where the score multiplies them into one oqCost, and blends median with p95 where the score keeps them apart. Use the radar to compare an aggregator's shape, the table to compare its score. One thing the radar does borrow: its radius is the square root of each value, so the area a polygon encloses is proportional to the value rather than to its square. Plotting radius directly would overstate every comparison, since area is what the eye actually measures.

Redundancy fade: with more than one aggregator in the route, No-quote weight halves (×0.5) on every profile except Balanced: a missing quote from one aggregator is simply covered by another. Simple view rolls the six into three categories: Reliability = no-quote + sim-failure, Cost = all-in cost + overquote, Latency = median + p95, each the weighted average × 10 of its members.

04

The cost model

PRICING

API cost is expressed as bps at your monthly volume, from each provider's published plan: a floor, a ceiling, and (where offered) a subscription or custom/enterprise tier.

V = your volume (or $1M/mo default) t = clamp( (log10(V) - 5) / 2, 0, 1 ) // $100k -> ceiling ... $10M+ -> floor free = bpsTyp // if a typical rate is published = bpsMax + (bpsMin - bpsMax)×t // else interpolate across volume eff = free = min(free, bpsMin + subMax/V×1e4) // if a paid plan is cheaper

Standard vs Negotiated. In Standard you see the published/free-tier fee at your volume. In Negotiated, a provider that publishes a paid plan is priced at its amortised rate — bpsMin + subMax/V×1e4, the formula already above — because that is what the plan costs per swap at your volume, and it is arithmetic rather than assumption. Only a provider advertising a custom/enterprise tier with no published rate at all is shown as 0 bps under Negotiated, since there is no number to compute instead. That 0 is contingent, so those scores carry a ! whose tooltip names what it takes. Genuinely-free APIs are already 0 with no marker.

The same assumption, reached from Standard. A provider with no published low end (no subMax plan to amortise) is still interpolated toward its disclosed range's bottom as volume rises, because that is what the range is for. But nothing published confirms that low end is reachable without negotiating — it is the same unconfirmed floor Negotiated shows explicitly at 0, just reached gradually instead of in one step. So the ! is not gated to the Negotiated lens: any score resting below that provider's published ceiling (bpsMax, the ordinary Standard-tier number) carries it, in either lens. Only the ceiling itself, and rates from providers with a real amortisable plan, are unflagged.

Why the lens no longer zeroes paid plans, and no longer engages itself. Pricing every negotiable provider at 0 bps threw away a number this model already computes, and it made a provider publishing a $799/mo plan score identically to one publishing nothing — the lens penalised disclosure. It was also the largest single ranking lever here: at $10M/mo it moved one aggregator seven places on a 2.94-point swing, entirely on an assumption. Worse, picking a volume above $1M used to flip the lens on automatically, so a user who only chose a volume was shown contingent rates they never opted into. Volume now sets volume. Negotiated is a deliberate click, and it now changes the fewest numbers it honestly can.

A hidden rate is not a zero — but a missing fee is. Two situations look alike and are not. If a provider charges a fee whose rate it does not publish, that silence conceals a real number, and scoring it as free would make "tell nobody your prices" the most profitable thing a provider could do here: those are scored at the worst published effective rate in the field at your volume, flagged in the breakdown. If instead no fee exists to find — nothing in the docs, no fee field, fee recipient or fee line in returned quotes — that absence is itself weak evidence, and it points at 0. Those are read as 0 bps and marked “unverified”. Imputing a punitive rate there would publish a number we have positive reason to believe is false, about a named team; the flag carries the doubt instead of the score. An affirmative "we charge nothing" is a third thing again — a disclosure — and counts as published. Inside the score, fees are capped at 60 bps for the curve, and overquote is costed separately (Rule 3). If a rate here is wrong, telling us is the fix.

05

Auto-pick & profiles

ASSEMBLY

Choosing a profile sets the weights (Rule 3), a reliability target k, a starting set size, and default controls, then assembles your route. Ranking uses the same profile-weighted score the table sorts on, evaluated at the size the route will actually be, so the checked aggregators are the top rows of the pool this goal is drawing from (no “why isn't #2 selected?”). One thing legitimately moves a checked row away from the top of the visible table, and it is deliberate: the target walk, which stops as soon as 99.9% is cleared and so may not reach a row that scores well but adds nothing. No goal applies a hard eligibility gate. Optimize for price used to drop anything with |drift| above 0.1 bps, and that was wrong twice over: fill drift is already inside all-in cost (drift + API fees on one bps scale, weighted ×3 here) and inside overquote (×2), so gating on it counted the same defect a third time — and because the test was on absolute drift it also excluded aggregators that underquote, i.e. fill better than they quote, contradicting Rule 1's promise that conservative quoting is never punished. The visible symptom was an aggregator showing the field's second-highest score and the word FILTERED in the same row. Drift is now priced, never gated: it costs score points in proportion to its size, and an aggregator that drifts badly ranks last on its own. What is not deliberate, and has been fixed, is ranking that depended on what was selected before the pick: the no-quote weight halves at more than one aggregator, so scoring during assembly used to read the previous route's size. Scoring now takes the candidate size explicitly and the target walk iterates to a fixed point, so assembly and the table are always scored in one context. The target only decides how many to add: walk down the ranked list, adding aggregators until the route clears 99.9%, or the next aggregator is too weak to move it.

BalancedEqual weight across the other five criteria; overquote scores 0 here.k=1 · starts at 2 · simulate on · 1,200 ms budget
Optimize for priceCost ×3 and overquote ×2 lead, the only profile that scores overquote. Drift is priced through both, never gated.k=2 · starts at 3 · simulate on · 1,200 ms budget
Low revert rateSim-failure ×3 leads: cleanest execution first.k=1 · starts at 2 · simulate on · 1,200 ms budget
Low latencyMedian ×3 and p95 ×2 lead: fastest quotes first, at a deliberately stricter deadline.k=1 · starts at 1 · 400 ms budget

The two stopping conditions. Walking the ranked list, the loop also stops adding when the next aggregator's own usable probability is under 3% (it cannot meaningfully move P(≥k), so adding it is integration work for nothing), and the route is capped at 5 aggregators to keep the result something a team would actually integrate. Growth is also coverage-aimed: while the weakest chain the route serves is under target, the next pick is aimed at that chain — an addition absent from the binding chain cannot move the number the gauge shows. The aimed pick is ranked by what it does to that chain, not by its overall score: those are different questions, and ranking the repair by score picked an aggregator that scored well overall but was weak precisely where the route was short, leaving the chain under target when 99.9% was reachable. A consequence worth stating plainly: a repair can pull in an aggregator this goal scores poorly. It is there for coverage, not as an endorsement — the route is quoted in parallel and the best result wins, so a costly member only ever wins when it is genuinely the best net quote, and the table still shows its real score. If no aggregator can help the binding chain while the pooled target is met, growth stops rather than spending slots that change nothing. All are practical limits rather than derived ones; they only bind when the target is out of reach, and the gauge's caption names the binding chain when it happens.

The profile stays active while you tune: changing any control (volume, latency, simulation, pricing, chain) keeps the goal and re-runs its pick under the new settings. Setting Auto-pick best N pins the set to exactly the top N for the goal, overriding the target sizing until a profile card or Reset clears it. Only hand-editing rows marks the route Custom (your own edits, not the profile's pick). The goal's weights still apply; Reset restores the profile's own selection.

06

Honest limits & independence

DISCLOSURE

The independence assumption. The gauge treats aggregator failures as independent. Correlated failures (honeypots, transfer-tax tokens, genuinely illiquid routes) miss every aggregator at once and set a floor no redundancy clears. Reaching sub-0.1% in practice is two jobs: enough fast, honest, independent quotes (modelled here) and pre-trade filtering of intrinsically unexecutable routes (not in this dataset).

The gauge is capped at 99.999%+, and that is not a rounding choice. The arithmetic above will happily return 99.99999% for a set of four or more strong aggregators, and printing that as 100% would be the model asserting something it has no standing to assert: the paragraph directly above says correlated failures set a floor no redundancy clears, and that floor is not in this dataset. Past the fourth digit the number is a statement about the independence assumption, not about the aggregators. So the display stops there. Read anything above 99.9% as "the modelled quote-supply problem is solved for this set; what remains is the correlated-failure and unexecutable-route problem, which is a different job."

Why none of the numbers are ours. route99 is built by DFC Research, the research arm of the DeFi Founders Club; some measured teams are club members. That is exactly why every figure comes unchanged from Enso Shield, every ranking follows these same published rules for every aggregator, and the source is linked throughout so any figure can be verified directly (Enso methodology ↗).

Enso is both the data source and a ranked aggregator. Enso is scored here on the same six criteria and the same published rules as everyone else, with no special handling: 11th of 15 under Balanced, 12th under Optimize for price, 7th under Low revert rate, 13th under Low latency (each at that goal's own default settings). We do not adjust Enso's inputs, weights, or curve differently from any other row, and the numbers above are reproducible from the same public dataset every other score comes from.

Check it yourself. "The code matches this page" is an assertion, and given who publishes route99 it should be cheap to falsify. Open your browser console on this page and run route99SelfTest(): it asserts every formula above against a hand-computable expected value — Poisson-binomial at k=1 and k=2 with unequal inputs, the green band at both k, the log-normal inversion, latency-curve continuity and clamping, every zero-point and divisor, dollars-to-bps, both pricing lenses, and the display cap — then prints a pass/fail table. If any row fails, this page and the code have drifted, and one of them is wrong.

Source: Enso Shield 7-day window, retrieved 18 Jul 2026 · reliability & latency © Enso Shield · coverage & pricing from provider docs, Jul 2026. This page is the canonical spec; the code matches it — route99SelfTest() proves it.
07

Data appendix: review our inputs

TRANSPARENCY

Every assumption behind the cost and coverage columns, in one place. Both tables are generated from the live dataset at page load — they cannot drift from what the rankings use. If any figure is wrong, tell us ↗: corrections ship with the next data refresh, and disagreement with a published number is exactly the review this page exists to invite. Hover a rate for the full sourcing note.

API pricing at each volume. Standard = the published or free-tier rate at that monthly volume, with paid plans amortised into bps where that is cheaper. Negotiated = genuinely unpriced custom/enterprise tiers at their contingent 0 (Rule 4). LP/pool fees, bridging, gas and consumer-UI fees are excluded throughout. unverified marks a provider where no fee could be found in the docs or in returned quotes and no official “no fee” statement exists either — read as 0 bps and flagged, not imputed. rate not published marks a provider that does charge a fee but publishes no rate — scored at the field’s worst published rate at that volume, never assumed free. A provider with no amortisable plan whose Standard-lens rate has been interpolated below its published ceiling carries the same flag as a Negotiated 0 — the confirmed number is the ceiling, not wherever your volume happens to land inside the range. Effective-rate columns are in bps.

Supported networks. ✓ marks a chain with a measured Enso Shield row in this dataset — the checkmark grid makes gaps visible at a glance, which is exactly what names the shortfall in Optimize for price’s Polygon coverage above. “Claimed” is the provider’s own network count linked to its source (live registry where available, otherwise official docs); hover it for source quality and how much sits beyond what’s measured here, which we cannot independently verify. For the interactive version — pick your chains, see who covers them — use the finder in the Network coverage section of the rankings page.

Pricing from provider docs, reviewed Jul 2026 · coverage counts as linked per row · measured rows © Enso Shield. Spot an error? Contact us ↗ — the fastest way to fix a number is to tell us it’s wrong.

DEX aggregator rankings

Even the best aggregators miss more than 1 in 1,000 swaps. Serious integrations quote several per swap and take the best result. We grade each one for that setup, against your goals, to 99.9% reliability. Why multi-aggregator ↗

RELIABILITY
99%
99.9% target
98.0%99.0%99.9%100%
How it's computedThe full math behind the number, step by step

Rankings for your setup

Enso's measured values, unchanged: only the colour bands and score weights move with your setup. The score weighs six criteria in four categories (reliability, cost, overquote, latency); your profile sets which lead. In the goal profiles, redundancy eases no-quote once you run two or more aggregators. Without simulation, sim-failure is used as a modelled proxy for your on-chain revert rate (Rule 2). On All chains the rows pool every chain an aggregator is measured on, so they summarise different route populations — use it for a field-wide overview and a per-chain tab for a like-for-like comparison. Click rows to build your set.

Aggregator Score1–10 · weighted Reliabilityno-quote · sim-fail Latencymedian · p95 Costfees · overquote No-quoteavailability Sim failurereverts Median lat.speed p95 lat.tail Overquoteprice holds Fill gapavg drift Costbps Chainssupported
strong for this setup borderline weak for this setup META = meta-aggregator (routes across other aggregators/bridges, not direct DEX liquidity)
02

Every aggregator's shape.

Six dimensions at once; further out is better on every axis. Hover an axis label for its exact definition. Selected aggregators in colour, the rest of the field faint behind them. These are the raw measured dimensions, not the graded ones: the table's 1–10 scores put the same inputs through per-criterion curves and profile weights, so use this to compare an aggregator's shape and the table to compare its score. Rings mark 25 / 50 / 75 / 100%, spaced so enclosed area tracks value rather than exaggerating it.

Six execution dimensions, overlaid
03

Reliability funnel.

Your selected set, traced gate by gate. Thin lines: each aggregator draining as quotes fail to return, arrive late, or fail simulation. Bold line: the chance your goal's quote requirement is met — at least one usable quote, or at least two under Optimize for price, where you need a second to compare against. Redundancy is the gap between them.

Where quotes drop, and how redundancy recovers
combined (≥1 survives) each thin line = one aggregator draining through the gates · combined = 1 − ∏(all fail) at each step
04

Latency against your budget.

A quote only counts if it arrives in time. One aggregator: its whole latency distribution has to fit your budget, tail included. Several: they cover each other's tails, so a slow p95 stops being fatal. Chips show the share arriving in time — modelled from median and p95 together (Rule 2), not from either threshold alone.

Median and p95 against your budget
median (first number) p95 tail (second) not in your set · click a row to add/remove your budget bars past the line don't reliably arrive in time · chip = % of quotes arriving in time (availability × speed; = availability when budget is off)
Speed × integrity: the same trade-off as one picture
selected: bold, larger unselected: smaller, muted ↑ more honest · → faster · click any dot to add/remove from your set
05

Quote integrity: how often × how much.

Two views of one failure: a quoted price that does not hold. Horizontal: how often quotes are inflated. Vertical: how much fills drift. Bottom-left is honest and tight.

Overquote frequency × fill drift
selected: bold, larger unselected: smaller, gray dashed lines mark the green bands (1% · 0.5 bps) · axes clamp at the plot edge
Average overquote cost per trade

A little drift is normal: prices move in the milliseconds between quote and fill, so a few hundredths of a bp reflects latency, not padding. It becomes a cost signal past the 0.05 bps noise band.

within latency noise (≤0.05 bps) above noise (≤0.4 bps) costly (>0.4 bps) avg quote→fill drift in bps, priced per $1M swapped · shaded zone = latency noise (≤0.05 bps) · bold = in your set
06

What the API costs.

Quality is one axis; price is the other. Cost stacks in layers: subscription, platform fee in bps, and hidden layers like gas treatment. This compares the published layers at your volume. Undisclosed stays undisclosed, not assumed zero.

Effective monthly cost = subscription + fee × volume
published range (min–max) not publicly disclosed provider docs & pricing pages, Jul 2026
07

Network coverage.

Quality is half the picture; an aggregator must also support your chains. There is no single registry. Counts come from live provider APIs where available, otherwise official docs, linked per row.

Who covers your networks?
Pick the chains you need — the six measured here, the quick picks, or search the full index of 100+ networks. Aggregators covering every pick rank first, by their current score.
✓ measured by Enso Shield here · ○ listed in the provider’s own docs/registry (Jul 2026), not measured · ? not verified either way — our lists are conservative, so ? means unknown, never “no”. “Add to route” appears only when every pick is measured, because only measured chains feed the gauge. Wrong or missing network? Tell us ↗
Chains supported for swaps
live registry · refreshed daily by our worker official docs self-reported unverified chains supported for swaps · sources linked per row · docs verified 21 Jul 2026 · live registries re-counted on page load
08

Method & source.

Source

All measurements are produced by Enso Shield, an independent benchmark that quotes every aggregator on the identical swap and re-simulates against live chain state. DFC Research changes none of the numbers; we only re-grade and re-plot them for your setup.

The reliability model

Your route's headline % is the chance that at least k of your selected aggregators return a usable quote: one that arrives in time and survives simulation. Aggregators are treated as independent, and the target is 99.9%.

The score

Six criteria in three pairs (reliability, price, latency), each graded 0–10 on published curves. Your profile sets the weights; the Standard/Negotiated lens sets how API fees are priced. Same rules for every aggregator.

Independence

route99 is built by DFC Research; some measured teams are DeFi Founders Club members, and Enso — the source of every reliability and latency figure — is itself scored here (11th of 15 Balanced, 7th Low revert, 12th price, 13th latency, at each goal's default settings). No number here is ours, every ranking follows the same published rules for every row, and every figure links back to its source.

Read the full methodology: the rule book this page implements, formula by formula