From ad8892a71216f8448bb64c739d0966aca7d375ea Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Wed, 9 Sep 2026 22:59:38 +0200 Subject: [PATCH] feat(rpc): surface NOWNodes, Bitcoin and LUKSO on prod Site + spec half of the NOWNodes onboarding, cherry-picked to main (the harness was already shipped via #2284 and #2288; Railway is already emitting the data). Nothing else from dev is included. - bitcoin-rpc (#259) and lukso-rpc (#260): new benches. - NOWNodes added to ethereum-rpc, bnb-rpc, coreum-rpc and the cross-chain rpc-capabilities list. - Real NOWNodes brand mark and official LUKSO logo; Bitcoin and LUKSO registered in CHAINS so they display capitalized; lukso-official registry entry; NOWNodes X handle corrected to @NOWNodes. Co-Authored-By: Claude Opus 4.8 --- benchmarks/bitcoin-rpc.yml | 127 ++++++++++++++++++++++++++++++++ benchmarks/bnb-rpc.yml | 23 ++++++ benchmarks/coreum-rpc.yml | 23 ++++++ benchmarks/ethereum-rpc.yml | 23 ++++++ benchmarks/lukso-rpc.yml | 127 ++++++++++++++++++++++++++++++++ benchmarks/rpc-capabilities.yml | 23 ++++++ public/logos/lukso.svg | 17 +++++ public/logos/nownodes.svg | 6 +- src/data/provider-registry.ts | 21 +++++- src/lib/chains.ts | 18 +++++ src/lib/logo-manifest.ts | 2 + 11 files changed, 405 insertions(+), 5 deletions(-) create mode 100644 benchmarks/bitcoin-rpc.yml create mode 100644 benchmarks/lukso-rpc.yml create mode 100644 public/logos/lukso.svg diff --git a/benchmarks/bitcoin-rpc.yml b/benchmarks/bitcoin-rpc.yml new file mode 100644 index 000000000..5fc30be7d --- /dev/null +++ b/benchmarks/bitcoin-rpc.yml @@ -0,0 +1,127 @@ +# OpenChainBench. Bench No 259 + +slug: bitcoin-rpc +number: "259" +title: Fastest free Bitcoin RPC, live no-key endpoint latency +seo_title: "Fastest free Bitcoin RPC 2026" +seo_description: "{{best_name}} leads free Bitcoin RPC at {{best_p50}} (getblockcount p50, 24h). 3 no-key providers measured every 60s from 3 regions." +subtitle: HTTP round-trip latency for block-height queries against every available public Bitcoin endpoint, audited every 60 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Bitcoin is the original proof-of-work UTXO blockchain, targeting one block every ten minutes under SHA-256. It exposes the canonical Bitcoin Core JSON-RPC interface; the lightest height method is getblockcount, which returns the current chain tip as a plain integer. A handful of providers serve this endpoint with no API key: PublicNode, dRPC and NOWNodes (public no-key endpoint, rate-limited to 5 requests per second). Every provider was live-verified with consecutive getblockcount probes at launch, all returning the same tip. + +abstract: | + Per-chain member of the RPC latency cluster, extended to Bitcoin. We probe every + public no-key endpoint with a single getblockcount call every 60 seconds from three + regions (us-east, eu-west, Singapore) and record wall-clock round-trip latency. Only ok + responses (HTTP 200 with a usable block height, not stale) contribute to the distribution; + p50/p90/p99 are computed via Prometheus quantile_over_time over a rolling 24-hour window. + +methodology: + - "Probe: a single getblockcount JSON-RPC POST every 60 seconds per provider from us-east, eu-west and Singapore. Latency is the client-side wall-clock round trip." + - "Classification: ok (HTTP 200 with a usable height), http_err, jsonrpc_err (HTTP 200 with an error body), stale (tip more than 20 blocks behind the cross-provider max), timeout. Only ok responses contribute latency." + - "Providers: PublicNode (bitcoin-rpc.publicnode.com), dRPC (bitcoin.drpc.org), NOWNodes (public-btc.nownodes.io, no key, 5 RPS)." + - "Aggregation: p50/p90/p99 via Prometheus quantile_over_time over 24h; the headline cites the cross-region figure and the region tabs re-scope it." + +findings: + - "{{best_name}} leads at {{best_p50}} (getblockcount p50, 24h) across {{provider_count}} no-key Bitcoin endpoints." + - "Bitcoin's ten-minute block time means read latency reflects the provider's edge, not chain speed: a stale tip is rare, so this bench is a near-pure latency race." + - "{{name:nownodes}} serves Bitcoin from its public no-key endpoint at {{p50:nownodes}} (p50, 24h), rate-limited to 5 requests per second." + +faq: + - q: "Which free Bitcoin RPC is fastest?" + a: "Per the live data above: {{best_name}} at {{best_p50}} (getblockcount p50, 24h) across the no-key providers measured here." + - q: "How is Bitcoin RPC latency measured?" + a: "A single getblockcount call every 60 seconds from three regions (us-east, eu-west, Singapore), recording the wall-clock round trip. Only successful, non-stale responses count." + - q: "Do these endpoints need an API key?" + a: "No. All three (PublicNode, dRPC, NOWNodes) serve Bitcoin Core JSON-RPC with no key. NOWNodes' public endpoint is rate-limited to 5 requests per second." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + expected_freshness_seconds: 5400 + +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="bitcoin"}) + +dimensions: + region: + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, no-key Bitcoin Core JSON-RPC + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `getblockcount` sent every 60s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Bitcoin endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bitcoin"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="bitcoin"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="bitcoin"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="bitcoin"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="bitcoin"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="bitcoin"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="bitcoin"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bitcoin"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bitcoin", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bitcoin", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bitcoin", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bitcoin", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bitcoin", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bitcoin", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Decentralised RPC mesh, no-key Bitcoin endpoint + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `getblockcount` sent every 60s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key Bitcoin endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="bitcoin"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="bitcoin"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="bitcoin"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="bitcoin"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="bitcoin"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="bitcoin"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="bitcoin"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="bitcoin"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="bitcoin", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="bitcoin", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="bitcoin", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="bitcoin", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="bitcoin", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="bitcoin", region="sgp"}[1h]) + + - slug: nownodes + name: NOWNodes + tag: Public node, 110+ chains, 5 RPS free tier + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `getblockcount` sent every 60s from 3 regions (us-east + eu-west + sgp) to NOWNodes's no-key Bitcoin endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bitcoin"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nownodes", chain="bitcoin"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nownodes", chain="bitcoin"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nownodes", chain="bitcoin"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nownodes", chain="bitcoin"}) / sum(ocb:rpc_call:rate_24h{provider="nownodes", chain="bitcoin"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nownodes", chain="bitcoin"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bitcoin"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bitcoin", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bitcoin", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bitcoin", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bitcoin", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bitcoin", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bitcoin", region="sgp"}[1h]) diff --git a/benchmarks/bnb-rpc.yml b/benchmarks/bnb-rpc.yml index 95ca204e9..94bf6875c 100644 --- a/benchmarks/bnb-rpc.yml +++ b/benchmarks/bnb-rpc.yml @@ -86,6 +86,29 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="bnb", region="sgp"}) series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="bnb", region="sgp"}[1h]) + - slug: nownodes + name: NOWNodes + tag: Public node, 110+ chains, 5 RPS free tier + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to NOWNodes public no-key BNB Chain endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bnb"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nownodes", chain="bnb"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nownodes", chain="bnb"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nownodes", chain="bnb"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nownodes", chain="bnb"}) / sum(ocb:rpc_call:rate_24h{provider="nownodes", chain="bnb"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nownodes", chain="bnb"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bnb"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bnb", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bnb", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bnb", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bnb", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="bnb", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="bnb", region="sgp"}[1h]) + - slug: drpc name: dRPC tag: Decentralized RPC mesh, consensus-checked diff --git a/benchmarks/coreum-rpc.yml b/benchmarks/coreum-rpc.yml index 9791f6636..da4bfa34d 100644 --- a/benchmarks/coreum-rpc.yml +++ b/benchmarks/coreum-rpc.yml @@ -111,6 +111,29 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="coreum", region="sgp"}) series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="coreum", region="sgp"}[1h]) + - slug: nownodes + name: NOWNodes + tag: Public node, 110+ chains, 5 RPS free tier + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single Tendermint `status` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key Coreum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="coreum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nownodes", chain="coreum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nownodes", chain="coreum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nownodes", chain="coreum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nownodes", chain="coreum"}) / sum(ocb:rpc_call:rate_24h{provider="nownodes", chain="coreum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nownodes", chain="coreum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="coreum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="coreum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="coreum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="coreum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="coreum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="coreum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="coreum", region="sgp"}[1h]) + - slug: coreum-official name: Coreum Foundation tag: Coreum Foundation's official public RPC diff --git a/benchmarks/ethereum-rpc.yml b/benchmarks/ethereum-rpc.yml index ce4e21741..98627c04d 100644 --- a/benchmarks/ethereum-rpc.yml +++ b/benchmarks/ethereum-rpc.yml @@ -87,6 +87,29 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="ethereum", region="sgp"}) series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="ethereum", region="sgp"}[1h]) + - slug: nownodes + name: NOWNodes + tag: Public node, 110+ chains, 5 RPS free tier + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to NOWNodes public no-key Ethereum endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="ethereum"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nownodes", chain="ethereum"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nownodes", chain="ethereum"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nownodes", chain="ethereum"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nownodes", chain="ethereum"}) / sum(ocb:rpc_call:rate_24h{provider="nownodes", chain="ethereum"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nownodes", chain="ethereum"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="ethereum"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="ethereum", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="ethereum", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="ethereum", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="ethereum", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="ethereum", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="ethereum", region="sgp"}[1h]) + - slug: drpc name: dRPC tag: Decentralized RPC mesh, consensus-checked diff --git a/benchmarks/lukso-rpc.yml b/benchmarks/lukso-rpc.yml new file mode 100644 index 000000000..bb7092c04 --- /dev/null +++ b/benchmarks/lukso-rpc.yml @@ -0,0 +1,127 @@ +# OpenChainBench. Bench No 260 + +slug: lukso-rpc +number: "260" +title: Fastest free LUKSO RPC, live no-key endpoint latency +seo_title: "Fastest free LUKSO RPC 2026" +seo_description: "{{best_name}} leads free LUKSO RPC at {{best_p50}} (eth_getBlockByNumber p50, 24h). 3 no-key providers measured every 60s from 3 regions." +subtitle: HTTP round-trip latency for eth_getBlockByNumber against every available public LUKSO endpoint, audited every 60 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + LUKSO is an EVM layer-1 (chain ID 42) built around Universal Profiles and the LSP standards. It speaks standard Ethereum JSON-RPC, so the canonical height probe is eth_getBlockByNumber('latest'). Three providers serve LUKSO mainnet with no API key: the LUKSO Foundation's official RPC, NOWNodes (public no-key endpoint, 5 requests per second) and thirdweb's public edge. All three were live-verified at launch, returning the same chain tip. + +abstract: | + Per-chain member of the RPC latency cluster, extended to LUKSO. We probe every + public no-key endpoint with a single eth_getBlockByNumber call every 60 seconds from three + regions (us-east, eu-west, Singapore) and record wall-clock round-trip latency. Only ok + responses (HTTP 200 with a usable block height, not stale) contribute to the distribution; + p50/p90/p99 are computed via Prometheus quantile_over_time over a rolling 24-hour window. + +methodology: + - "Probe: a single eth_getBlockByNumber('latest', false) JSON-RPC POST every 60 seconds per provider from us-east, eu-west and Singapore. Latency is the client-side wall-clock round trip." + - "Classification: ok (HTTP 200 with a usable block number), http_err, jsonrpc_err, stale (block more than 20 behind the cross-provider tip), timeout. Only ok responses contribute latency." + - "Providers: LUKSO Foundation (rpc.mainnet.lukso.network), NOWNodes (public-lukso.nownodes.io, no key, 5 RPS), thirdweb (42.rpc.thirdweb.com)." + - "Aggregation: p50/p90/p99 via Prometheus quantile_over_time over 24h; the headline cites the cross-region figure and the region tabs re-scope it." + +findings: + - "{{best_name}} leads at {{best_p50}} (eth_getBlockByNumber p50, 24h) across {{provider_count}} no-key LUKSO endpoints." + - "LUKSO targets a short EVM block time, so a stale tip is uncommon and the ranking is driven by each provider's regional edge placement." + - "{{name:nownodes}} serves LUKSO from its public no-key endpoint at {{p50:nownodes}} (p50, 24h), rate-limited to 5 requests per second." + +faq: + - q: "Which free LUKSO RPC is fastest?" + a: "Per the live data above: {{best_name}} at {{best_p50}} (eth_getBlockByNumber p50, 24h) across the no-key providers measured here." + - q: "How is LUKSO RPC latency measured?" + a: "A single eth_getBlockByNumber call every 60 seconds from three regions (us-east, eu-west, Singapore), recording the wall-clock round trip. Only successful, non-stale responses count." + - q: "Do these endpoints need an API key?" + a: "No. LUKSO Foundation, NOWNodes and thirdweb all serve LUKSO mainnet JSON-RPC with no key. NOWNodes' public endpoint is rate-limited to 5 requests per second." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + expected_freshness_seconds: 5400 + +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="lukso"}) + +dimensions: + region: + - { value: us-east, label: US-East } + - { value: eu-west, label: EU-West } + - { value: sgp, label: Singapore } + +providers: + - slug: lukso-official + name: LUKSO Foundation + tag: Official LUKSO mainnet RPC, no key + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber` sent every 60s from 3 regions (us-east + eu-west + sgp) to LUKSO Foundation's no-key LUKSO endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lukso-official", chain="lukso"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="lukso-official", chain="lukso"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="lukso-official", chain="lukso"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="lukso-official", chain="lukso"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="lukso-official", chain="lukso"}) / sum(ocb:rpc_call:rate_24h{provider="lukso-official", chain="lukso"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="lukso-official", chain="lukso"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="lukso-official", chain="lukso"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lukso-official", chain="lukso", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lukso-official", chain="lukso", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lukso-official", chain="lukso", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lukso-official", chain="lukso", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="lukso-official", chain="lukso", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="lukso-official", chain="lukso", region="sgp"}[1h]) + + - slug: nownodes + name: NOWNodes + tag: Public node, 110+ chains, 5 RPS free tier + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber` sent every 60s from 3 regions (us-east + eu-west + sgp) to NOWNodes's no-key LUKSO endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="lukso"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nownodes", chain="lukso"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nownodes", chain="lukso"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nownodes", chain="lukso"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nownodes", chain="lukso"}) / sum(ocb:rpc_call:rate_24h{provider="nownodes", chain="lukso"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nownodes", chain="lukso"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="lukso"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="lukso", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="lukso", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="lukso", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="lukso", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", chain="lukso", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", chain="lukso", region="sgp"}[1h]) + + - slug: thirdweb + name: thirdweb + tag: Multi-chain RPC edge, no-key public endpoint + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber` sent every 60s from 3 regions (us-east + eu-west + sgp) to thirdweb's no-key LUKSO endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="thirdweb", chain="lukso"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="thirdweb", chain="lukso"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="thirdweb", chain="lukso"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="thirdweb", chain="lukso"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="thirdweb", chain="lukso"}) / sum(ocb:rpc_call:rate_24h{provider="thirdweb", chain="lukso"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="thirdweb", chain="lukso"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="thirdweb", chain="lukso"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="thirdweb", chain="lukso", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="thirdweb", chain="lukso", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="thirdweb", chain="lukso", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="thirdweb", chain="lukso", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="thirdweb", chain="lukso", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="thirdweb", chain="lukso", region="sgp"}[1h]) diff --git a/benchmarks/rpc-capabilities.yml b/benchmarks/rpc-capabilities.yml index cee5e02a3..5e265b958 100644 --- a/benchmarks/rpc-capabilities.yml +++ b/benchmarks/rpc-capabilities.yml @@ -187,6 +187,29 @@ providers: p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", region="sgp"}) series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", region="sgp"}[1h]) + - slug: nownodes + name: NOWNodes + tag: Public node, 110+ chains, 5 RPS free tier + formula: "Mean over its measured chains (Ethereum, BNB, Bitcoin, LUKSO, Coreum) and 3 regions of per-cell 24h p50 round-trip latency (ms) to NOWNodes public no-key endpoints. Successful calls only; failures show in the Success column." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nownodes"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nownodes"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nownodes"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="nownodes"}) / sum(ocb:rpc_call:rate_24h{provider="nownodes"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="nownodes"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="nownodes"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nownodes", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="nownodes", region="sgp"}[1h]) + - slug: drpc name: dRPC tag: Decentralized RPC mesh, consensus-checked diff --git a/public/logos/lukso.svg b/public/logos/lukso.svg new file mode 100644 index 000000000..cfab20ee5 --- /dev/null +++ b/public/logos/lukso.svg @@ -0,0 +1,17 @@ + + + + + + + diff --git a/public/logos/nownodes.svg b/public/logos/nownodes.svg index 297c5a4e1..5e94ea570 100644 --- a/public/logos/nownodes.svg +++ b/public/logos/nownodes.svg @@ -1,4 +1,4 @@ - - - NN + + + diff --git a/src/data/provider-registry.ts b/src/data/provider-registry.ts index afdb90338..516dc0ac6 100644 --- a/src/data/provider-registry.ts +++ b/src/data/provider-registry.ts @@ -2267,11 +2267,28 @@ export const PROVIDER_REGISTRY: Record = { "TON Center provides the official HTTP API v2 for the TON/Gram blockchain, operated by the TON Foundation. Keyless access is available at 1 request per second; higher rates require an API key.", twitter: "@toncenter", }, + "lukso-official": { + url: "https://lukso.network", + description: + "The LUKSO Foundation's official mainnet RPC endpoint for the LUKSO EVM chain (chain ID 42), served with no API key.", + twitter: "@lukso_io", + }, nownodes: { url: "https://nownodes.io", description: - "NOWNodes is a multi-chain node provider covering Gram (TON), Bitcoin, Ethereum and 50+ other chains. Offers API-key-based access with a free trial tier.", - twitter: "@NOWNodes_io", + "Multi-chain node provider covering 110+ blockchains. Key-based REST and WebSocket RPC plus block explorers, with keyless public endpoints on a handful of chains (Ethereum, BNB, Bitcoin) rate-limited to 5 requests per second.", + twitter: "@NOWNodes", + docs: "https://docs.nownodes.io", + chains: ["ethereum", "bnb", "bitcoin", "litecoin", "dogecoin", "gram", "xrp", "tron"], + features: [ + "110+ chains via a single API key", + "REST and WebSocket JSON-RPC endpoints", + "Block explorers for major UTXO chains", + "Keyless public endpoints on Ethereum, BNB and Bitcoin (5 RPS)", + "Free trial tier, then usage-based paid plans", + ], + pricing: + "Free trial key, then paid plans by request volume. Public no-key endpoints exist on select chains at 5 requests per second.", }, tatum: { url: "https://tatum.io", diff --git a/src/lib/chains.ts b/src/lib/chains.ts index d5880fda0..2973bf332 100644 --- a/src/lib/chains.ts +++ b/src/lib/chains.ts @@ -45,6 +45,24 @@ export type ChainEntry = { }; export const CHAINS: ChainEntry[] = [ + { + slug: "bitcoin", + label: "Bitcoin", + category: "L1", + nativeSymbol: "BTC", + website: "https://bitcoin.org", + description: + "The original proof-of-work UTXO blockchain. SHA-256 mining, ~10-minute block target, Bitcoin Core JSON-RPC (getblockcount) for chain-tip reads.", + }, + { + slug: "lukso", + label: "LUKSO", + category: "L1", + nativeSymbol: "LYX", + website: "https://lukso.network", + description: + "EVM Layer 1 (chain ID 42) for Universal Profiles and the LSP standards. Standard Ethereum JSON-RPC surface; proof-of-stake consensus.", + }, { slug: "ethereum", label: "Ethereum", diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts index 9c3f74ba7..ec94aba15 100644 --- a/src/lib/logo-manifest.ts +++ b/src/lib/logo-manifest.ts @@ -182,6 +182,8 @@ const RAW: Record = { // ─── Gram/TON providers (bench 215) ─── toncenter: "/logos/ton.svg", nownodes: "/logos/nownodes.svg", + lukso: "/logos/lukso.svg", + "lukso-official": "/logos/lukso.svg", tatum: "/logos/tatum.svg", uniblock: "/logos/uniblock.svg", // ─── Wave-2 non-EVM chains (benches 216-221) ───