Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 3 additions & 3 deletions answers/best-rpc-for-indexer.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
slug: best-rpc-for-indexer
question: "Which RPC is best for indexers and high-throughput read workloads in 2026?"
short_answer: |
{{best_name}} currently leads the free-tier keyed RPC leaderboard at {{best_p50}} p50 latency (24h avg) on eth_getBlockByNumber probes, and pairs it with archive-depth support across a wide chain footprint, measured live by OpenChainBench from three regions.
{{best_name}} currently ranks first on the free-tier keyed RPC leaderboard at {{best_p50}} p50 latency (24h avg) on eth_getBlockByNumber probes, and pairs it with archive-depth support across a wide chain footprint, measured live by OpenChainBench from three regions.

benchmark: rpc-capabilities

Expand All @@ -19,7 +19,7 @@ limitations:

faq:
- q: "Which RPC provider is best for a subgraph or custom indexer?"
a: "{{best_name}} leads the head-latency leaderboard at {{best_p50}} p50 (24h). For indexers the ranking that matters is the intersection of the latency leaderboard and the archive-depth matrix: a provider that wins latency but fails at 5M depth is not indexer-viable. The bench page surfaces both, and the head-to-head leader among indexer-viable providers is the answer."
a: "{{best_name}} ranks first on the head-latency leaderboard at {{best_p50}} p50 (24h). For indexers the ranking that matters is the intersection of the latency leaderboard and the archive-depth matrix: a provider that wins latency but fails at 5M depth is not indexer-viable. The bench page surfaces both, and the fastest among indexer-viable providers is the answer."
- q: "Why does eth_getBlockByNumber matter for indexers when the real workload is eth_getLogs?"
a: "Because eth_getBlockByNumber measures the head-of-chain read path that every provider must implement, it is the fair cross-vendor probe. Providers that misbehave on head reads reliably misbehave on eth_getLogs at higher magnitude. Providers that keep head reads tight and consistent tend to keep eth_getLogs tight and consistent too. The latency leaderboard is a lower bound on indexer-workload latency, and a provider that fails the lower bound is not worth benchmarking on the harder workload."
- q: "Which provider supports full archive access without a paid plan?"
Expand All @@ -37,5 +37,5 @@ related:
- which-crypto-price-api-is-the-fastest

seo_title: "Best RPC for indexers 2026 live rankings"
seo_description: "{{best_name}} leads at {{best_p50}} p50 latency (24h avg) on the OpenChainBench keyed and no-key RPC leaderboards, ranked live from three regions with archive-depth matrix."
seo_description: "{{best_name}} ranks first at {{best_p50}} p50 latency (24h avg) on the OpenChainBench keyed and no-key RPC leaderboards, ranked live from three regions with archive-depth matrix."
status: live
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ limitations:

faq:
- q: "What is the cheapest way to bridge USDC to Arbitrum?"
a: "At $300 notional, {{best_name}} currently leads the measured cohort at {{best_p50}} all in (p50, 24h, averaged across the corridors it quotes). Intent layers usually top this table at retail sizes because they compress fee, spread and destination gas into one solver quote, while direct protocols carry a fixed fee floor that hits hardest on small trades. The leaderboard refreshes every five minutes, and the corridor level leader can differ from the aggregate, so treat this as the live starting point rather than a permanent answer."
a: "At $300 notional, {{best_name}} currently offers the cheapest route at {{best_p50}} all in (p50, 24h, averaged across the corridors it quotes). Intent layers usually top this table at retail sizes because they compress fee, spread and destination gas into one solver quote, while direct protocols carry a fixed fee floor that hits hardest on small trades. The leaderboard refreshes every five minutes, and the corridor level leader can differ from the aggregate, so treat this as the live starting point rather than a permanent answer."
- q: "Why is bridging a small amount of USDC so expensive in percentage terms?"
a: "Because part of the cost is fixed. Destination gas and base protocol fees cost roughly the same whether you move $300 or $10,000, so at $300 they are the dominant share of the percentage, while at $10,000 they dilute to noise. This is why published comparisons quoting $10,000 rack rates understate what retail users pay: the current measured spread at $300 runs from {{best_p50}} to {{worst_p50}} across {{count}} providers, a gap driven mostly by how much fixed cost each architecture front loads rather than by spread efficiency."
- q: "Do I need ETH on Arbitrum to receive bridged USDC?"
Expand Down
2 changes: 1 addition & 1 deletion answers/which-bridge-has-the-fastest-quote-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ limitations:

