From 26c5b4ed1571aab84e2314fec4412c8a5c96e535 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Fri, 28 Aug 2026 01:38:51 +0200 Subject: [PATCH 1/2] feat(rpc): add Litecoin, Babylon, Acala, Interlay benches (#246-249) --- benchmarks/acala-rpc.yml | 136 +++++++++++++++++ benchmarks/babylon-rpc.yml | 136 +++++++++++++++++ benchmarks/interlay-rpc.yml | 136 +++++++++++++++++ benchmarks/litecoin-rpc.yml | 142 ++++++++++++++++++ .../rpc-capabilities/cmd/script/config.go | 44 ++++++ .../rpc-capabilities/cmd/script/probe.go | 89 ++++++++++- public/logos/acala.svg | 4 + public/logos/babylon.svg | 4 + public/logos/interlay.svg | 4 + public/logos/litecoinspace.svg | 4 + src/data/provider-registry.ts | 15 ++ src/lib/brand.ts | 7 + src/lib/logo-manifest.ts | 9 ++ 13 files changed, 729 insertions(+), 1 deletion(-) create mode 100644 benchmarks/acala-rpc.yml create mode 100644 benchmarks/babylon-rpc.yml create mode 100644 benchmarks/interlay-rpc.yml create mode 100644 benchmarks/litecoin-rpc.yml create mode 100644 public/logos/acala.svg create mode 100644 public/logos/babylon.svg create mode 100644 public/logos/interlay.svg create mode 100644 public/logos/litecoinspace.svg diff --git a/benchmarks/acala-rpc.yml b/benchmarks/acala-rpc.yml new file mode 100644 index 00000000..0fb3d9a4 --- /dev/null +++ b/benchmarks/acala-rpc.yml @@ -0,0 +1,136 @@ +# OpenChainBench. Bench No 248 + +slug: acala-rpc +number: "248" +title: Fastest free Acala RPC, live no-key endpoint latency +seo_title: "Fastest free Acala RPC 2026" +seo_description: "{{best_name}} leads free Acala RPC at {{best_p50}} (block height p50, 24h). 3 providers measured every 60s from 3 regions." +subtitle: HTTP round-trip latency for Substrate chain_getHeader queries against every available public Acala endpoint, audited every 60 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Acala is the DeFi hub of the Polkadot ecosystem — a Polkadot parachain providing decentralized stablecoin (aUSD), liquid staking (LDOT), and an EVM-compatible execution environment. Acala uses the Substrate framework and exposes a standard Substrate JSON-RPC interface; block height is queried via chain_getHeader. Public endpoints are available without an API key from OnFinality, Dwellir, and PublicNode. Every provider was live-verified with consecutive block-height probes at launch. + +abstract: | + Per-chain member of the RPC latency cluster, extended to Acala. + We measure the round-trip latency of a Substrate chain_getHeader query against + every available public Acala endpoint that sustains continuous probing: + 3 providers at launch, every 60 seconds, from us-east, eu-west and + Singapore. Each provider is probed via a JSON-RPC POST (chain_getHeader) + from which the block number is extracted. + The harness classifies every response (ok / http_err / jsonrpc_err / stale / timeout) + with a Polkadot-scaled staleness gap (40 blocks, around 8 min at 12 s/block). + The cross-chain view lives on the parent rpc-capabilities benchmark; + this page is the Acala-scoped answer with per-region breakdowns as + a first-class dimension. + +methodology: + - "Cadence: every 60 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus avg(quantile_over_time(...)); per-region breakdowns are first-class on this page via the region tabs." + - "Payload: {\"jsonrpc\":\"2.0\",\"id\":,\"method\":\"chain_getHeader\",\"params\":[]}. The result contains a number field (hex-encoded block number)." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms to 10 s), so percentiles are computed via Prometheus quantile_over_time over the last 24 hours." + - "Call-result classification: ok (parsable block height returned), http_err, jsonrpc_err, stale (block more than 40 behind the cross-provider tip), timeout." + - "This page is part of the per-chain RPC cluster derived from the cross-chain rpc-capabilities benchmark; the identical harness, cadence and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=acala. Provider coverage at launch: 3 endpoints (OnFinality, Dwellir, PublicNode)." + +findings: + - "{{best_name}} currently leads Acala RPC at {{best_p50}} (chain_getHeader p50, 24h) across 3 measured providers." + +faq: + - q: "What is the fastest free Acala RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (Acala block height p50 over the last 24h), measured against 3 providers probed every 60 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples." + - q: "Which Acala RPC endpoints work without an API key?" + a: "3 endpoints sustain continuous keyless probing at launch: OnFinality (acala.api.onfinality.io/public), Dwellir (acala-rpc.n.dwellir.com) and PublicNode (acala-rpc.publicnode.com). Every listed endpoint was live-verified before inclusion." + - q: "Does the fastest Acala RPC change by region?" + a: "Often. OnFinality has a global CDN, Dwellir is Europe-focused, and PublicNode has dedicated nodes per region. Rankings shift significantly depending on your geographic origin. The region tabs re-scope every number to a single origin." + - q: "How does Acala RPC latency compare to other Polkadot parachains?" + a: "All Polkadot parachains use the same Substrate JSON-RPC probe (chain_getHeader) and the same 3 keyless providers (OnFinality, Dwellir, PublicNode), making latency directly comparable. The parent rpc-capabilities benchmark shows the cross-chain view." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="acala"}) + +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: onfinality + name: OnFinality + tag: OnFinality public Acala RPC, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a chain_getHeader POST sent every 60s from 3 regions to acala.api.onfinality.io/public." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="onfinality", chain="acala"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="onfinality", chain="acala"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="onfinality", chain="acala"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="onfinality", chain="acala"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="onfinality", chain="acala"}) / sum(ocb:rpc_call:rate_24h{provider="onfinality", chain="acala"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="onfinality", chain="acala"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="onfinality", chain="acala"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="onfinality", chain="acala", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="onfinality", chain="acala", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="onfinality", chain="acala", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="onfinality", chain="acala", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="onfinality", chain="acala", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="onfinality", chain="acala", region="sgp"}[1h]) + + - slug: dwellir + name: Dwellir + tag: Dwellir public Acala RPC, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a chain_getHeader POST sent every 60s from 3 regions to acala-rpc.n.dwellir.com." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir", chain="acala"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir", chain="acala"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir", chain="acala"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir", chain="acala"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir", chain="acala"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir", chain="acala"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir", chain="acala"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir", chain="acala"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir", chain="acala", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="dwellir", chain="acala", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir", chain="acala", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="dwellir", chain="acala", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir", chain="acala", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="dwellir", chain="acala", region="sgp"}[1h]) + + - slug: publicnode + name: PublicNode + tag: PublicNode public Acala RPC, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a chain_getHeader POST sent every 60s from 3 regions to acala-rpc.publicnode.com." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="acala"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="acala"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="acala"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="acala"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="acala"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="acala"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="acala"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="acala"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="acala", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="acala", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="acala", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="acala", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="acala", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="acala", region="sgp"}[1h]) diff --git a/benchmarks/babylon-rpc.yml b/benchmarks/babylon-rpc.yml new file mode 100644 index 00000000..6a96a56a --- /dev/null +++ b/benchmarks/babylon-rpc.yml @@ -0,0 +1,136 @@ +# OpenChainBench. Bench No 247 + +slug: babylon-rpc +number: "247" +title: Fastest free Babylon RPC, live no-key endpoint latency +seo_title: "Fastest free Babylon RPC 2026" +seo_description: "{{best_name}} leads free Babylon RPC at {{best_p50}} (block height p50, 24h). 3 providers measured every 60s from 3 regions." +subtitle: HTTP round-trip latency for Tendermint status queries against every available public Babylon endpoint, audited every 60 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Babylon is a Cosmos SDK proof-of-stake blockchain that enables Bitcoin staking — BTC holders can stake their coins to provide economic security to Babylon and other PoS chains without moving their Bitcoin off the Bitcoin network. Babylon uses the CometBFT consensus engine and exposes a standard Tendermint RPC interface. Public endpoints are available without an API key from PublicNode, Polkachu, and LavenderFive. Every provider was live-verified with consecutive block-height probes at launch. + +abstract: | + Per-chain member of the RPC latency cluster, extended to Babylon. + We measure the round-trip latency of a Tendermint status query against + every available public Babylon endpoint that sustains continuous probing: + 3 providers at launch, every 60 seconds, from us-east, eu-west and + Singapore. Each provider is probed via a GET request to its + /status endpoint, from which the latest_block_height field is read. + The harness classifies every response (ok / http_err / jsonrpc_err / stale / timeout) + with a Cosmos-scaled staleness gap (40 blocks, around 4 min at 6 s/block). + The cross-chain view lives on the parent rpc-capabilities benchmark; + this page is the Babylon-scoped answer with per-region breakdowns as + a first-class dimension. + +methodology: + - "Cadence: every 60 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus avg(quantile_over_time(...)); per-region breakdowns are first-class on this page via the region tabs." + - "Payload: GET /status. Returns a Tendermint status JSON object; block height is read from result.sync_info.latest_block_height." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms to 10 s), so percentiles are computed via Prometheus quantile_over_time over the last 24 hours." + - "Call-result classification: ok (parsable block height returned), http_err, jsonrpc_err, stale (block more than 40 behind the cross-provider tip), timeout." + - "This page is part of the per-chain RPC cluster derived from the cross-chain rpc-capabilities benchmark; the identical harness, cadence and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=babylon. Provider coverage at launch: 3 endpoints (PublicNode, Polkachu, LavenderFive)." + +findings: + - "{{best_name}} currently leads Babylon RPC at {{best_p50}} (Tendermint status p50, 24h) across 3 measured providers." + +faq: + - q: "What is the fastest free Babylon RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (Babylon block height p50 over the last 24h), measured against 3 providers probed every 60 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples." + - q: "Which Babylon RPC endpoints work without an API key?" + a: "3 endpoints sustain continuous keyless probing at launch: PublicNode (babylon-rpc.publicnode.com), Polkachu (babylon-rpc.polkachu.com) and LavenderFive (rpc.lavenderfive.com/babylon). Every listed endpoint was live-verified with a block-height probe returning a parsable result before inclusion." + - q: "What is Babylon and why does its RPC latency matter?" + a: "Babylon is a Cosmos SDK chain that enables native Bitcoin staking. Developers building on Babylon or integrating its Bitcoin staking protocol need reliable low-latency RPC access to query chain state, submit transactions, and monitor finality. Knowing which public endpoint is fastest from your region helps optimize integration performance." + - q: "Does the fastest Babylon RPC change by region?" + a: "Often. PublicNode, Polkachu, and LavenderFive all have different infrastructure footprints; rankings shift by geographic origin. The region tabs re-scope every number to a single origin." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="babylon"}) + +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: PublicNode public Babylon RPC, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a Tendermint status GET sent every 60s from 3 regions to babylon-rpc.publicnode.com." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="babylon"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="babylon"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="babylon"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="babylon"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="babylon"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="babylon"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="babylon"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="babylon"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="babylon", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="babylon", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="babylon", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="babylon", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="babylon", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="babylon", region="sgp"}[1h]) + + - slug: polkachu + name: Polkachu + tag: Polkachu public Babylon RPC, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a Tendermint status GET sent every 60s from 3 regions to babylon-rpc.polkachu.com." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="polkachu", chain="babylon"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="polkachu", chain="babylon"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="polkachu", chain="babylon"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="polkachu", chain="babylon"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="polkachu", chain="babylon"}) / sum(ocb:rpc_call:rate_24h{provider="polkachu", chain="babylon"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="polkachu", chain="babylon"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="polkachu", chain="babylon"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="polkachu", chain="babylon", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="polkachu", chain="babylon", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="polkachu", chain="babylon", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="polkachu", chain="babylon", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="polkachu", chain="babylon", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="polkachu", chain="babylon", region="sgp"}[1h]) + + - slug: lavenderfive + name: LavenderFive + tag: LavenderFive public Babylon RPC, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a Tendermint status GET sent every 60s from 3 regions to rpc.lavenderfive.com/babylon." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lavenderfive", chain="babylon"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="lavenderfive", chain="babylon"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="lavenderfive", chain="babylon"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="lavenderfive", chain="babylon"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="lavenderfive", chain="babylon"}) / sum(ocb:rpc_call:rate_24h{provider="lavenderfive", chain="babylon"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="lavenderfive", chain="babylon"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="lavenderfive", chain="babylon"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lavenderfive", chain="babylon", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lavenderfive", chain="babylon", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lavenderfive", chain="babylon", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lavenderfive", chain="babylon", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lavenderfive", chain="babylon", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lavenderfive", chain="babylon", region="sgp"}[1h]) diff --git a/benchmarks/interlay-rpc.yml b/benchmarks/interlay-rpc.yml new file mode 100644 index 00000000..f25adbd6 --- /dev/null +++ b/benchmarks/interlay-rpc.yml @@ -0,0 +1,136 @@ +# OpenChainBench. Bench No 249 + +slug: interlay-rpc +number: "249" +title: Fastest free Interlay RPC, live no-key endpoint latency +seo_title: "Fastest free Interlay RPC 2026" +seo_description: "{{best_name}} leads free Interlay RPC at {{best_p50}} (block height p50, 24h). 3 providers measured every 60s from 3 regions." +subtitle: HTTP round-trip latency for Substrate chain_getHeader queries against every available public Interlay endpoint, audited every 60 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Interlay is a Polkadot parachain that brings trustless Bitcoin to DeFi — it issues iBTC, a fully Bitcoin-backed asset, by locking BTC in a decentralized vault system without wrapping or custodians. Interlay uses the Substrate framework and exposes a standard Substrate JSON-RPC interface; block height is queried via chain_getHeader. Public endpoints are available without an API key from OnFinality, Dwellir, and the Interlay official node. Every provider was live-verified with consecutive block-height probes at launch. + +abstract: | + Per-chain member of the RPC latency cluster, extended to Interlay. + We measure the round-trip latency of a Substrate chain_getHeader query against + every available public Interlay endpoint that sustains continuous probing: + 3 providers at launch, every 60 seconds, from us-east, eu-west and + Singapore. Each provider is probed via a JSON-RPC POST (chain_getHeader) + from which the block number is extracted. + The harness classifies every response (ok / http_err / jsonrpc_err / stale / timeout) + with a Polkadot-scaled staleness gap (40 blocks, around 8 min at 12 s/block). + The cross-chain view lives on the parent rpc-capabilities benchmark; + this page is the Interlay-scoped answer with per-region breakdowns as + a first-class dimension. + +methodology: + - "Cadence: every 60 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus avg(quantile_over_time(...)); per-region breakdowns are first-class on this page via the region tabs." + - "Payload: {\"jsonrpc\":\"2.0\",\"id\":,\"method\":\"chain_getHeader\",\"params\":[]}. The result contains a number field (hex-encoded block number)." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms to 10 s), so percentiles are computed via Prometheus quantile_over_time over the last 24 hours." + - "Call-result classification: ok (parsable block height returned), http_err, jsonrpc_err, stale (block more than 40 behind the cross-provider tip), timeout." + - "This page is part of the per-chain RPC cluster derived from the cross-chain rpc-capabilities benchmark; the identical harness, cadence and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=interlay. Provider coverage at launch: 3 endpoints (OnFinality, Dwellir, Interlay official)." + +findings: + - "{{best_name}} currently leads Interlay RPC at {{best_p50}} (chain_getHeader p50, 24h) across 3 measured providers." + +faq: + - q: "What is the fastest free Interlay RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (Interlay block height p50 over the last 24h), measured against 3 providers probed every 60 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples." + - q: "Which Interlay RPC endpoints work without an API key?" + a: "3 endpoints sustain continuous keyless probing at launch: OnFinality (interlay-parachain.api.onfinality.io/public), Dwellir (interlay-rpc.n.dwellir.com) and the Interlay official node (api.interlay.io/parachain). Every listed endpoint was live-verified before inclusion." + - q: "What is Interlay and why does its RPC latency matter?" + a: "Interlay issues iBTC, a 1:1 Bitcoin-backed asset on Polkadot secured by decentralized vaults. Developers integrating iBTC, building vault monitoring tools, or querying collateral positions need reliable low-latency RPC access. Knowing which public endpoint is fastest from your region matters for application responsiveness." + - q: "Does the fastest Interlay RPC change by region?" + a: "Often. OnFinality has a global CDN, Dwellir is Europe-focused, and the Interlay official node has fixed infrastructure. Rankings shift by geographic origin. The region tabs re-scope every number to a single origin." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="interlay"}) + +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: onfinality + name: OnFinality + tag: OnFinality public Interlay RPC, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a chain_getHeader POST sent every 60s from 3 regions to interlay-parachain.api.onfinality.io/public." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="onfinality", chain="interlay"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="onfinality", chain="interlay"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="onfinality", chain="interlay"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="onfinality", chain="interlay"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="onfinality", chain="interlay"}) / sum(ocb:rpc_call:rate_24h{provider="onfinality", chain="interlay"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="onfinality", chain="interlay"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="onfinality", chain="interlay"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="onfinality", chain="interlay", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="onfinality", chain="interlay", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="onfinality", chain="interlay", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="onfinality", chain="interlay", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="onfinality", chain="interlay", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="onfinality", chain="interlay", region="sgp"}[1h]) + + - slug: dwellir + name: Dwellir + tag: Dwellir public Interlay RPC, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a chain_getHeader POST sent every 60s from 3 regions to interlay-rpc.n.dwellir.com." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir", chain="interlay"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir", chain="interlay"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir", chain="interlay"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir", chain="interlay"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir", chain="interlay"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir", chain="interlay"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="dwellir", chain="interlay"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="dwellir", chain="interlay"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir", chain="interlay", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="dwellir", chain="interlay", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir", chain="interlay", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="dwellir", chain="interlay", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir", chain="interlay", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="dwellir", chain="interlay", region="sgp"}[1h]) + + - slug: interlay-official + name: Interlay + tag: Interlay official public RPC node, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a chain_getHeader POST sent every 60s from 3 regions to api.interlay.io/parachain." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="interlay-official", chain="interlay"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="interlay-official", chain="interlay"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="interlay-official", chain="interlay"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="interlay-official", chain="interlay"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="interlay-official", chain="interlay"}) / sum(ocb:rpc_call:rate_24h{provider="interlay-official", chain="interlay"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="interlay-official", chain="interlay"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="interlay-official", chain="interlay"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="interlay-official", chain="interlay", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="interlay-official", chain="interlay", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="interlay-official", chain="interlay", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="interlay-official", chain="interlay", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="interlay-official", chain="interlay", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="interlay-official", chain="interlay", region="sgp"}[1h]) diff --git a/benchmarks/litecoin-rpc.yml b/benchmarks/litecoin-rpc.yml new file mode 100644 index 00000000..d2c376a2 --- /dev/null +++ b/benchmarks/litecoin-rpc.yml @@ -0,0 +1,142 @@ +# OpenChainBench. Bench No 246 + +slug: litecoin-rpc +number: "246" +title: Fastest free Litecoin RPC, live no-key endpoint latency +seo_title: "Fastest free Litecoin RPC 2026" +seo_description: "{{best_name}} leads free Litecoin RPC at {{best_p50}} (getblockcount p50, 24h). 3 providers measured every 60s from 3 regions." +subtitle: HTTP round-trip latency for block-height queries against every available public Litecoin endpoint, audited every 60 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Litecoin is a proof-of-work UTXO blockchain forked from Bitcoin in October 2011; it targets one block every 150 seconds using the Scrypt hashing algorithm. Litecoin exposes a Bitcoin-compatible JSON-RPC interface; the canonical height method is getblockcount. Public endpoints are available without an API key from Tatum (JSON-RPC gateway), BlockCypher (REST GET of its blockchain info endpoint) and LitecoinSpace (Esplora REST GET returning a plain block-height integer). Every provider was live-verified with consecutive block-height probes at launch. + +abstract: | + Per-chain member of the RPC latency cluster, extended to Litecoin. + We measure the round-trip latency of a block-height query against + every available public Litecoin endpoint that sustains continuous probing: + 3 providers at launch, every 60 seconds, from us-east, eu-west and + Singapore. Tatum is probed via JSON-RPC POST (getblockcount). + BlockCypher is probed via REST GET of its blockchain info endpoint + (height field). LitecoinSpace is probed via Esplora REST GET returning + a plain block-height integer. + The harness classifies every response (ok / http_err / jsonrpc_err / stale / timeout) + with a Litecoin-scaled staleness gap (4 blocks, around 10 min at 150 s/block). + The cross-chain view lives on the parent rpc-capabilities benchmark; + this page is the Litecoin-scoped answer with per-region breakdowns as + a first-class dimension. + +methodology: + - "Cadence: every 60 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus avg(quantile_over_time(...)); per-region breakdowns are first-class on this page via the region tabs." + - "Payload (Tatum): {\"jsonrpc\":\"2.0\",\"id\":,\"method\":\"getblockcount\",\"params\":[]}. Plain HTTP POST. The result is a decimal integer." + - "Payload (BlockCypher): GET https://api.blockcypher.com/v1/ltc/main. Returns a JSON object with a height field containing the current block height." + - "Payload (LitecoinSpace): GET https://litecoinspace.org/api/blocks/tip/height. Returns the block height as a plain ASCII integer with no JSON wrapping." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms to 10 s), so percentiles are computed via Prometheus quantile_over_time over the last 24 hours." + - "Call-result classification: ok (parsable block height returned), http_err, jsonrpc_err, stale (block more than 4 behind the cross-provider tip), timeout. Latency without reliability is a misleading ranking signal." + - "This page is part of the per-chain RPC cluster derived from the cross-chain rpc-capabilities benchmark; the identical harness, cadence and exclusion rules apply on every chain." + - "Chain scope: every query on this page is pinned to chain=litecoin. Provider coverage at launch: 3 endpoints (Tatum, BlockCypher, LitecoinSpace)." + +findings: + - "{{best_name}} currently leads Litecoin RPC at {{best_p50}} (getblockcount p50, 24h) across 3 measured providers." + +faq: + - q: "What is the fastest free Litecoin RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (Litecoin block count p50 over the last 24h), measured against 3 providers probed every 60 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples." + - q: "Which Litecoin RPC endpoints work without an API key?" + a: "3 endpoints sustain continuous keyless probing at launch: Tatum (litecoin-mainnet.gateway.tatum.io, JSON-RPC), BlockCypher (api.blockcypher.com/v1/ltc/main, REST GET) and LitecoinSpace (litecoinspace.org/api/blocks/tip/height, Esplora REST). Every listed endpoint was live-verified with a block-height probe returning a parsable result before inclusion." + - q: "Does the fastest Litecoin RPC change by region?" + a: "Often. Tatum and BlockCypher have fixed infrastructure so their latency rankings shift with geographic origin. The region tabs at the top of the page re-scope every number to a single origin." + - q: "How is Litecoin RPC latency measured here, technically?" + a: "One block-height probe every 60 seconds against each provider from each of 3 regions. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus quantile_over_time over 24 hours. Tatum uses JSON-RPC POST (getblockcount); BlockCypher uses REST GET (height field); LitecoinSpace uses Esplora REST GET returning a plain integer." + - q: "Why does LitecoinSpace return a plain integer instead of JSON?" + a: "LitecoinSpace is built on the Esplora block explorer API, which exposes the current tip height at /api/blocks/tip/height as a raw ASCII integer with no JSON envelope. This is the same format used by mempool.space for Bitcoin. The harness reads the body directly and parses it as a uint64." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="litecoin"}) + +dimensions: + region: + - { value: all, label: All regions } + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: tatum + name: Tatum + tag: Tatum public Litecoin RPC gateway, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a getblockcount POST sent every 60s from 3 regions to litecoin-mainnet.gateway.tatum.io." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tatum", chain="litecoin"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="tatum", chain="litecoin"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="tatum", chain="litecoin"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="tatum", chain="litecoin"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="tatum", chain="litecoin"}) / sum(ocb:rpc_call:rate_24h{provider="tatum", chain="litecoin"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="tatum", chain="litecoin"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="tatum", chain="litecoin"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tatum", chain="litecoin", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tatum", chain="litecoin", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tatum", chain="litecoin", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tatum", chain="litecoin", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="tatum", chain="litecoin", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="tatum", chain="litecoin", region="sgp"}[1h]) + + - slug: blockcypher + name: BlockCypher + tag: BlockCypher public Litecoin REST API, no API key required for basic queries + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a GET request sent every 60s from 3 regions to api.blockcypher.com/v1/ltc/main." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="blockcypher", chain="litecoin"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="blockcypher", chain="litecoin"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="blockcypher", chain="litecoin"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="blockcypher", chain="litecoin"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="blockcypher", chain="litecoin"}) / sum(ocb:rpc_call:rate_24h{provider="blockcypher", chain="litecoin"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="blockcypher", chain="litecoin"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="blockcypher", chain="litecoin"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="blockcypher", chain="litecoin", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="blockcypher", chain="litecoin", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="blockcypher", chain="litecoin", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="blockcypher", chain="litecoin", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="blockcypher", chain="litecoin", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="blockcypher", chain="litecoin", region="sgp"}[1h]) + + - slug: litecoinspace + name: LitecoinSpace + tag: LitecoinSpace Esplora public API, no API key required + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a GET request sent every 60s from 3 regions to litecoinspace.org/api/blocks/tip/height." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="litecoinspace", chain="litecoin"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="litecoinspace", chain="litecoin"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="litecoinspace", chain="litecoin"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="litecoinspace", chain="litecoin"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="litecoinspace", chain="litecoin"}) / sum(ocb:rpc_call:rate_24h{provider="litecoinspace", chain="litecoin"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="litecoinspace", chain="litecoin"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="litecoinspace", chain="litecoin"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="litecoinspace", chain="litecoin", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="litecoinspace", chain="litecoin", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="litecoinspace", chain="litecoin", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="litecoinspace", chain="litecoin", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="litecoinspace", chain="litecoin", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="litecoinspace", chain="litecoin", region="sgp"}[1h]) diff --git a/harnesses/rpc-capabilities/cmd/script/config.go b/harnesses/rpc-capabilities/cmd/script/config.go index b8df721c..554cc9b9 100644 --- a/harnesses/rpc-capabilities/cmd/script/config.go +++ b/harnesses/rpc-capabilities/cmd/script/config.go @@ -1629,6 +1629,50 @@ func chains() []Chain { {Slug: "ngd2", Name: "NGD (2)", URL: envDefault("RPC_URL_NEO_NGD2", "https://n3seed2.ngd.network:10332")}, }, }, + // 2026-08-27 wave-10. Litecoin — Tatum JSON-RPC (getblockcount) + BlockCypher REST + LitecoinSpace Esplora REST. ~150 s/block. + { + Slug: "litecoin", + Name: "Litecoin", + Kind: "litecoin", + Providers: []Provider{ + {Slug: "tatum", Name: "Tatum", URL: envDefault("RPC_URL_LTC_TATUM", "https://litecoin-mainnet.gateway.tatum.io")}, + {Slug: "blockcypher", Name: "BlockCypher", URL: envDefault("RPC_URL_LTC_BLOCKCYPHER", "https://api.blockcypher.com/v1/ltc/main")}, + {Slug: "litecoinspace", Name: "LitecoinSpace", URL: envDefault("RPC_URL_LTC_LITECOINSPACE", "https://litecoinspace.org/api/blocks/tip/height")}, + }, + }, + // 2026-08-27 wave-10. Babylon — Cosmos SDK, Tendermint /status. PublicNode + Polkachu + LavenderFive. + { + Slug: "babylon", + Name: "Babylon", + Kind: "cosmos", + Providers: []Provider{ + {Slug: "publicnode", Name: "PublicNode", URL: envDefault("RPC_URL_BABYLON_PUBLICNODE", "https://babylon-rpc.publicnode.com")}, + {Slug: "polkachu", Name: "Polkachu", URL: envDefault("RPC_URL_BABYLON_POLKACHU", "https://babylon-rpc.polkachu.com")}, + {Slug: "lavenderfive", Name: "LavenderFive", URL: envDefault("RPC_URL_BABYLON_LAVENDERFIVE", "https://rpc.lavenderfive.com:443/babylon")}, + }, + }, + // 2026-08-27 wave-10. Acala — Polkadot parachain, chain_getHeader. OnFinality + Dwellir + PublicNode. + { + Slug: "acala", + Name: "Acala", + Kind: "polkadot", + Providers: []Provider{ + {Slug: "onfinality", Name: "OnFinality", URL: envDefault("RPC_URL_ACALA_ONFINALITY", "https://acala.api.onfinality.io/public")}, + {Slug: "dwellir", Name: "Dwellir", URL: envDefault("RPC_URL_ACALA_DWELLIR", "https://acala-rpc.n.dwellir.com")}, + {Slug: "publicnode", Name: "PublicNode", URL: envDefault("RPC_URL_ACALA_PUBLICNODE", "https://acala-rpc.publicnode.com")}, + }, + }, + // 2026-08-27 wave-10. Interlay — Polkadot parachain, chain_getHeader. OnFinality + Dwellir + Interlay official. + { + Slug: "interlay", + Name: "Interlay", + Kind: "polkadot", + Providers: []Provider{ + {Slug: "onfinality", Name: "OnFinality", URL: envDefault("RPC_URL_INTERLAY_ONFINALITY", "https://interlay-parachain.api.onfinality.io/public")}, + {Slug: "dwellir", Name: "Dwellir", URL: envDefault("RPC_URL_INTERLAY_DWELLIR", "https://interlay-rpc.n.dwellir.com")}, + {Slug: "interlay-official", Name: "Interlay", URL: envDefault("RPC_URL_INTERLAY_OFFICIAL", "https://api.interlay.io/parachain")}, + }, + }, // 2026-08-27 wave-10. Zcash — getblockcount JSON-RPC (Tatum zcashd + Tatum Zebra) + Blockchair REST GET. ~75 s/block. { Slug: "zcash", diff --git a/harnesses/rpc-capabilities/cmd/script/probe.go b/harnesses/rpc-capabilities/cmd/script/probe.go index fbbc9c48..6a2569e2 100644 --- a/harnesses/rpc-capabilities/cmd/script/probe.go +++ b/harnesses/rpc-capabilities/cmd/script/probe.go @@ -98,6 +98,9 @@ const ( // bitcoinCashStaleBlockGap: BCH targets one block every ~600 s, // so 2 blocks ≈ 20 min gives tolerance for normal variance. bitcoinCashStaleBlockGap uint64 = 2 + // litecoinStaleBlockGap: Litecoin targets one block every ~150 s, + // so 4 blocks ≈ 10 min. + litecoinStaleBlockGap uint64 = 4 // veChainStaleBlockGap: VeChain produces one block every ~10 s, // so 30 blocks ≈ 5 min. veChainStaleBlockGap uint64 = 30 @@ -309,6 +312,14 @@ func probeOne(ctx context.Context, c Chain, p Provider) { } else { block, result, latency, err = callBCHNodeInfo(probeCtx, p.URL) } + case "litecoin": + if strings.Contains(p.URL, "blockcypher.com") { + block, result, latency, err = callBlockCypherLTC(probeCtx, p.URL) + } else if strings.Contains(p.URL, "litecoinspace.org") { + block, result, latency, err = callLitecoinSpaceAPI(probeCtx, p.URL) + } else { + block, result, latency, err = callNeoBlockCount(probeCtx, p.URL) + } case "tezos": block, result, latency, err = callTezosBlock(probeCtx, p.URL) case "antelope": @@ -364,6 +375,8 @@ func probeOne(ctx context.Context, c Chain, p Provider) { gap = dogecoinStaleBlockGap case "bitcoin-cash": gap = bitcoinCashStaleBlockGap + case "litecoin": + gap = litecoinStaleBlockGap case "tezos": gap = tezosStaleBlockGap case "antelope": @@ -393,7 +406,7 @@ func probeOne(ctx context.Context, c Chain, p Provider) { case "solana", "polkadot", "cosmos", "starknet", "stellar", "sui", "aptos", "xrpl", "algorand", "gram", "near", "flow", "hedera", "ckb", "multiversx", "neo", - "tezos", "antelope", "waves", "vechain", "dogecoin", "zcash", "bitcoin-cash": + "tezos", "antelope", "waves", "vechain", "dogecoin", "zcash", "bitcoin-cash", "litecoin": // no consensus participation default: if result == "ok" || result == "stale" { @@ -1685,3 +1698,77 @@ func callBlockCypherDoge(ctx context.Context, url string) (height uint64, result } return body.Height, "ok", latencyMs, nil } + +// callBlockCypherLTC probes the BlockCypher REST API for Litecoin mainnet. +// GET https://api.blockcypher.com/v1/ltc/main — reads the `height` field. +func callBlockCypherLTC(ctx context.Context, url string) (height uint64, result string, latencyMs float64, err error) { + req, _ := http.NewRequestWithContext(ctx, "GET", url, nil) + req.Header.Set("User-Agent", "OpenChainBench/1.0 (+https://openchainbench.com)") + client := &http.Client{Timeout: probeTimeout} + + start := time.Now() + resp, err := client.Do(req) + latencyMs = float64(time.Since(start).Nanoseconds()) / 1e6 + + if err != nil { + if ctx.Err() != nil || strings.Contains(err.Error(), "deadline exceeded") || strings.Contains(err.Error(), "Timeout") { + return 0, "timeout", latencyMs, err + } + return 0, "http_err", latencyMs, err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + _, _ = io.Copy(io.Discard, resp.Body) + return 0, "http_err", latencyMs, fmt.Errorf("status %d", resp.StatusCode) + } + + var body struct { + Height uint64 `json:"height"` + } + if err := json.NewDecoder(resp.Body).Decode(&body); err != nil { + return 0, "http_err", latencyMs, err + } + if body.Height == 0 { + return 0, "jsonrpc_err", latencyMs, fmt.Errorf("blockcypher ltc: height=0") + } + return body.Height, "ok", latencyMs, nil +} + +// callLitecoinSpaceAPI probes the LitecoinSpace Esplora API. +// GET https://litecoinspace.org/api/blocks/tip/height — returns a plain ASCII integer. +func callLitecoinSpaceAPI(ctx context.Context, url string) (height uint64, result string, latencyMs float64, err error) { + req, _ := http.NewRequestWithContext(ctx, "GET", url, nil) + req.Header.Set("User-Agent", "OpenChainBench/1.0 (+https://openchainbench.com)") + client := &http.Client{Timeout: probeTimeout} + + start := time.Now() + resp, err := client.Do(req) + latencyMs = float64(time.Since(start).Nanoseconds()) / 1e6 + + if err != nil { + if ctx.Err() != nil || strings.Contains(err.Error(), "deadline exceeded") || strings.Contains(err.Error(), "Timeout") { + return 0, "timeout", latencyMs, err + } + return 0, "http_err", latencyMs, err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + _, _ = io.Copy(io.Discard, resp.Body) + return 0, "http_err", latencyMs, fmt.Errorf("status %d", resp.StatusCode) + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return 0, "http_err", latencyMs, err + } + var h uint64 + if _, err := fmt.Sscanf(strings.TrimSpace(string(body)), "%d", &h); err != nil { + return 0, "jsonrpc_err", latencyMs, fmt.Errorf("litecoinspace: non-integer body: %s", string(body)) + } + if h == 0 { + return 0, "jsonrpc_err", latencyMs, fmt.Errorf("litecoinspace: height=0") + } + return h, "ok", latencyMs, nil +} diff --git a/public/logos/acala.svg b/public/logos/acala.svg new file mode 100644 index 00000000..0b880d9f --- /dev/null +++ b/public/logos/acala.svg @@ -0,0 +1,4 @@ + + + ACA + diff --git a/public/logos/babylon.svg b/public/logos/babylon.svg new file mode 100644 index 00000000..f511dd89 --- /dev/null +++ b/public/logos/babylon.svg @@ -0,0 +1,4 @@ + + + BBN + diff --git a/public/logos/interlay.svg b/public/logos/interlay.svg new file mode 100644 index 00000000..205fa451 --- /dev/null +++ b/public/logos/interlay.svg @@ -0,0 +1,4 @@ + + + INTR + diff --git a/public/logos/litecoinspace.svg b/public/logos/litecoinspace.svg new file mode 100644 index 00000000..d54eecc0 --- /dev/null +++ b/public/logos/litecoinspace.svg @@ -0,0 +1,4 @@ + + + LTC + diff --git a/src/data/provider-registry.ts b/src/data/provider-registry.ts index ef741132..c2c067a6 100644 --- a/src/data/provider-registry.ts +++ b/src/data/provider-registry.ts @@ -2562,6 +2562,21 @@ export const PROVIDER_REGISTRY: Record = { "OKX Chain (OKTC) official public EVM RPC node (exchainrpc.okex.org). Provides standard Ethereum JSON-RPC for OKX Token Chain mainnet, no API key required.", twitter: "@OKXOfficial", }, + + // ─── Litecoin providers (bench 246) ────────────────────────── + litecoinspace: { + url: "https://litecoinspace.org", + description: + "LitecoinSpace is a Litecoin block explorer built on the Esplora API. Exposes the current tip height at /api/blocks/tip/height as a plain integer, no API key required.", + }, + + // ─── Interlay providers (bench 249) ────────────────────────── + "interlay-official": { + url: "https://api.interlay.io/parachain", + description: + "Interlay official public Substrate RPC node (api.interlay.io/parachain). Provides a keyless Substrate JSON-RPC interface for the Interlay parachain on Polkadot.", + twitter: "@InterlayHQ", + }, }; /** diff --git a/src/lib/brand.ts b/src/lib/brand.ts index e0eb3a24..83d02a58 100644 --- a/src/lib/brand.ts +++ b/src/lib/brand.ts @@ -169,6 +169,13 @@ const BRANDS: Record = { tcinfra: { color: "#2C7DF7" }, // tcinfra tezos blue "oktc-official": { color: "#101010", dark: true }, // okx dark + // ─── Polkadot parachain RPC chains (benches 248-249) ─── + acala: { color: "#E40C5B" }, // acala red/pink (official brand) + interlay: { color: "#1A3BDB" }, // interlay blue (official brand) + + // ─── Cosmos SDK chains (bench 247) ─── + babylon: { color: "#F8811A" }, // babylon orange (official brand) + // ─── Bitcoin Cash chain + providers (bench 244) ─── "bitcoin-cash": { color: "#0AC18E" }, // bch official green bitcore: { color: "#1A1D21", dark: true }, // bitpay dark diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts index 05dd2dce..df21643c 100644 --- a/src/lib/logo-manifest.ts +++ b/src/lib/logo-manifest.ts @@ -323,6 +323,12 @@ const RAW: Record = { // ─── Buyback audit (bench 018) ─── sky: "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/logos/sky.svg", + // ─── New RPC chains (benches 246-249) ─── + babylon: "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/logos/babylon.svg", + acala: "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/logos/acala.svg", + interlay: "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/logos/interlay.svg", + litecoinspace: "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/logos/litecoinspace.svg", + // ─── Oracle deviation (bench 025) — additional brand logos ─── // (pairs alias to chain/asset logos in the ALIASES block below) chainlink: "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/logos/chainlink.svg", @@ -723,6 +729,9 @@ const ALIASES: Record = { "orai-official": "oraichain", "peaq-official": "peaq", + // Interlay official node alias → interlay chain logo + "interlay-official": "interlay", + // Non-EVM wave-3 (benches 222-231) — provider-official aliases to chain slug "ecadinfra": "tezos", "tzbeta": "tezos", From 1737ccc1fa6b6c564c9d0d5f511d8768cc2dcf33 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Fri, 28 Aug 2026 01:44:18 +0200 Subject: [PATCH 2/2] fix(rpc): remove em dashes from seo_intro in acala/babylon/interlay YAMLs --- benchmarks/acala-rpc.yml | 2 +- benchmarks/babylon-rpc.yml | 2 +- benchmarks/interlay-rpc.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarks/acala-rpc.yml b/benchmarks/acala-rpc.yml index 0fb3d9a4..9226b2d3 100644 --- a/benchmarks/acala-rpc.yml +++ b/benchmarks/acala-rpc.yml @@ -14,7 +14,7 @@ unit: ms higher_is_better: false seo_intro: | - Acala is the DeFi hub of the Polkadot ecosystem — a Polkadot parachain providing decentralized stablecoin (aUSD), liquid staking (LDOT), and an EVM-compatible execution environment. Acala uses the Substrate framework and exposes a standard Substrate JSON-RPC interface; block height is queried via chain_getHeader. Public endpoints are available without an API key from OnFinality, Dwellir, and PublicNode. Every provider was live-verified with consecutive block-height probes at launch. + Acala is the DeFi hub of the Polkadot ecosystem, a Polkadot parachain providing decentralized stablecoin (aUSD), liquid staking (LDOT), and an EVM-compatible execution environment. Acala uses the Substrate framework and exposes a standard Substrate JSON-RPC interface; block height is queried via chain_getHeader. Public endpoints are available without an API key from OnFinality, Dwellir, and PublicNode. Every provider was live-verified with consecutive block-height probes at launch. abstract: | Per-chain member of the RPC latency cluster, extended to Acala. diff --git a/benchmarks/babylon-rpc.yml b/benchmarks/babylon-rpc.yml index 6a96a56a..022f6b39 100644 --- a/benchmarks/babylon-rpc.yml +++ b/benchmarks/babylon-rpc.yml @@ -14,7 +14,7 @@ unit: ms higher_is_better: false seo_intro: | - Babylon is a Cosmos SDK proof-of-stake blockchain that enables Bitcoin staking — BTC holders can stake their coins to provide economic security to Babylon and other PoS chains without moving their Bitcoin off the Bitcoin network. Babylon uses the CometBFT consensus engine and exposes a standard Tendermint RPC interface. Public endpoints are available without an API key from PublicNode, Polkachu, and LavenderFive. Every provider was live-verified with consecutive block-height probes at launch. + Babylon is a Cosmos SDK proof-of-stake blockchain that enables Bitcoin staking; BTC holders can stake their coins to provide economic security to Babylon and other PoS chains without moving their Bitcoin off the Bitcoin network. Babylon uses the CometBFT consensus engine and exposes a standard Tendermint RPC interface. Public endpoints are available without an API key from PublicNode, Polkachu, and LavenderFive. Every provider was live-verified with consecutive block-height probes at launch. abstract: | Per-chain member of the RPC latency cluster, extended to Babylon. diff --git a/benchmarks/interlay-rpc.yml b/benchmarks/interlay-rpc.yml index f25adbd6..966127d1 100644 --- a/benchmarks/interlay-rpc.yml +++ b/benchmarks/interlay-rpc.yml @@ -14,7 +14,7 @@ unit: ms higher_is_better: false seo_intro: | - Interlay is a Polkadot parachain that brings trustless Bitcoin to DeFi — it issues iBTC, a fully Bitcoin-backed asset, by locking BTC in a decentralized vault system without wrapping or custodians. Interlay uses the Substrate framework and exposes a standard Substrate JSON-RPC interface; block height is queried via chain_getHeader. Public endpoints are available without an API key from OnFinality, Dwellir, and the Interlay official node. Every provider was live-verified with consecutive block-height probes at launch. + Interlay is a Polkadot parachain that brings trustless Bitcoin to DeFi; it issues iBTC, a fully Bitcoin-backed asset, by locking BTC in a decentralized vault system without wrapping or custodians. Interlay uses the Substrate framework and exposes a standard Substrate JSON-RPC interface; block height is queried via chain_getHeader. Public endpoints are available without an API key from OnFinality, Dwellir, and the Interlay official node. Every provider was live-verified with consecutive block-height probes at launch. abstract: | Per-chain member of the RPC latency cluster, extended to Interlay.