Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
534ed24
metadata-coverage: per-chain editorial (Solana/BNB leaders explicit)
Flotapponnier May 29, 2026
21fb988
bridge-fee: flag cross-corridor aggregate; defer per-corridor rewrite
Flotapponnier May 29, 2026
7af475d
bridge-quote-latency: flag cross-corridor aggregate; defer per-corrid…
Flotapponnier May 29, 2026
26920ec
rpc-capabilities: per-chain editorial (Ethereum/Base/BNB/Arbitrum lea…
Flotapponnier May 29, 2026
0ec7fec
seo: chain-aware @id suffix in jsonld + page-metadata helpers
Flotapponnier May 29, 2026
d814a5b
feat(products): add chain-coverage chip + per-chain contract bridge
Flotapponnier May 29, 2026
08ed38d
seo: bench generateMetadata reads ?chain= and renders chain-honest ti…
Flotapponnier May 29, 2026
228f0fa
feat(providers): chain-aware ranking + per-chain win counting
Flotapponnier May 29, 2026
9405abd
seo: emit per-chain OG + twitter cards via generateImageMetadata
Flotapponnier May 29, 2026
5e6569d
feat(badge): accept ?chain= and label scope in SVG
Flotapponnier May 29, 2026
afc516e
feat(seo): chain-aware metadata + OG + sitemap + JSON-LD
Flotapponnier May 29, 2026
bd53b79
feat(products page): render per-chain rank chips and clarify wins column
Flotapponnier May 29, 2026
78a925d
feat(products+badge): chain-aware ranking + per-chain badge + coverag…
Flotapponnier May 29, 2026
759491d
core: bestPerChain + worstPerChain stash with chain-aware helpers
Flotapponnier May 29, 2026
85fb96b
bench-001(yaml): rewrite findings/faq/seo_intro for per-chain leaders
Flotapponnier May 29, 2026
7c4ed0b
feat(core): per-chain best computation + chain-aware placeholders
Flotapponnier May 29, 2026
9f8fb4c
merge: core lib per-chain best computation + placeholders (A1)
Flotapponnier May 29, 2026
1f0de51
merge: editorial rewrite 4 affected YAMLs (A4)
Flotapponnier May 29, 2026
d8f7f1d
merge: SEO surface chain-aware metadata + OG + sitemap + jsonld (A2)
Flotapponnier May 29, 2026
c2228b1
merge: products + badge + chain coverage chip (A3)
Flotapponnier May 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 17 additions & 9 deletions benchmarks/aggregator-head-lag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,15 @@ seo_intro: |
data provider. how many seconds elapse between a swap landing on
chain and the same event appearing on the provider's feed. Marketing
pages quote "real-time" without a number; this page quotes the
number. Mobula's WebSocket, Codex's GraphQL feed and GeckoTerminal's
REST endpoint are watched from three regions (us-east, eu-west, sgp)
against canonical-tip archive nodes on Base, BNB Chain and Solana.
number. Mobula's WebSocket, Codex's GraphQL feed, GeckoTerminal's
REST endpoint and GMGN's Solana-only WebSocket are watched from
three regions (us-east, eu-west, sgp) against canonical-tip archive
nodes on Base, BNB Chain and Solana. Because each chain has its own
base block cadence (Solana's ~400 ms slots vs Base/BNB's 2-3 s
blocks), the headline winner shifts by chain. On Solana the leader
is {{best_name:chain:solana}} at {{best_p50:chain:solana}}; on Base
it's {{best_name:chain:base}} at {{best_p50:chain:base}}; on BNB
Chain it's {{best_name:chain:bnb}} at {{best_p50:chain:bnb}}.
p50 and p99 are computed via Prometheus `quantile_over_time` over a
24-hour window so the leaderboard reflects sustained freshness, not
a cherry-picked cold-start sample. The same harness tracks presence
Expand All @@ -45,12 +51,14 @@ methodology:
- "Cardinality: 4 aggregators × up to 3 chains × 3 regions, minus inapplicable chains for chain-restricted providers."

findings:
- "{{best_name}} currently leads head lag at {{best_p50}} (p50, 24 h) across {{count}} measured providers. The number is the wall-clock interval between a swap settling on chain and that swap appearing on the provider's feed, cross-region median."
- "{{name:mobula}} returns {{p50:mobula}} (p50, 24 h). WebSocket feeds compress latency by pushing events the moment the harness emits them rather than waiting for the next poll cycle, which is the architectural reason real-time integrations prefer them over REST."
- "{{name:codex}} clocks {{p50:codex}} (p50, 24 h). GraphQL subscriptions are a server-push pattern in practice and cluster near WebSocket performance on liquid pools, but tail latency tends to widen on long-tail tokens with sparse events."
- "{{name:geckoterminal}} sits at {{p50:geckoterminal}} (p50, 24 h). REST polling adds the poll interval to every read, so head lag tracks the publisher's chosen cadence rather than raw infrastructure speed."
- "Across the unfiltered cross-chain aggregate the leader is {{best_name}} at {{best_p50}} (p50, 24 h) over {{count}} measured providers, but that headline number mixes chains with very different baseline cadences (Solana 400 ms slots vs Base/BNB 2-3 s blocks) so the per-chain breakdown below is what to read for an integration decision."
- "On Solana the leader is {{best_name:chain:solana}} at {{best_p50:chain:solana}} (p50, 24 h); the trailer is {{worst_name:chain:solana}} at {{worst_p50:chain:solana}}. Slot cadence is sub-second, so any second-scale aggregate latency is on the provider's pipeline, not the chain."
- "On Base the leader is {{best_name:chain:base}} at {{best_p50:chain:base}} (p50, 24 h); the trailer is {{worst_name:chain:base}} at {{worst_p50:chain:base}}. Base targets a 2 s block cadence, so head lag here measures pipeline latency on top of the chain's natural block interval."
- "On BNB Chain the leader is {{best_name:chain:bnb}} at {{best_p50:chain:bnb}} (p50, 24 h); the trailer is {{worst_name:chain:bnb}} at {{worst_p50:chain:bnb}}. BNB's ~3 s blocks set the floor; the spread between leader and trailer is the provider-side delta."
- "{{name:mobula}} returns {{p50:mobula}} (p50, 24 h) cross-chain. WebSocket feeds compress latency by pushing events the moment the harness emits them rather than waiting for the next poll cycle, which is the architectural reason real-time integrations prefer them over REST."
- "{{name:codex}} clocks {{p50:codex}} (p50, 24 h) cross-chain. GraphQL subscriptions are a server-push pattern in practice and cluster near WebSocket performance on liquid pools, but tail latency tends to widen on long-tail tokens with sparse events."
- "{{name:geckoterminal}} sits at {{p50:geckoterminal}} (p50, 24 h) cross-chain. REST polling adds the poll interval to every read, so head lag tracks the publisher's chosen cadence rather than raw infrastructure speed."
- "p99 is the integration-grade number. The gap between p50 and {{p99:mobula}} / {{p99:codex}} / {{p99:geckoterminal}} is what a live UI feels when a chain spikes or a region's path degrades."
- "{{worst_name}} trails at {{worst_p50}} (p50, 24 h). On a real-time trading UI the gap between leader and laggard becomes visible to end users when chart candles stutter or the trade tape lags behind the explorer."

source: https://github.com/OpenChainBench/OpenChainBench/tree/main/harnesses/aggregator-head-lag

Expand All @@ -59,7 +67,7 @@ prometheus:

faq:
- q: "Which crypto data API has the lowest latency right now?"
a: "{{best_name}} currently leads at {{best_p50}} (p50, 24 h) across {{count}} measured providers. The leaderboard re-sorts every 15 seconds against fresh Prometheus samples, so the answer reflects the last 24 hours of measured head lag on Base, BNB Chain and Solana from three regions, not a marketing-page claim."
a: "It depends on the chain, because each chain's base block cadence sets a different floor. On Solana the leader is {{best_name:chain:solana}} at {{best_p50:chain:solana}} (p50, 24 h). On Base it's {{best_name:chain:base}} at {{best_p50:chain:base}}. On BNB Chain it's {{best_name:chain:bnb}} at {{best_p50:chain:bnb}}. The unfiltered cross-chain aggregate puts {{best_name}} on top at {{best_p50}}, but that ranking is influenced by chain mix as much as by provider pipeline speed - read the per-chain numbers if you're picking a provider for a specific chain."
- q: "What is head lag in a crypto data feed?"
a: "Head lag is the wall-clock interval between a transaction landing in a confirmed block on chain and the same transaction appearing on the data provider's feed. A provider with 200 ms head lag pushes the event a fifth of a second after it settled; a provider with 6 s head lag pushes it after six seconds. The number controls how live a trading UI, a chart or a PnL tracker actually feels when the underlying chain moves."
- q: "Is WebSocket faster than REST for crypto market data?"
Expand Down
16 changes: 13 additions & 3 deletions benchmarks/bridge-fee.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,26 @@ methodology:
- "Failures (quote_failed, unsupported route) excluded from cost aggregates and counted toward success rate."
- "Provider types are surfaced as badges: direct protocols (Debridge) charge their own bridging fees; aggregators (LiFi) route through whichever underlying bridge is cheapest, so their effective fee includes that bridge's cost plus any aggregator markup; intent / relay layers (Mobula, Relay) bake cost into the spread of a settlement intent rather than charging an explicit fee."

# Per-corridor leader rewrite deferred: this YAML does not yet declare
# `dimensions:` for `from_chain`/`to_chain` / corridor. The underlying
# metric already carries those labels (see comment block lower in this
# file), so per-corridor placeholders can be wired in once dimensions
# are added (separate code/data PR). Until then, the {{best_name}} /
# {{worst_name}} placeholders below resolve to the cross-corridor
# aggregate, which is honest because every provider in this bench is
# queried on the same Solana/Base/Arbitrum corridors. but the text is
# softened to make the aggregation explicit rather than implying a
# single winning corridor.
findings:
- "{{best_name}} currently leads at {{best_p50}} (p50, 24 h) on the $300 USDC corridor, across {{count}} measured bridges."
- "{{best_name}} currently leads the cross-corridor aggregate at {{best_p50}} (p50, 24 h) for $300 USDC trades, across {{count}} measured bridges. The number averages over the Solana/Base/Arbitrum corridors the harness sweeps; per-corridor leaders can diverge sharply on routes where one solver has inventory and another does not."
- "{{name:mobula}} returns {{p50:mobula}} (p50, 24 h). Intent layers compress fees, slippage and destination gas into a single spread, so the effective number reads lower than aggregators that route through a paid underlying bridge."
- "{{name:lifi}} sits at {{p50:lifi}} (p50, 24 h). Aggregators pay the underlying bridge plus a thin markup, so their effective cost trails intent layers on liquid corridors where multiple solvers compete on the same route."
- "{{name:debridge}} clocks {{p50:debridge}} (p50, 24 h). Direct protocols front-load cost into a native-token fee, which dominates on $300 trades because the fixed component does not scale with notional."
- "{{worst_name}} trails at {{worst_p50}} (p50, 24 h). On a $300 trade the gap between leader and laggard is mostly the fixed-fee floor of the slower path, not relative spread efficiency."
- "{{worst_name}} trails the cross-corridor aggregate at {{worst_p50}} (p50, 24 h). On a $300 trade the gap between leader and laggard is mostly the fixed-fee floor of the slower path, not relative spread efficiency, and the laggard on one corridor can be the leader on another once corridor dimensions are surfaced."

faq:
- q: "What is the cheapest cross-chain bridge right now?"
a: "{{best_name}} currently leads the leaderboard at {{best_p50}} (p50, 24 h) for $300 USDC trades across the measured corridors (Solana, Base, Arbitrum). The leaderboard re-sorts every five minutes against fresh Prometheus samples, so the answer is always anchored to the last 24 hours of live data rather than a frozen table from a blog post."
a: "{{best_name}} currently leads the cross-corridor aggregate at {{best_p50}} (p50, 24 h) for $300 USDC trades, averaged across the Solana/Base/Arbitrum corridors the harness sweeps. The leaderboard re-sorts every five minutes against fresh Prometheus samples, so the answer is anchored to the last 24 hours of live data rather than a frozen table from a blog post. Per-corridor leaders can diverge from this aggregate when a solver has deep inventory on one specific route and not on others, that breakdown is on the roadmap once corridor dimensions are surfaced in the page UI."
- q: "How much does it cost to bridge $300 USDC?"
a: "Total cost varies between providers. The current p50 across {{count}} bridges spans from {{best_p50}} (leader) up to {{worst_p50}} (laggard) of the $300 notional. The figure already includes fees, slippage and destination gas because we report `bridge_cost_percent`, the all-in number that actually leaves the user's wallet, not the explicit fee field providers advertise."
- q: "Why do bridge fees vary 10x between providers?"
Expand Down
14 changes: 11 additions & 3 deletions benchmarks/bridge-quote-latency.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,21 @@ methodology:
- "Histogram buckets: 50, 100, 200, 500, 1000, 2000, 5000, 10000 ms."
- "Failures (quote_failed, execution_failed, unsupported route) excluded from latency aggregates and counted toward success rate."

# Per-corridor leader rewrite deferred: this YAML does not yet declare
# `dimensions:` for `from_chain`/`to_chain` / corridor. The bridge-monitor
# metric carries those labels (see comment block below), so per-corridor
# placeholders can be wired in once the dimensions block is added in a
# separate code/data PR. The {{best_name}} / {{worst_name}} below
# resolve to the cross-corridor aggregate, which is honest because every
# bridge is queried on the same 4 USDC routes, but the text now makes
# the aggregation explicit rather than implying a single winning route.
findings:
- "{{best_name}} currently leads quote latency at {{best_p50}} (p50, 24 h) across {{count}} measured bridges. The cohort spans direct protocols, aggregators and intent layers under the same query."
- "{{best_name}} currently leads the cross-corridor aggregate at {{best_p50}} (p50, 24 h) across {{count}} measured bridges. The cohort spans direct protocols, aggregators and intent layers under the same query, averaged over the 4 USDC routes the harness sweeps."
- "{{name:relay}} returns {{p50:relay}} (p50, 24 h). Intent and relay layers usually clock lowest because the API surface is a thin price-discovery call against pre-quoted solvers, not a full route-search graph."
- "{{name:lifi}} sits at {{p50:lifi}} (p50, 24 h). Aggregators do more work per call (route search across N underlying bridges, fee normalisation), which costs them a stable 100 to 400 ms versus pure relays."
- "{{name:debridge}} clocks {{p50:debridge}} (p50, 24 h). Direct protocols quote a single canonical route, so latency reflects raw API plumbing rather than route-search complexity."
- "Tail latency tells the integration story. p99 ({{p99:relay}} / {{p99:lifi}} / {{p99:debridge}}) is what dictates timeouts in production wallets; SDKs that wait for the slowest bridge degrade the whole UX when one provider has a bad minute."
- "{{worst_name}} trails at {{worst_p50}} (p50, 24 h). A 5x gap at p50 turns into a 10 to 20x gap at p99, which is where flaky integrations actually surface to end users."
- "{{worst_name}} trails the cross-corridor aggregate at {{worst_p50}} (p50, 24 h). A 5x gap at p50 turns into a 10 to 20x gap at p99. A bridge that lags overall can still be fastest on a specific corridor where it is closer to its solver pool, that per-corridor breakdown is on the roadmap."

source: https://github.com/OpenChainBench/OpenChainBench/tree/main/harnesses/bridge-monitor

Expand All @@ -60,7 +68,7 @@ prometheus:

faq:
- q: "Which cross-chain bridge has the lowest API latency?"
a: "{{best_name}} currently leads at {{best_p50}} (p50, 24 h) across {{count}} measured bridges. The leaderboard re-sorts every five minutes against fresh Prometheus samples, so the ranking reflects the last 24 hours of actual API performance from a single eu-west origin under the same USDC routes."
a: "{{best_name}} currently leads the cross-corridor aggregate at {{best_p50}} (p50, 24 h) across {{count}} measured bridges, averaged over the 4 USDC routes the harness sweeps. The leaderboard re-sorts every five minutes against fresh Prometheus samples, so the ranking reflects the last 24 hours of actual API performance from a single eu-west origin under the same routes. Per-corridor latency leaders can differ from this aggregate where one provider has a solver pool closer to a specific destination chain, that breakdown is on the roadmap once corridor dimensions are surfaced in the page UI."
- q: "What is the difference between quote latency and bridge fill time?"
a: "Quote latency is the wall-clock time the bridge API takes to return a price. Fill time is the wall-clock time the funds take to land on the destination chain after the user signs. They are decoupled: a bridge can quote in 100 ms and take 30 seconds to settle, or quote in 2 seconds and settle in 5 seconds. This benchmark measures the quote half because that is the part a wallet, an aggregator or an embedded swap UI feels first and tunes its UX around."
- q: "Why does bridge quote latency matter for builders?"
Expand Down
Loading
Loading