faq:
- q: "Which cross-chain bridge has the lowest API latency right now?"
a: "{{best_name}} currently leads at {{best_p50}} (p50, 24h) across {{count}} measured bridges, averaged over the 4 USDC routes and 3 notional sizes the harness sweeps. The leaderboard refreshes every 5 minutes against fresh Prometheus samples; the 24h window smooths a single fast cold start so the ranking reflects sustained API performance."
a: "{{best_name}} currently returns quotes the fastest at {{best_p50}} (p50, 24h) across {{count}} measured bridges, averaged over the 4 USDC routes and 3 notional sizes the harness sweeps. The leaderboard refreshes every 5 minutes against fresh Prometheus samples; the 24h window smooths a single fast cold start so the ranking reflects sustained API performance."
- 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
2 changes: 1 addition & 1 deletion answers/which-evm-aggregator-has-the-fastest-quote.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ limitations:

faq:
- q: "Which EVM swap quote API has the lowest latency right now?"
a: "{{best_name}} currently leads at {{best_p50}} (p50 over the last 24 hours) on the active tab, across {{count}} measured providers. The leaderboard re-sorts every minute on fresh Prometheus samples, so the answer reflects measured latency on the live basket, not a marketing claim. Per chain leaders can differ from the cross chain aggregate; the chain tabs at the top of the bench page show each ranking separately."
a: "{{best_name}} currently returns quotes the fastest at {{best_p50}} (p50 over the last 24 hours) on the active tab, across {{count}} measured providers. The leaderboard re-sorts every minute on fresh Prometheus samples, so the answer reflects measured latency on the live basket, not a marketing claim. Per chain leaders can differ from the cross chain aggregate; the chain tabs at the top of the bench page show each ranking separately."
- q: "Does this measure quote quality or just speed?"
a: "Speed only. Latency is wall clock round trip from request to last byte, recorded only on a successful parseable response. Output amount in USD is not scored on this bench because providers measure it differently (Bebop is net of fees on a gasless RFQ, others are gross), and converting all outputs to a comparable USD value introduces an oracle bias the leaderboard does not want to bake into a latency comparison."
- q: "Why are some providers not on every chain?"
Expand Down
6 changes: 3 additions & 3 deletions answers/which-gas-oracle-is-the-most-accurate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ limitations:

