-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathbridge-quote-latency.yml
More file actions
275 lines (256 loc) · 23.3 KB
/
Copy pathbridge-quote-latency.yml
File metadata and controls
275 lines (256 loc) · 23.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
# OpenChainBench. Bench № 002
slug: bridge-quote-latency
number: "002"
title: Fastest cross-chain bridge quote API, live ms ranking
seo_title: "Fastest bridge quote API 2026"
seo_description: "Live p50 latency for cross-chain bridge quote APIs. Mobula, deBridge, Relay, LI.FI, Near Intents, Across ranked."
subtitle: Time to receive a usable cross-chain quote, in milliseconds. Identical route and identical notional, measured every five minutes across Mobula, deBridge, Relay, LI.FI, Near Intents and Across.
category: Bridges
status: live
metric: Quote latency
unit: ms
# Per-destination breakdown. The bridge-monitor harness emits the chain
# label set to route.ToChain (capitalized). Each bridge has wildly
# different per-corridor latency profiles (Near Intents in particular is
# bimodal: solver-cached corridors return in ~30ms while uncached ones
# wait the full 3s solver auction window) so aggregating across all
# destinations produces meaningless cross-corridor averages. The "All"
# tab keeps the aggregate view; the per-chain tabs reveal the truth.
dimensions:
chain:
- { value: Base, label: Sol to Base }
- { value: Arbitrum, label: Base to Arb }
- { value: Solana, label: Arb to Sol }
- { value: HyperCore, label: Arb to HyperCore }
region:
- { value: all, label: All regions }
- { value: eu-west, label: EU-West }
- { value: us-east, label: US-East }
- { value: sgp, label: Singapore }
seo_intro: |
This benchmark measures how fast each cross-chain bridge quote API
returns a usable response, the response-time half of the bridge story
that fee tables never quote. Builders integrating a swap or bridge
flow into a wallet, an aggregator or a chat-app care about the same
number every public roundup ignores. how many milliseconds the API
burns before the user sees a price. We hammer the same USDC routes
(Solana, Base, Arbitrum) against every bridge from three geographic
origins (EU-West, US-East, Singapore), every five minutes, on three
notional sizes. p50, p90 and p99 are computed via Prometheus
`histogram_quantile` over the 24-hour window, so the leaderboard
reflects sustained API performance, not a lucky cold-start. The same
harness records failure mode for every request (quote_failed,
unsupported route, timeout) and keeps it out of the latency aggregate,
surfacing it as success rate instead so that a fast-but-broken provider
cannot game the headline number.
abstract: |
We benchmark how long the major bridge APIs take to return a usable
cross-chain quote (route + fee + estimated settlement time). The harness
cycles through 4 routes × 3 notional sizes × every supported bridge every
five minutes, recording p50, p90 and p99 wall-clock latency along with the
success rate. Quotes that error or return unsupported responses are
excluded from latency aggregates and counted toward success rate.
methodology:
- "Routes: USDC pairs spanning Solana, Base and Arbitrum."
- "Notional sizes: $5, $50, $300 per quote."
- "Cadence: full sweep (4 routes × 3 amounts × N bridges) every 5 minutes for 24 hours."
- "Regions: eu-west, us-east, sgp. Three independent instances probe simultaneously; the All-regions aggregate uses the full union; per-region tabs isolate the view to one origin."
- "Histogram buckets: 10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000 ms. Sub-50ms buckets added 2026-07-13 so solver-cached fast paths (Near Intents on HyperCore in particular) surface their true p50 instead of being floored at the interpolation of the (0, 50] bucket."
- "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 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 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/ChainBench/OpenChainBench/tree/main/harnesses/bridge-monitor
prometheus:
window: 24h
expected_freshness_seconds: 1800
faq:
- q: "Which cross-chain bridge has the lowest API latency?"
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?"
a: "Every product that integrates a bridge sits behind that API. Wallets, aggregators, intent layers, chat-app swap modals. A 1500 ms p99 forces a long loading spinner; a 5000 ms p99 forces a timeout fallback. The number controls perceived UX, time-to-first-quote in side-by-side comparators, and how aggressively the integrator has to parallelise calls across bridges to mask the slowest one."
- q: "Are intent and relay bridges always faster than aggregators?"
a: "On a single-route query, usually. Intent layers like Relay quote against a pool of pre-positioned solvers, so the API is a thin price-discovery call. Aggregators like LI.FI run a route-search graph over N underlying bridges per request, which adds 100 to 400 ms of irreducible work. On multi-hop or rare-corridor queries the aggregator advantage in coverage matters more than the latency gap, and the comparison flips."
- q: "How does OpenChainBench measure bridge quote latency?"
a: "The harness issues identical quote requests against every bridge for the same route and notional, every five minutes, from three origins (eu-west, us-east, sgp) simultaneously. Each request times wall-clock duration from send to last byte received, then publishes a Prometheus histogram (10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000 ms buckets). p50, p90 and p99 are derived via `histogram_quantile` over a rolling 24-hour window. Errored quotes (quote_failed, unsupported route, timeout) are excluded from the latency aggregate and counted toward success rate so a fast-but-broken bridge cannot game the headline."
- q: "Does quote latency affect the price the user gets?"
a: "Indirectly, yes. A slower quote API leaves a larger window between the moment the price is quoted and the moment the user signs. On volatile corridors the underlying spot can drift in that window, which surfaces as a quoted-vs-realized gap. Intent layers compensate by re-quoting at signing time; aggregators usually pass through a slippage parameter. The fee benchmark on this site (`/benchmarks/bridge-fee`) measures the realized cost; this page measures the latency half of the same flow."
# Real metrics exposed by the bridge-monitor harness:
# bridge_quote_latency_ms_{bucket,sum,count}{bridge, from_chain, to_chain, from_token, to_token, amount_usd, region}
# bridge_quote_success{...} . gauge 0/1
# bridge_errors_total{..., error_type} . counter
#
# Label is `bridge=`, not `provider=`. Keep that in mind when extending.
providers:
- slug: mobula
name: Mobula
tag: Aggregator + intent layer
formula: "Median wall-clock ms over 24h for Mobula's quote API to return a usable USDC route, sampled every 5 minutes across 4 routes and 3 notionals from 3 regions (eu-west, us-east, sgp)."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula"}[24h])))
mean: sum(rate(bridge_quote_latency_ms_sum{bridge="mobula"}[24h])) / sum(rate(bridge_quote_latency_ms_count{bridge="mobula"}[24h]))
success: avg(avg_over_time(bridge_quote_success{bridge="mobula"}[24h]))
sample_size: sum(increase(bridge_quote_latency_ms_count{bridge="mobula"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula"}[1h])))
regions:
- region: eu-west
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula", region="eu-west"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula", region="eu-west"}[1h])))
- region: us-east
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula", region="us-east"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula", region="us-east"}[1h])))
- region: ap-southeast
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula", region="sgp"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mobula", region="sgp"}[1h])))
- slug: relay
name: Relay
tag: Cross-chain relay
formula: "Median wall-clock ms over 24h for Relay's solver-quote API to return a usable USDC route, sampled every 5 minutes across 4 routes and 3 notionals from 3 regions (eu-west, us-east, sgp)."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay"}[24h])))
mean: sum(rate(bridge_quote_latency_ms_sum{bridge="relay"}[24h])) / sum(rate(bridge_quote_latency_ms_count{bridge="relay"}[24h]))
success: avg(avg_over_time(bridge_quote_success{bridge="relay"}[24h]))
sample_size: sum(increase(bridge_quote_latency_ms_count{bridge="relay"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay"}[1h])))
regions:
- region: eu-west
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay", region="eu-west"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay", region="eu-west"}[1h])))
- region: us-east
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay", region="us-east"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay", region="us-east"}[1h])))
- region: ap-southeast
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay", region="sgp"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="relay", region="sgp"}[1h])))
- slug: lifi
name: LI.FI
tag: Aggregator
formula: "Median wall-clock ms over 24h for LI.FI's route-search API to return a usable USDC route across underlying bridges, sampled every 5 minutes across 4 routes and 3 notionals from 3 regions (eu-west, us-east, sgp)."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi"}[24h])))
mean: sum(rate(bridge_quote_latency_ms_sum{bridge="lifi"}[24h])) / sum(rate(bridge_quote_latency_ms_count{bridge="lifi"}[24h]))
success: avg(avg_over_time(bridge_quote_success{bridge="lifi"}[24h]))
sample_size: sum(increase(bridge_quote_latency_ms_count{bridge="lifi"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi"}[1h])))
regions:
- region: eu-west
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi", region="eu-west"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi", region="eu-west"}[1h])))
- region: us-east
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi", region="us-east"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi", region="us-east"}[1h])))
- region: ap-southeast
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi", region="sgp"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="lifi", region="sgp"}[1h])))
- slug: debridge
name: deBridge
tag: Native-token fees
formula: "Median wall-clock ms over 24h for deBridge's direct-protocol quote API to return a single-route USDC quote, sampled every 5 minutes across 4 routes and 3 notionals from 3 regions (eu-west, us-east, sgp)."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge"}[24h])))
mean: sum(rate(bridge_quote_latency_ms_sum{bridge="debridge"}[24h])) / sum(rate(bridge_quote_latency_ms_count{bridge="debridge"}[24h]))
success: avg(avg_over_time(bridge_quote_success{bridge="debridge"}[24h]))
sample_size: sum(increase(bridge_quote_latency_ms_count{bridge="debridge"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge"}[1h])))
regions:
- region: eu-west
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge", region="eu-west"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge", region="eu-west"}[1h])))
- region: us-east
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge", region="us-east"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge", region="us-east"}[1h])))
- region: ap-southeast
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge", region="sgp"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="debridge", region="sgp"}[1h])))
- slug: near-intents
name: Near Intents
tag: Intent layer (NEAR)
formula: "Median wall-clock ms over 24h for Near Intents 1Click API to return a usable USDC quote via the solver auction bus, sampled every 5 minutes across the supported routes and 3 notionals from 3 regions (eu-west, us-east, sgp)."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents"}[24h])))
mean: sum(rate(bridge_quote_latency_ms_sum{bridge="near-intents"}[24h])) / sum(rate(bridge_quote_latency_ms_count{bridge="near-intents"}[24h]))
success: avg(avg_over_time(bridge_quote_success{bridge="near-intents"}[24h]))
sample_size: sum(increase(bridge_quote_latency_ms_count{bridge="near-intents"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents"}[1h])))
regions:
- region: eu-west
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents", region="eu-west"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents", region="eu-west"}[1h])))
- region: us-east
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents", region="us-east"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents", region="us-east"}[1h])))
- region: ap-southeast
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents", region="sgp"}[24h])))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="near-intents", region="sgp"}[1h])))
- slug: across
name: Across
tag: Intent layer
formula: "Median wall-clock ms over 24h for Across's Swap API to return a usable USDC quote, sampled every 5 minutes across supported routes (Sol to Base, Base to Arb) and 3 notionals from 3 regions (eu-west, us-east, sgp). Arb to Sol excluded: Across does not support destination swaps to Solana."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="across"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="across"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="across"}[24h])))
mean: sum(rate(bridge_quote_latency_ms_sum{bridge="across"}[24h])) / sum(rate(bridge_quote_latency_ms_count{bridge="across"}[24h]))
success: avg(avg_over_time(bridge_quote_success{bridge="across"}[24h]))
sample_size: sum(increase(bridge_quote_latency_ms_count{bridge="across"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="across"}[1h])))
- slug: squid
name: Squid Router
tag: Aggregator (Axelar)
formula: "Median wall-clock ms over 24h for Squid Router's v2 API to return a best-output USDC route, sampled every 5 minutes across supported EVM corridors (Base to Arb) and 3 notionals from 3 regions. Solana corridors excluded: Squid v2 Solana source returns a server-side error."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="squid"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="squid"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="squid"}[24h])))
mean: sum(rate(bridge_quote_latency_ms_sum{bridge="squid"}[24h])) / sum(rate(bridge_quote_latency_ms_count{bridge="squid"}[24h]))
success: avg(avg_over_time(bridge_quote_success{bridge="squid"}[24h]))
sample_size: sum(increase(bridge_quote_latency_ms_count{bridge="squid"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="squid"}[1h])))
- slug: socket
name: Socket Protocol
tag: Aggregator
formula: "Median wall-clock ms over 24h for Socket Protocol's v2 API to return the best-output USDC route across underlying bridges (Across, Stargate, CCTP), sampled every 5 minutes across supported EVM corridors (Base to Arb) and 3 notionals from 3 regions. Solana is receive-only in Socket's chain list."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="socket"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="socket"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="socket"}[24h])))
mean: sum(rate(bridge_quote_latency_ms_sum{bridge="socket"}[24h])) / sum(rate(bridge_quote_latency_ms_count{bridge="socket"}[24h]))
success: avg(avg_over_time(bridge_quote_success{bridge="socket"}[24h]))
sample_size: sum(increase(bridge_quote_latency_ms_count{bridge="socket"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="socket"}[1h])))
- slug: mayan
name: Mayan Finance
tag: Intent layer (Wormhole)
formula: "Median wall-clock ms over 24h for Mayan Finance's v3 quote API to return a Swift or MCTP USDC route, sampled every 5 minutes across supported Solana corridors (Sol to Base, Arb to Sol) and 3 notionals from 3 regions. Pure EVM corridors are outside Mayan's scope."
queries:
p50: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mayan"}[24h])))
p90: histogram_quantile(0.90, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mayan"}[24h])))
p99: histogram_quantile(0.99, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mayan"}[24h])))
mean: sum(rate(bridge_quote_latency_ms_sum{bridge="mayan"}[24h])) / sum(rate(bridge_quote_latency_ms_count{bridge="mayan"}[24h]))
success: avg(avg_over_time(bridge_quote_success{bridge="mayan"}[24h]))
sample_size: sum(increase(bridge_quote_latency_ms_count{bridge="mayan"}[24h]))
series: histogram_quantile(0.50, sum by (le) (rate(bridge_quote_latency_ms_bucket{bridge="mayan"}[1h])))