Methodology

How upswap measures cross-chain bridges v1.0 draft

Text updated 2026-11-01Numbers from run #538 ·

Key points

upswap.io requests quotes for 38 cross-chain routes at $20, $200 and $2,000 every 30 minutes from 13 public quote APIs plus Circle’s published CCTP fee schedule, and ranks them by net amount received — amount out minus extra fees, excluding gas. Gas is shown separately as one estimate per source chain and token (the same for every bridge) and never counted for Across Protocol. Quotes that promise more than the input are listed but never ranked. Data is open under CC BY 4.0; real-money tests have not started yet.

Source: upswap.io · sampling log · CC BY 4.0 · Zenodo DOI: Example / pending

How often is data sampled?

Every 30 minutes, at :05 and :35 past the hour. A run requests every route × amount from every source once; missed slots are never back-filled, and gaps over 45 minutes are marked on every chart and in the log.

A full run makes about 1,218 HTTP requests and returns about 2,195 quotes in roughly two minutes. Each source has its own request interval and local rate limit so we stay inside public API limits. A run that finishes with only some sources is kept and labelled; it is never merged with another run.

Sources in run #538
SourceTypeUsed for ranking
LI.FIaggregatoryes
Relayintent / solver networkyes
Acrossintent / solver networkyes
deBridge (DLN)intent / solver networkyes
Mayanbridgeyes
NEAR Intents 1Clickintent / solver networkyes
Symbiosisbridgeyes
Circle CCTP V2(费率表)published fee schedulereference only
Layerswapbridgeyes
Eco Routesbridgeyes
Chainflipbridgeyes
THORChain(Liquify 网关)bridgeyes
Celer cBridgebridgeyes
Mesonbridgeyes
Socket / Bungee (v3)aggregatorpaused — awaiting API key (since 2026-10-24)

Not integrated yet: LayerZero Value Transfer API(含 Stargate), Squid Router, Rango Exchange, Stargate API (legacy), Bungee API v1.

Which amounts and prices are used?

Three fixed dollar amounts per route — $20, $200 and $2,000 — converted to token units with one CoinGecko price snapshot taken at the start of each run.

The same snapshot values both what goes in and what comes out, so quotes from different APIs in one run are directly comparable. Requests use placeholder addresses; nothing is signed or sent on-chain. Each raw API response is archived with its sha256 hash so any number can be traced back.

How is cost calculated?

Cost is what you lose between input and net amount received, in basis points of the input, excluding gas.

net_usd = amount_out_usd − fee_extra_usd cost_excl_gas_bps = (amount_in_usd − net_usd) / amount_in_usd × 10,000

bps
1 basis point = 0.01 % of the input. On $200, 1 bps = $0.02.
fee_extra_usd
Fixed fees charged on top rather than deducted from the output (e.g. deBridge fixFee, LI.FI fees not included in the output).
Aggregator platform fee
LI.FI and Socket / Bungee public endpoints include 25 / 20 bps in their quotes; it is part of the cost, not added again.

How is gas handled?

Gas is always an estimate, shown in its own column and never part of the ranking. Since 2026-10-24 every bridge on a route shows the same figure: one source-chain gas estimate per run, source chain and input token (upswap gas basis v1). Across Protocol gas is never counted.

How the basis is computed: in each run we take every source-chain gas estimate (in USD, above zero) that any quote API returned for routes starting on the same chain with the same token — all routes and all three amounts, Across rows excluded. We take the median per API, then the median of those per-API medians, so each API counts once however many rows it returned. Today LI.FI and Relay return estimates (Socket / Bungee did until it was paused); deBridge, Mayan, NEAR Intents 1Click, Symbiosis and the Circle CCTP fee schedule do not, and now get the same basis instead of “n/a”. If no API returned an estimate for that chain and token in a run, the median of the previous 7 days is used and marked.

Why one basis: the APIs estimate gas differently (different contracts, approvals, simulation addresses), so their own figures are not comparable and would reward whichever API reports the lowest number. A single basis per route keeps gas comparable and makes clear it does not decide the ranking. Each API’s own estimate is still shown in small type next to the basis and kept in the raw data and CSV (gas_usd); the basis is in the CSV column gas_est_usd.

Across Protocol gas is never counted (decided 2026-10-23): its API simulates the transaction from the placeholder address, so the estimate depends on that address’s balance and approvals. When the simulation succeeds the originGas figure is archived with the raw response and flagged “gas est. archived”, but it is not shown as a cost, and Across rows (including Across reached through LI.FI) do not get the gas basis.

How are quotes ranked?

By net amount received, highest first, within one run, route and amount. The same bridge reached through different APIs appears as separate rows, which is how aggregator markup becomes visible.

Circle CCTP rows come from the published fee schedule, not a live quote; they are shown as reference rows and never ranked. Bridge review pages give separate metrics with their own sample sizes — there is no combined score and no star rating.

What happens to quotes that pay out more than you put in?

They are listed but never ranked. In run #538 there were 6.