faq:
- q: "Which gas oracle is the most accurate right now?"
a: "{{best_name}} currently leads at {{best_p50}} gwei (p99 absolute gap, 24h) on the active chain tab across 3 measured oracles. The leaderboard refreshes every minute against fresh Prometheus samples; per chain leaders can differ from the cross chain headline so the chain tabs at the top of the bench page expose each ranking separately. Read the gap alongside the covered rate column for the full picture, inclusion confidence oracles trade a wider gap for higher coverage."
a: "{{best_name}} currently posts the tightest estimate at {{best_p50}} gwei (p99 absolute gap, 24h) on the active chain tab across 3 measured oracles. The leaderboard refreshes every minute against fresh Prometheus samples; per chain leaders can differ from the cross chain headline so the chain tabs at the top of the bench page expose each ranking separately. Read the gap alongside the covered rate column for the full picture, inclusion confidence oracles trade a wider gap for higher coverage."
- q: "Why rank on p99 instead of p50?"
a: "At current fee levels the typical minute p50 gaps are fractions of a micro gwei apart across oracles. On a 100k gas transaction a 0.001 gwei error is about a thousandth of a cent, so a p50 ranking orders economically indistinguishable noise. The p99 captures the volatile minutes (mempool spikes, NFT mints, MEV bursts) where predictions actually diverge and a wrong number either overpays or misses the block. The typical p50 and p90 gaps remain visible as secondary columns."
- q: "How does Etherscan compare to PublicNode feeHistory or Owlracle?"
Expand All @@ -30,7 +30,7 @@ faq:
- q: "Why is Avalanche C-Chain excluded?"
a: "Avalanche C-Chain's auto tuning fee market drives the priority fee toward zero by design, which collapses the prediction error metric to zero across every oracle and makes the comparison non informative. BNB Chain is excluded for a different reason (it is not EIP-1559, effective fee is gasPrice only). Adding either chain would silently produce flat numbers that pollute the comparison; surfacing zero scores on a leaderboard is misleading."
- q: "Which oracle should I integrate for my wallet?"
a: "Read the p99 gap (does it blow out during spikes?) together with the covered rate (does it err on the side of inclusion or under bid?) for the chain your product runs on. {{best_name}} currently leads the active tab at {{best_p50}} gwei but the right choice depends on whether your UX tolerates over pay (then prefer high covered) or optimises for tail behaviour (then prefer low p99 gap), and whether the oracle's free quota fits your call volume. The bench gives you the live numbers, it cannot tell you which trade off your product wants."
a: "Read the p99 gap (does it blow out during spikes?) together with the covered rate (does it err on the side of inclusion or under bid?) for the chain your product runs on. {{best_name}} currently posts the smallest p99 gap on the active tab at {{best_p50}} gwei but the right choice depends on whether your UX tolerates over pay (then prefer high covered) or optimises for tail behaviour (then prefer low p99 gap), and whether the oracle's free quota fits your call volume. The bench gives you the live numbers, it cannot tell you which trade off your product wants."
- q: "How often is the leaderboard refreshed?"
a: "Per oracle polling runs continuously (12 s for PublicNode feeHistory, 15 s for Etherscan with the 6 s global gate, 60 s for Owlracle). The page reads a rolling 24 h p50, p90 and p99 every minute. A single misprediction during a gas spike cannot move the headline because the p99 window absorbs it across thousands of blocks."

Expand All @@ -40,7 +40,7 @@ related:
- which-evm-aggregator-has-the-fastest-quote

seo_title: "Which Ethereum gas oracle is the most accurate in 2026?"
seo_description: "{{best_name}} leads at {{best_p50}} gwei (p99 absolute gap, 24h) across PublicNode feeHistory, Owlracle and Etherscan on Ethereum and Polygon, measured per block by OpenChainBench."
seo_description: "{{best_name}} posts the smallest p99 gap at {{best_p50}} gwei (p99 absolute gap, 24h) across PublicNode feeHistory, Owlracle and Etherscan on Ethereum and Polygon, measured per block by OpenChainBench."
status: live

expert_take: |
Expand Down
4 changes: 2 additions & 2 deletions answers/which-l2-has-the-fastest-block-time.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ limitations:

faq:
- q: "Which L2 has the fastest block time right now?"
a: "{{best_name}} currently leads at {{best_p50}} (p50, 24h) across 9 measured L2s. The leaderboard reads a fresh p50 every minute from the Prometheus quantile over the 24 hour window, so the headline is sustained, not a single lucky head. Arbitrum One's Nitro stack runs a 250 ms sequencer interval by default, which is roughly 8x faster than the OP Stack 2 s convention used by Optimism, Base, Blast and Mantle."
a: "{{best_name}} currently posts the fastest block time at {{best_p50}} (p50, 24h) across 9 measured L2s. The leaderboard reads a fresh p50 every minute from the Prometheus quantile over the 24 hour window, so the headline is sustained, not a single lucky head. Arbitrum One's Nitro stack runs a 250 ms sequencer interval by default, which is roughly 8x faster than the OP Stack 2 s convention used by Optimism, Base, Blast and Mantle."
- q: "Why are Base and Optimism block times nearly identical?"
a: "Both run the OP Stack with the same default sequencer cadence (2 s). Blast and Mantle are also OP Stack forks and cluster at the same number; this is by design because OP Stack is a turnkey rollup framework where the sequencer interval is a configuration constant, not a chain specific design choice. The leaderboard makes the architectural family visible at a glance."
- q: "Is zkSync Era really slower than Arbitrum?"
Expand All @@ -40,5 +40,5 @@ related:
- which-gas-oracle-is-the-most-accurate

