Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
974366c
fix(rpc): SpecSchema-compliant YAMLs for benches 256-258 (#2211)
Flotapponnier Aug 30, 2026
73bd382
fix(bench-243): probe keyed-rpc-robinhood from Singapore
Flotapponnier Sep 1, 2026
98e4344
Merge pull request #2225 from ChainBench/feat/keyed-robinhood-sgp-prod
Flotapponnier Sep 1, 2026
9555bb7
fix(bench-243): prod is Singapore-only — no dims inherited from snaps…
Flotapponnier Sep 1, 2026
005455b
Merge pull request #2228 from ChainBench/fix/prod-sgp-only
Flotapponnier Sep 1, 2026
e89aa6a
fix(bench-243): by-region grid driven by live spec, Singapore only on…
Flotapponnier Sep 1, 2026
04cd5a8
Merge pull request #2230 from ChainBench/fix/region-grid-sgp
Flotapponnier Sep 1, 2026
2491878
feat: add OG image cards for all hub pages missing dedicated cards (#…
Flotapponnier Sep 2, 2026
ece2411
feat: add OG image cards for dynamic routes
Flotapponnier Sep 3, 2026
a94757e
Merge pull request #2236 from ChainBench/fix/og-cache-ssr-home
Flotapponnier Sep 3, 2026
f0abd07
Merge pull request #2237 from ChainBench/fix/og-cache-ssr-home-main
Flotapponnier Sep 3, 2026
5d20ec0
report: publish Robinhood Chain RPC benchmark (figures as of 2026-09-…
Flotapponnier Sep 4, 2026
a0609c1
fix(reports): default og:image to per-report dynamic image (#2257)
Flotapponnier Sep 4, 2026
cf1c7ec
report: bump Robinhood RPC publish date to 2026-09-04 (#2258)
Flotapponnier Sep 4, 2026
a374d87
fix(agg): remove chromium from Dockerfile, use sidecar for Codex JWE
Flotapponnier Sep 5, 2026
25609d6
ci: trigger Railway redeploy agg-head-lag
Flotapponnier Sep 5, 2026
1a137dc
Merge pull request #2259 from ChainBench/fix/solana-dex-volume-scope
Flotapponnier Sep 5, 2026
65b8388
Merge pull request #2260 from ChainBench/fix/bench205-main
Flotapponnier Sep 5, 2026
9e19d9c
fix(243): scope every Robinhood Chain RPC claim to the Singapore prob…
Flotapponnier Sep 8, 2026
d765ee8
fix: keep single-origin bench payloads to their pinned region, and li…
Flotapponnier Sep 8, 2026
fe6a0a0
fix: confine single-origin benches to their pinned region inside over…
Flotapponnier Sep 8, 2026
240cefe
feat(rpc): probe NOWNodes on ethereum and bnb (harness only) (#2284)
Flotapponnier Sep 9, 2026
c40a40f
feat(rpc): probe Bitcoin, LUKSO and Coreum-via-NOWNodes (harness only…
Flotapponnier Sep 9, 2026
d1ba187
feat(rpc): surface NOWNodes, Bitcoin and LUKSO on prod (#2293)
Flotapponnier Sep 9, 2026
84e70bb
bridge-monitor: 3/30 tiers + 5-route conserving loop + HL withdraw (#…
Flotapponnier Sep 9, 2026
9ed1622
feat(001): Base measured against the flashblock reference, Serialized…
Flotapponnier Sep 9, 2026
5cacbae
copy(001): name Serialized in the headline, drop the stale per-chain …
Flotapponnier Sep 10, 2026
1757b0b
bridge-monitor: fix nil-interface panic in evmClientFor (crash-looped…
Flotapponnier Sep 10, 2026
9acc114
feat(001): defer reference matching so a late reference still matches…
Flotapponnier Sep 10, 2026
73a1875
bridge-monitor: switch triangle to all-USDC (Arb leg USDT->USDC), avo…
Flotapponnier Sep 10, 2026
5cecb46
bridge-monitor: capture exec-cost metrics (realized output, quote-vs-…
Flotapponnier Sep 10, 2026
4881a1c
bridge-monitor: enable Near Intents executing bridge on main (USDC tr…
Flotapponnier Sep 10, 2026
56a482c
bridge-monitor: run Near Intents triangle in single-test too when opt…
Flotapponnier Sep 10, 2026
2f57f41
series: densify 90d/1y resolution so young benches show all available…
Flotapponnier Sep 10, 2026
c4c793f
bench: publish bridge-execution-latency (real on-chain settlement lat…
Flotapponnier Sep 10, 2026
f1ddcca
bridge-monitor: reliability metrics (stuck + refund latency) + 0-base…
Flotapponnier Sep 10, 2026
655056f
mcp: allowlist bridge execution metrics for query_prom (#2320)
Flotapponnier Sep 10, 2026
3b5114d
bridge-monitor: only record slippage-vs-quote on a real fill (skip re…
Flotapponnier Sep 10, 2026
3cadd08
bridge: exact execution latency + Near Intents (prod) (#2324)
Flotapponnier Sep 11, 2026
751a10d
bench 261 exec latency: read from ocb: recording rules (prod) (#2326)
Flotapponnier Sep 11, 2026
78bfdf6
bench 264: dedicated Solana quote-latency to prod (#2328)
Flotapponnier Sep 11, 2026
b35dc51
bench 264: add SOL->Robinhood Chain (chainId 4663, USDG cross-asset) …
Flotapponnier Sep 11, 2026
d88ff63
bench 264: correct Robinhood methodology — only Mobula quotes SOL->Ro…
Flotapponnier Sep 11, 2026
7dc6804
revert: keep bridge-execution-latency + bridge-quote-latency-solana b…
Flotapponnier Sep 11, 2026
6400040
Merge remote-tracking branch 'origin/main' into sync/main-into-dev
Flotapponnier Sep 11, 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
105 changes: 37 additions & 68 deletions benchmarks/keyed-rpc-robinhood.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ slug: keyed-rpc-robinhood
number: "243"
title: "Fastest Robinhood Chain RPC with API key, measured from Singapore: Chainstack vs Alchemy vs QuickNode"
seo_title: "Fastest Robinhood Chain RPC API key 2026 from Singapore: Chainstack vs Alchemy vs QuickNode latency"
seo_description: "Live Robinhood Chain RPC latency: Chainstack, Alchemy, and QuickNode keyed endpoints probed every 60s. First public benchmark for this Arbitrum Orbit L2."
subtitle: eth_getBlockByNumber latency against keyed Robinhood Chain endpoints (Chainstack, Alchemy, QuickNode), probed every 60 seconds.
seo_description: "Live Robinhood Chain RPC latency measured from Singapore: Chainstack, Alchemy, QuickNode keyed endpoints probed every 60s. Scoped to that probe origin."
subtitle: eth_getBlockByNumber latency against keyed Robinhood Chain endpoints (Chainstack, Alchemy, QuickNode), probed every 60 seconds from Singapore. Every figure is scoped to that origin.
category: RPCs
status: live
metric: RPC latency
Expand All @@ -18,23 +18,22 @@ seo_intro: |
subsidy running through September 2026. It is a financially-sensitive
chain with low tolerance for RPC latency.
This bench probes Chainstack, Alchemy, and QuickNode on their keyed
Robinhood Chain endpoints every 60 seconds from two probe regions
(Singapore and US-East). Chainstack posts the lowest median from the Singapore probe, the origin the
headline cites; the region tabs re-scope every figure. Round-trip latency depends on where the probe
sits relative to each provider's serving node, so no figure here is a chain-wide claim.
Robinhood Chain endpoints every 60 seconds from Singapore. Chainstack posts the lowest median
from that origin. Round-trip latency depends on where the probe sits relative to each provider's
serving node, so this ranking is scoped to the Singapore probe and is not a chain-wide claim.
This is the only independently-run public
latency benchmark for Robinhood Chain.

abstract: |
We measure the round-trip latency of eth_getBlockByNumber against the
keyed endpoints of Chainstack, Alchemy, and QuickNode on Robinhood Chain.
The probe uses a rotating JSON-RPC id to defeat edge caches, fires every
60 seconds from each probe region, and classifies each response as ok,
60 seconds from Singapore, and classifies each response as ok,
http_err, jsonrpc_err, stale, or timeout. Only ok responses contribute to
the latency distribution.

methodology:
- "Cadence: every 60 seconds per provider from each probe region (Singapore; US-East Virginia). Headline numbers cite the Singapore probe; the region tabs re-scope every figure to one origin, and provider ranking is origin-dependent. Robinhood Chain runs on the Arbitrum Orbit stack with ~100ms block times; the 60s probe cadence captures 600 blocks per hour."
- "Cadence: every 60 seconds per provider from Singapore. Every figure on this page is scoped to that origin; provider ranking is origin-dependent. Robinhood Chain runs on the Arbitrum Orbit stack with ~100ms block times; the 60s probe cadence captures 600 blocks per hour."
- "Payload: eth_getBlockByNumber('latest', false) with a rotating JSON-RPC id. Non-cacheable by design: the rotating id defeats body-keyed edge caches and forces the provider to serve a real Robinhood Chain tip."
- "Authentication: Chainstack Global Node key (node-scoped, dedicated to Robinhood Chain; key in Railway env, not in repo). Alchemy uses its standard multi-chain key. QuickNode uses its shared-endpoint key for Robinhood Chain. All keys in Railway env, not in repo."
- "Call-result classification: ok (HTTP 200 with usable block number), http_err, jsonrpc_err (HTTP 200 with error body), stale (block more than 20 behind the cross-provider tip), timeout. Latency is recorded only for ok responses."
Expand All @@ -45,31 +44,22 @@ findings:
- "{{name:alchemy}} records {{p50:alchemy}} via its edge infrastructure."
- "{{name:quicknode}} delivers {{p50:quicknode}} via its shared-endpoint fleet."

# Per-cell (region) ranking matrix for scoped badge claims. Chain is
# fixed for the whole bench, so cells key on provider and region.
rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="robinhood",tier="keyed"})

# Headline view pinned to the Singapore probe: the default (unfiltered)
# build, TL;DR, JSON-LD and OG cite the sgp slice; the US-East tab
# re-scopes on click. No "all" option on purpose — an average across a
# healthy region and a degraded one describes neither.
# Single-vantage bench: the by-region grid and any region-aware surface
# show only the Singapore probe. The us-east series still exists in
# Prometheus (staging exposes it via region tabs) but prod does not
# surface it.
aggregate_filters:
region: sgp

dimensions:
region:
- { value: sgp, label: Singapore }
- { value: us-east, label: US-East }

faq:
- q: "Which Robinhood Chain RPC provider is fastest?"
a: "From the Singapore probe: {{name:chainstack}} at {{p50:chainstack}} p50 (24h), the lowest-latency keyed provider for Robinhood Chain as measured from that origin."
- q: "What is Robinhood Chain?"
a: "Robinhood Chain (chain ID 4663) is an Arbitrum Orbit L2 built by Robinhood for tokenized equity trading. It launched on mainnet in July 2026 with ~100ms block times and a gas fee subsidy running through September 29, 2026. It supports EVM-compatible tooling and standard eth_ JSON-RPC methods."
- q: "Why is this the only Robinhood Chain latency benchmark?"
a: "Robinhood Chain is a new chain. OpenChainBench added it within days of Chainstack, Alchemy, and QuickNode support going live, making this the first and so far only independent latency measurement. Infura and Ankr do not currently list Robinhood Chain in their supported networks."
- q: "Which regions does this benchmark probe from?"
a: "Two origins: Singapore and US-East (Virginia). The headline figures cite the Singapore probe; the region tabs at the top of the page re-scope every number to a single origin. Round-trip latency depends on where the probe sits relative to each provider's serving node, so provider ranking is origin-dependent and no figure is a chain-wide claim."
- q: "Where does this benchmark probe from?"
a: "From Singapore. Round-trip latency to a keyed RPC depends on where the probe sits relative to the provider's serving node, so every figure on this page is scoped to that origin: read it as fastest from Singapore, not fastest everywhere. Additional probe regions may be added as the chain matures."

source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-keyed-latency

Expand All @@ -81,59 +71,38 @@ providers:
- slug: chainstack
name: Chainstack
tag: Global Node, keyed Robinhood Chain endpoint, plan disclosed
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s per region on Chainstack's keyed Robinhood Chain Global Node."
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s from Singapore on Chainstack's keyed Robinhood Chain Global Node."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="chainstack",chain="robinhood",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="chainstack",chain="robinhood",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="chainstack",chain="robinhood",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="chainstack",chain="robinhood",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="chainstack",chain="robinhood",tier="keyed"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="chainstack",chain="robinhood",tier="keyed"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="chainstack",chain="robinhood",tier="keyed"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="chainstack",chain="robinhood",tier="keyed",region="us-east"}[1h])
- region: sgp
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"}[1h])
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"}) / sum(ocb:rpc_call:rate_24h{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="chainstack",chain="robinhood",tier="keyed",region="sgp"}[1h]))

- slug: quicknode
name: QuickNode
tag: Shared endpoint fleet, keyed Robinhood Chain endpoint, plan disclosed
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s per region on QuickNode's keyed Robinhood Chain endpoint."
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s from Singapore on QuickNode's keyed Robinhood Chain endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="robinhood",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="quicknode",chain="robinhood",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="quicknode",chain="robinhood",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="quicknode",chain="robinhood",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="quicknode",chain="robinhood",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="quicknode",chain="robinhood",tier="keyed"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="quicknode",chain="robinhood",tier="keyed"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="robinhood",tier="keyed"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="robinhood",tier="keyed",region="us-east"}[1h])
- region: sgp
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"}[1h])
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"}) / sum(ocb:rpc_call:rate_24h{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="quicknode",chain="robinhood",tier="keyed",region="sgp"}[1h]))

- slug: alchemy
name: Alchemy
tag: 30M CU/mo free, keyed Robinhood Chain endpoint
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s per region on Alchemy's keyed Robinhood Chain endpoint."
formula: "p50 over 24h of round-trip latency (ms) for eth_getBlockByNumber probed every 60s from Singapore on Alchemy's keyed Robinhood Chain endpoint."
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="robinhood",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="alchemy",chain="robinhood",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="alchemy",chain="robinhood",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="alchemy",chain="robinhood",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="alchemy",chain="robinhood",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="alchemy",chain="robinhood",tier="keyed"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="alchemy",chain="robinhood",tier="keyed"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="alchemy",chain="robinhood",tier="keyed"}[1h]))
regions:
- region: us-east
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"})
series: avg_over_time(rpc_latency_milliseconds{provider="alchemy",chain="robinhood",tier="keyed",region="us-east"}[1h])
- region: sgp
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"})
series: avg_over_time(rpc_latency_milliseconds{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"}[1h])
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"}) / sum(ocb:rpc_call:rate_24h{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"})
sample_size: sum(ocb:rpc_call:increase_24h{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"})
series: avg(avg_over_time(rpc_latency_milliseconds{provider="alchemy",chain="robinhood",tier="keyed",region="sgp"}[1h]))
4 changes: 0 additions & 4 deletions harnesses/aggregator-head-lag/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,8 @@ FROM debian:bookworm-slim

WORKDIR /app

# Install runtime dependencies + Chromium for in-process JWE scraping
RUN apt-get update && apt-get install -y \
ca-certificates \
chromium \
chromium-sandbox \
fonts-liberation \
&& rm -rf /var/lib/apt/lists/*

# Copy binary from builder
Expand Down
14 changes: 4 additions & 10 deletions src/app/reports/[category]/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,9 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
if (!report) return {};

const canonical = `${SITE.url}/reports/${category}/${slug}`;
// Use the per-report OG card (dynamic opengraph-image.tsx in this
// segment) as the default, NOT the site-wide /opengraph-image. Setting
// openGraph.images explicitly here shadows Next's file convention, so
// without this the bespoke titled card was never emitted and every
// report shared the generic site thumbnail on X / LinkedIn / SERP.
const ogImage =
report.ogImage ?? `${SITE.url}/reports/${category}/${slug}/opengraph-image`;
// Default to the per-report dynamic OG image (opengraph-image.tsx in this
// segment), not the site-wide generic one.
const ogImage = report.ogImage ?? `${canonical}/opengraph-image`;
const social = `${report.title} · OpenChainBench`;

return {
Expand Down Expand Up @@ -270,9 +266,7 @@ function reportJsonLd(report: ReturnType<typeof getReport>) {
description: report.summary,
datePublished: new Date(report.publishedAt).toISOString(),
dateModified: new Date(report.publishedAt).toISOString(),
image:
report.ogImage ??
`${SITE.url}/reports/${report.categorySlug}/${report.slug}/opengraph-image`,
image: report.ogImage ?? `${SITE.url}/opengraph-image`,
author: { "@id": PERSON_ID },
publisher: { "@id": `${SITE.url}/#org` },
inLanguage: "en",
Expand Down
Loading
Loading