A quote whose net amount exceeds the input (negative cost) usually means a pricing error, a temporary subsidy or an amount that will be adjusted at execution. Such rows sit in a separate group at the end of the table with rank “—” and the label “Quote above input · unverified”. They are excluded from best/second markers, key findings, meta descriptions, the home board, bridge win counts and medians, history lines and aggregator medians. They stay in the CSV with negative_cost = 1. The rule is lifted for a route type only after a real-money transfer confirms such an outcome, recorded in the changelog.

When does a page get published?

Only when the data behind it is deep enough. Pages below a gate are not indexed; the preview site shows them with a “Not enough data” label.

PageGate
Route≥3 bridges with live quotes in 7 days, ≥3 computed findings, ≥14 UTC days of history, and an approved editorial guide in that language
Bridge reviewrankable quotes on ≥5 routes and in ≥5 runs during the 7 days before the latest run
Chain≥3 published route pages touch the chain
Head-to-headboth bridges pass their gate, ≥8 common routes, ≥90 same-run $200 comparisons, and real-money tests on ≥2 common routes

How should the history charts be read?

Charts cover the last 7 days, one point per run, with runs in order on the x axis. Amber hatched bars mark gaps longer than 45 minutes; lines never bridge a gap.

Cost axes use a log scale because bridges differ by two orders of magnitude. With fewer than 14 UTC days of history every chart carries “Not enough data · N/14 days” and no trend is claimed. All charts are rendered at build time as inline SVG: no scripts, no external requests.

Has upswap tested bridges with real money?

Not yet — tests are planned after launch.

Each test will be done by hand through the bridge’s official front end and will list the route, wallet address, input, quoted output, approval / source / destination tx hashes, block times and what actually arrived. Real cost = input − received + source gas + approval gas. No example wallets or transactions are shown as if they were real.

Can I reuse the data?

Yes, under CC BY 4.0: reuse freely, credit “Arnold Burn / upswap.io” and the snapshot run.

Burn, A. / upswap.io (2026). {page title}, snapshot #{N}, {UTC time}. {URL}#{anchor}. CC BY 4.0. Accessed {date}.

Every route page links a 7-day history CSV; all quotes of the latest run are one CSV. A monthly Zenodo deposit with a DOI is planned; until it exists every DOI on the site is marked Example / pending.

Does upswap earn money from bridges?

No. There is no swap button, no referral or affiliate parameter and no paid placement.

Across Protocol’s API requires an integrator ID; ours is 0x03db and appears in the calldata Across returns. The app fee is 0, we never execute the returned transaction, and we earn nothing from it. All disclosures →

What changed in the method?

DateChange
2026-11-01Added six direct quote sources: Layerswap, Eco Routes, Chainflip, THORChain (via the Liquify gateway), Celer cBridge and Meson — none needs an API key. Requests per run grow from about 810 to about 1,150, with roughly 300 more valid quotes. Layerswap and Chainflip already appeared through LI.FI; they now have both a direct row and a via-LI.FI row, which shows the aggregator's mark-up directly. Many routes will get a new leader on the same day; that comes from the added sources, not from a data problem. The ranking rule is unchanged.
2026-11-01Quotes from the new sources never count source-chain gas (same as Across). Existing gas basis v1 values do not change; gas is still shown separately and never ranked.
2026-11-01Meson's price API returns fees only. Its amount received is computed as amount − total fee and ranked; the API gives no arrival time, so the table shows "not provided" and we do not estimate one.
2026-11-01Quotes a source returns but we cannot verify from its documentation (for example cBridge returning zero fees and an amount equal to the input on routes into BNB Chain USDT) are labelled "anomalous quote · unverified" and handled like fee schedules: listed, never ranked, excluded from best markers, the home board and medians; kept in the CSV with quote_kind = anomalous.
2026-11-01When we add custodial swap services (your funds first sit in the operator's account, as with centralised exchange services), they will be ranked in the same table as bridges, by the same rule (net amount received, source-chain gas excluded), with every row labelled "custodial" and the risk difference explained in this methodology. No custodial service is included yet.
2026-10-24Gas basis v1: every bridge on a route now shows one source-chain gas estimate per run (median of the quote APIs’ own estimates for that source chain and token), instead of each API’s own figure or “n/a”. Gas is still shown separately and never ranked; Across gas is still never counted. Ranking unchanged.
2026-10-24Socket / Bungee quotes paused: its public endpoint rate-limits our new sampling server, so we stopped requesting it until we have an API key. Runs from now on have about 190 fewer quote rows; this is a source pause, not an outage. Earlier Socket / Bungee quotes stay in the history and CSV. Bridges that were only quoted through Socket / Bungee will drop out of rankings and may fall below the 7-day page gates as their history ages out.
2026-10-24Added 7-day per-bridge history charts, quoted-ETA charts and per-route history CSV. No change to how quotes are ranked.
2026-10-23v1.0 draft: Across gas never counted; quotes above input listed but unranked; CCTP fee schedule as reference rows; no overall score.