seo_title: "Which Ethereum L2 has the fastest block time in 2026?"
seo_description: "{{best_name}} leads at {{best_p50}} (p50, 24h) across Arbitrum, Optimism, Base, Blast, Mantle, zkSync, Linea, Scroll and Taiko, measured live via `newHeads` WebSocket by OpenChainBench."
seo_description: "{{best_name}} posts the fastest block time at {{best_p50}} (p50, 24h) across Arbitrum, Optimism, Base, Blast, Mantle, zkSync, Linea, Scroll and Taiko, measured live via `newHeads` WebSocket by OpenChainBench."
status: live
2 changes: 1 addition & 1 deletion answers/which-stablecoin-is-the-most-stable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ limitations:

faq:
- q: "Which stablecoin is the most stable right now?"
a: "{{best_name}} currently leads the leaderboard at {{best_p50}} (median per minute worst deviation, 24h) across {{count}} measured stablecoins on USD quoted venues. The leaderboard refreshes every minute against fresh Prometheus samples; the 24h window smooths a single off market tick so the headline reflects sustained peg stability."
a: "{{best_name}} currently holds its peg tightest at {{best_p50}} (median per minute worst deviation, 24h) across {{count}} measured stablecoins on USD quoted venues. The leaderboard refreshes every minute against fresh Prometheus samples; the 24h window smooths a single off market tick so the headline reflects sustained peg stability."
- q: "What is stablecoin peg deviation in basis points?"
a: "Peg deviation is the absolute distance between a stablecoin's price and $1.00, expressed in basis points where 1 bp equals 0.01%. A stablecoin at $0.9978 has 22 bps of deviation; at $1.0050 it has 50 bps. Tens of bps is normal noise, hundreds of bps is stress, thousands of bps is a depeg event. The bench records both per minute deviation and the worst 1% tail (p99) over 24h, the integration grade number for any product holding inventory in the stable."
- q: "How does USDC compare to USDT on stability?"
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/perp-amm-volume-share.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# OpenChainBench. Bench № 043
# OpenChainBench. Bench № 233

slug: perp-amm-volume-share
number: "043"
number: "233"
title: Perp AMM volume share, live 24h notional ranked
seo_title: "Perp DEX AMM volume 24h ranking 2026"
seo_description: "Live 24h volume in USD for AMM-style perp DEX venues: GMX V2, Gains Network, Ostium, Pacifica, SynFutures and KiloEx. Refreshed every 5 minutes. Compares pool-counterparty and synthetic models."
Expand Down
4 changes: 2 additions & 2 deletions src/app/alternatives/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -281,11 +281,11 @@ export default async function AlternativePage({
</p>
)}

{perpBenchRows.length > 0 && (
{perpBenchRows.filter((r) => r.value !== null && r.rank !== null).length > 0 && (
<section className="mt-10">
<SectionLabel>{alt.target_product} across benchmarks</SectionLabel>
<div className="mt-4">
<PerpVenueBenchCards rows={perpBenchRows} />
<PerpVenueBenchCards rows={perpBenchRows.filter((r) => r.value !== null && r.rank !== null)} />
</div>
</section>
)}
Expand Down
2 changes: 1 addition & 1 deletion src/app/answers/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ export default async function AnswerPage({
<Link className="lnk" href={`/benchmarks/${bench.slug}`}>
/benchmarks/{bench.slug}
</Link>
, refreshed every minute.
.
</p>
</section>
)}
Expand Down
2 changes: 1 addition & 1 deletion src/app/products/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export async function generateMetadata({
const benchWord = benchCount === 1 ? "benchmark" : "benchmarks";
const winWord = p.wins === 1 ? "first-place finish" : "first-place finishes";
const winSuffix = p.wins > 0 ? `, ${p.wins} ${winWord}` : "";
const fallbackDescription = `${p.name} reviewed across ${benchCount} live OpenChainBench ${benchWord}${winSuffix}. Reproducible measurements, open methodology, refreshed every minute.`;
const fallbackDescription = `${p.name} reviewed across ${benchCount} live OpenChainBench ${benchWord}${winSuffix}.`;
// Registry descriptions use markdown-flavour backticks for host names
// and code snippets (rendered as <code> in the product page body).
// Those leak into meta description and social previews as raw backticks
Expand Down
3 changes: 2 additions & 1 deletion src/lib/citation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,8 @@ export function headlineSentence(b: Benchmark): string {
const top = leader(b);
if (!top) return `${b.title}. Awaiting first run.`;
const value = fmtUnit(top.value, b.unit);
return `${top.name} leads ${b.metric.toLowerCase()} at ${value} ${windowSuffix(b.unit)} on ${b.title}.`;
const verb = b.higherIsBetter ? "leads" : "posts the lowest";
return `${top.name} ${verb} ${b.metric.toLowerCase()} at ${value} ${windowSuffix(b.unit)} on ${b.title}.`;
}

/** Pasteable attribution string. Standard convention: "<sentence> Source: OpenChainBench (url)". */
Expand Down
8 changes: 4 additions & 4 deletions src/lib/perp-venue-external.ts
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ async function fetchHyperliquidStats(): Promise<PerpVenueExternalStats> {
const vol24h = ctxs.reduce((s, c) => s + (parseFloat(c.dayNtlVlm ?? "0") || 0), 0);
const totalOI = ctxs.reduce((s, c) => s + (parseFloat(c.openInterest ?? "0") || 0), 0);
if (vol24h > 0) extraKpis.push({ label: "Volume 24h", value: fmtUsdShort(vol24h) });
if (totalOI > 0) extraKpis.push({ label: "Open Interest", value: fmtUsdShort(totalOI) });
if (totalOI > 0) extraKpis.push({ label: "OI (all markets)", value: fmtUsdShort(totalOI) });
extraKpis.push({ label: "Listed assets", value: String(meta.universe?.length ?? ctxs.length) });
}

Expand Down Expand Up @@ -330,7 +330,7 @@ async function fetchDydxStats(): Promise<PerpVenueExternalStats> {

const extraKpis: { label: string; value: string }[] = [];
if (vol24h > 0) extraKpis.push({ label: "Volume 24h", value: fmtUsdShort(vol24h) });
if (oi > 0) extraKpis.push({ label: "Open Interest", value: fmtUsdShort(oi) });
if (oi > 0) extraKpis.push({ label: "OI (all markets)", value: fmtUsdShort(oi) });
if (trades24h > 0)
extraKpis.push({ label: "Trades 24h", value: fmtCount(trades24h) });
if (markets)
Expand Down Expand Up @@ -457,7 +457,7 @@ async function fetchExtendedStats(): Promise<PerpVenueExternalStats> {

const extraKpis: { label: string; value: string }[] = [];
if (vol24h > 0) extraKpis.push({ label: "Volume 24h", value: fmtUsdShort(vol24h) });
if (oi > 0) extraKpis.push({ label: "Open Interest", value: fmtUsdShort(oi) });
if (oi > 0) extraKpis.push({ label: "OI (all markets)", value: fmtUsdShort(oi) });
if (perp.length > 0)
extraKpis.push({ label: "Perp markets", value: String(perp.length) });

Expand Down Expand Up @@ -532,7 +532,7 @@ async function fetchPolymarketStats(): Promise<PerpVenueExternalStats> {

const extraKpis: { label: string; value: string }[] = [];
if (vol24h > 0) extraKpis.push({ label: "Volume 24h", value: fmtUsdShort(vol24h) });
if (oi > 0) extraKpis.push({ label: "Open Interest", value: fmtUsdShort(oi) });
if (oi > 0) extraKpis.push({ label: "OI (all markets)", value: fmtUsdShort(oi) });
if (events.length > 0)
extraKpis.push({ label: "Active markets", value: String(events.length) });

Expand Down
Loading