diff --git a/benchmarks/hyperliquid-rpc.yml b/benchmarks/hyperliquid-rpc.yml new file mode 100644 index 00000000..11874309 --- /dev/null +++ b/benchmarks/hyperliquid-rpc.yml @@ -0,0 +1,201 @@ +# OpenChainBench. Bench № 092 + +slug: hyperliquid-rpc +number: "092" +title: Fastest free Hyperliquid RPC, live no-key HyperEVM endpoint latency +seo_title: "Fastest free Hyperliquid RPC 2026" +seo_description: "{{best_name}} leads free Hyperliquid RPC at {{best_p50}} (eth_getBlockByNumber p50, 24h). 5 no-key HyperEVM providers measured every 60s from 3 regions." +subtitle: HTTP round-trip latency for `eth_getBlockByNumber("latest", false)` against every free, no-key public HyperEVM endpoint, audited every 60 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + Hyperliquid's HyperEVM (chain id 999) is the EVM execution layer bolted + onto the HyperCore perps engine. Standard Ethereum JSON-RPC wire, so + the probe is `eth_getBlockByNumber("latest", false)` , the same call + the Ethereum, Base, Arbitrum and 20+ other chain benches use. Provider + cohort at launch: Hyperliquid Labs's official `rpc.hyperliquid.xyz/evm`, + dRPC, Stakely, Purroof Group and Hypurrscan. Alchemy demo path + (rate-limited dead), Grove/Pocket public LB (needs an app id at the + public LB path), thirdweb (returns "Invalid chain" on HyperEVM) and + the AllThatNode / Blast API guesses (DNS not resolving to a public + HyperEVM endpoint) were audited alongside and excluded. Each will be + revisited when a stable no-key path reappears. + +abstract: | + Per-chain member of the RPC latency cluster, extended to HyperEVM. + We measure the round-trip latency of a single, identical JSON-RPC + call (`eth_getBlockByNumber("latest", false)`) against every no-key + public HyperEVM endpoint that sustains continuous probing, 5 providers + at launch, every 60 seconds, from us-east, eu-west and Singapore. The + harness classifies every response (ok / http_err / jsonrpc_err / + stale / timeout) with the standard EVM staleness gap (block gap = + 25 blocks ≈ 50 seconds at HyperEVM's ~2 s block time). The cross-chain + view lives on the parent `rpc-capabilities` benchmark; this page is + the Hyperliquid-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\":\"eth_getBlockByNumber\",\"params\":[\"latest\", false]}`. Plain HTTP POST, identical for every endpoint, no API key in any request. Non-cacheable by design: the rotating id defeats edge caches that would answer a bare head query without touching a node." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result with a parsable hex block number), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body , this is how the audit caught thirdweb's `Invalid chain` failure), `stale` (more than 25 blocks behind the cross-provider tip, roughly 50 seconds at HyperEVM's ~2 s block time), `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](https://openchainbench.com/benchmarks/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=\"hyperliquid\"`. Provider coverage at launch: 5 no-key endpoints (Hyperliquid Labs official, dRPC, Stakely, Purroof Group, Hypurrscan)." + - "Excluded by the launch audit: Alchemy demo path (rate-limited dead), thirdweb (`Invalid chain` on HyperEVM), Grove/Pocket public LB (requires an app id at the LB path), AllThatNode + Blast API + Chainstack + Gelato + Imperator HyperEVM paths (DNS-fail or 401 without a key), PublicNode (no HyperEVM subdomain yet). HyperEVM is a young chain (mainnet Feb 2025) so this list will shift quickly." + +findings: + - "{{best_name}} currently leads free Hyperliquid RPC at {{best_p50}} (eth_getBlockByNumber p50, 24h) across 5 measured providers." + - "{{name:hyperliquid-official}} is operated by Hyperliquid Labs itself; the bench measures the same public endpoint that HyperCore front-ends and Hyperliquid dashboards route through by default, so the number here reflects what a wallet or dApp integrator sees end-to-end." + - "{{name:drpc}} routes HyperEVM through its multi-provider load balancer with edge-close routing; latency here is a good proxy for what an integrator using dRPC's paid tier can expect after removing the free-tier caching noise." + - "{{name:hypurrscan}} runs a HyperEVM-native explorer alongside its RPC gateway; the reliability column matters as much as p50 since community-run infra can churn during network upgrades or heavy trading periods." + +faq: + - q: "What is the fastest free Hyperliquid RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (eth_getBlockByNumber p50 over the last 24h), measured against 5 no-key providers probed every 60 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which HyperEVM RPCs work without an API key?" + a: "Five endpoints sustain continuous keyless probing at launch: Hyperliquid Labs's `rpc.hyperliquid.xyz/evm`, dRPC (`hyperliquid.drpc.org`), Stakely (`hyperliquid-json-rpc.stakely.io`), Purroof Group (`rpc.purroofgroup.com`) and Hypurrscan (`rpc.hypurrscan.io`). Every listed endpoint was live-verified with an `eth_getBlockByNumber` POST returning a parsable hex head before inclusion. Excluded by the audit: Alchemy's demo key path is rate-limited dead, thirdweb returns `Invalid chain` on HyperEVM, Grove/Pocket public LB requires an app id at the LB path, and AllThatNode / Blast API / Chainstack / Gelato / Imperator HyperEVM paths either DNS-fail or 401 without a key. HyperEVM is a young chain so this list will shift as providers stand up dedicated endpoints." + - q: "Does the fastest Hyperliquid RPC change by region?" + a: "Often. HyperEVM provider infra is heavily weighted toward Europe and the US; a gateway that wins from Amsterdam can lose from Singapore by multiples, especially for community-run providers with a single data centre. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is Hyperliquid RPC latency measured here, technically?" + a: "One identical JSON-RPC POST (`eth_getBlockByNumber(\"latest\", false)`) every 60 seconds against each provider from each of 3 regions, using the same plain HTTP client the rest of the EVM cluster uses. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest." + - q: "Why is the probe `eth_getBlockByNumber` and not `eth_blockNumber`?" + a: "Two reasons. First, `eth_getBlockByNumber(\"latest\", false)` forces the node to actually assemble the block header (timestamp, hash, gas metrics) which a polite CDN cannot synthesise from a stale integer , `eth_blockNumber` on its own can be answered from an edge cache without touching a node, defeating the point of a latency probe. Second, the returned header lets the harness populate the `latest_block_hash` and `timestamp` fields the cross-provider tip machinery uses to detect stale endpoints. Both together mean the number on this page is what your app actually pays when it fetches a fresh head." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="hyperliquid"}) + +# Region is the only dimension: chain is baked into every query. +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: hyperliquid-official + name: Hyperliquid Labs + tag: Hyperliquid Labs's official public HyperEVM RPC + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to Hyperliquid Labs's official public HyperEVM RPC." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="hyperliquid-official", chain="hyperliquid"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="hyperliquid-official", chain="hyperliquid"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="hyperliquid-official", chain="hyperliquid"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="hyperliquid-official", chain="hyperliquid"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="hyperliquid-official", chain="hyperliquid"}) / sum(ocb:rpc_call:rate_24h{provider="hyperliquid-official", chain="hyperliquid"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="hyperliquid-official", chain="hyperliquid"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="hyperliquid-official", chain="hyperliquid"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="hyperliquid-official", chain="hyperliquid", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="hyperliquid-official", chain="hyperliquid", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="hyperliquid-official", chain="hyperliquid", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="hyperliquid-official", chain="hyperliquid", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="hyperliquid-official", chain="hyperliquid", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="hyperliquid-official", chain="hyperliquid", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Multi-provider RPC load balancer, edge-close routing + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key HyperEVM endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="hyperliquid"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="hyperliquid"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="hyperliquid"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="hyperliquid"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="hyperliquid"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="hyperliquid"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="hyperliquid"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="hyperliquid"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="hyperliquid", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="hyperliquid", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="hyperliquid", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="hyperliquid", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="hyperliquid", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="hyperliquid", region="sgp"}[1h]) + + - slug: stakely + name: Stakely + tag: EU-based staking + infra provider, keyless HyperEVM path + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to Stakely's no-key HyperEVM endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakely", chain="hyperliquid"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="stakely", chain="hyperliquid"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="stakely", chain="hyperliquid"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="stakely", chain="hyperliquid"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="stakely", chain="hyperliquid"}) / sum(ocb:rpc_call:rate_24h{provider="stakely", chain="hyperliquid"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="stakely", chain="hyperliquid"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="stakely", chain="hyperliquid"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakely", chain="hyperliquid", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="stakely", chain="hyperliquid", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakely", chain="hyperliquid", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="stakely", chain="hyperliquid", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakely", chain="hyperliquid", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="stakely", chain="hyperliquid", region="sgp"}[1h]) + + - slug: purroofgroup + name: Purroof Group + tag: Community Hyperliquid validator + public RPC + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to Purroof Group's no-key HyperEVM endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="purroofgroup", chain="hyperliquid"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="purroofgroup", chain="hyperliquid"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="purroofgroup", chain="hyperliquid"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="purroofgroup", chain="hyperliquid"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="purroofgroup", chain="hyperliquid"}) / sum(ocb:rpc_call:rate_24h{provider="purroofgroup", chain="hyperliquid"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="purroofgroup", chain="hyperliquid"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="purroofgroup", chain="hyperliquid"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="purroofgroup", chain="hyperliquid", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="purroofgroup", chain="hyperliquid", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="purroofgroup", chain="hyperliquid", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="purroofgroup", chain="hyperliquid", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="purroofgroup", chain="hyperliquid", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="purroofgroup", chain="hyperliquid", region="sgp"}[1h]) + + - slug: hypurrscan + name: Hypurrscan + tag: HyperEVM explorer + no-key public RPC gateway + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to Hypurrscan's no-key HyperEVM endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="hypurrscan", chain="hyperliquid"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="hypurrscan", chain="hyperliquid"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="hypurrscan", chain="hyperliquid"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="hypurrscan", chain="hyperliquid"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="hypurrscan", chain="hyperliquid"}) / sum(ocb:rpc_call:rate_24h{provider="hypurrscan", chain="hyperliquid"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="hypurrscan", chain="hyperliquid"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="hypurrscan", chain="hyperliquid"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="hypurrscan", chain="hyperliquid", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="hypurrscan", chain="hyperliquid", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="hypurrscan", chain="hyperliquid", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="hypurrscan", chain="hyperliquid", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="hypurrscan", chain="hyperliquid", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="hypurrscan", chain="hyperliquid", region="sgp"}[1h]) diff --git a/benchmarks/tron-rpc.yml b/benchmarks/tron-rpc.yml new file mode 100644 index 00000000..627b2521 --- /dev/null +++ b/benchmarks/tron-rpc.yml @@ -0,0 +1,163 @@ +# OpenChainBench. Bench № 093 + +slug: tron-rpc +number: "093" +title: Fastest free TRON RPC, live no-key JSON-RPC endpoint latency +seo_title: "Fastest free TRON RPC 2026" +seo_description: "{{best_name}} leads free TRON RPC at {{best_p50}} (eth_getBlockByNumber p50, 24h). 3 no-key JSON-RPC-compat providers measured every 60s from 3 regions." +subtitle: HTTP round-trip latency for `eth_getBlockByNumber("latest", false)` against every free, no-key public TRON JSON-RPC-compatible endpoint, audited every 60 seconds from 3 regions. + +category: RPCs +status: live +metric: RPC latency +unit: ms +higher_is_better: false + +seo_intro: | + TRON exposes two RPC surfaces: the native Tron HTTP API + (`wallet/getnowblock`, `wallet/triggersmartcontract`) and an + EVM-compatible JSON-RPC endpoint (`/jsonrpc`) that speaks standard + Ethereum method names (`eth_blockNumber`, `eth_getBlockByNumber`, + `eth_getBalance`). This bench measures the JSON-RPC surface because + that is the path every TRON-compatible EVM wallet, TronWeb bridge + and cross-chain bot integrates against. Provider cohort at launch: + TronGrid (Tron Foundation official), dRPC and PublicNode / Allnodes. + Ankr's JSON-RPC path is keyless in branding but rejected our probes + with `API key is not allowed to access blockchain`; Chainstack, + NOWNodes, GetBlock, Tatum and BlockPI require API keys on the TRON + JSON-RPC path; OnFinality and Blast API have no public TRON + JSON-RPC gateway at this time. The native TRON REST API surface + (used by TronWeb + TronBox) is out of scope for the RPC cluster + and would need a chain-specific probe added. + +abstract: | + Per-chain member of the RPC latency cluster, extended to the TRON + JSON-RPC-compatible surface. We measure the round-trip latency of a + single, identical JSON-RPC call + (`eth_getBlockByNumber("latest", false)`) against every no-key + public TRON JSON-RPC endpoint that sustains continuous probing, + 3 providers at launch, every 60 seconds, from us-east, eu-west and + Singapore. The harness classifies every response + (ok / http_err / jsonrpc_err / stale / timeout) with the EVM + staleness gap tuned for TRON's ~3 s block time (25 blocks ≈ 75 + seconds). The cross-chain view lives on the parent `rpc-capabilities` + benchmark; this page is the TRON-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\":\"eth_getBlockByNumber\",\"params\":[\"latest\", false]}`. Plain HTTP POST, identical for every endpoint, no API key in any request. Non-cacheable by design: the rotating id defeats edge caches that would answer a bare head query without touching a node." + - "Latency: client-side round-trip delta in milliseconds, exposed as both a gauge and a histogram (buckets 50 ms → 10 s), so percentiles are computed via Prometheus `quantile_over_time` over the last 24 hours." + - "Call-result classification: `ok` (HTTP 200 + non-empty result with a parsable hex block number), `http_err`, `jsonrpc_err` (HTTP 200 carrying an error body), `stale` (more than 25 blocks behind the cross-provider tip, roughly 75 seconds at TRON's ~3 s block time), `timeout`. Latency without reliability is a misleading ranking signal." + - "Surface scope: only the EVM-compatible JSON-RPC surface (`/jsonrpc` endpoints) is measured, because that is the path every cross-chain wallet, TronWeb / EVM bridge and arbitrage bot integrates against. The native TRON REST API (`wallet/getnowblock`, `wallet/triggersmartcontract`) is out of scope for this bench; a chain-specific `tron-rest` bench can be added later when there is clear demand from integrators using TronWeb directly." + - "This page is part of the per-chain RPC cluster derived from the cross-chain [rpc-capabilities](https://openchainbench.com/benchmarks/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=\"tron\"`. Provider coverage at launch: 3 no-key JSON-RPC endpoints (TronGrid, dRPC, PublicNode). The TRON JSON-RPC provider market is materially smaller than the EVM one; most TRON infra vendors expose only the native TRON REST API keyless, and gate the JSON-RPC path behind an API key." + - "Excluded by the launch audit: Ankr (`rpc.ankr.com/tron_jsonrpc` returned `API key is not allowed to access blockchain` without a key), Chainstack / NOWNodes / GetBlock / Tatum / BlockPI (all require an API key on the TRON JSON-RPC path even though branded as public), OnFinality + Blast API + AllThatNode (no public TRON JSON-RPC gateway), Tron Foundation's `rpc.trongrid.io` (DNS not resolving; the correct official host is `api.trongrid.io/jsonrpc`)." + +findings: + - "{{best_name}} currently leads free TRON RPC at {{best_p50}} (eth_getBlockByNumber p50, 24h) across 3 measured providers." + - "{{name:trongrid}} is Tron Foundation's official public API gateway; the bench measures the same `api.trongrid.io/jsonrpc` endpoint that every TronWeb + tronbox integrator points at first. Latency here reflects what a keyless TRON-EVM integrator sees end-to-end." + - "{{name:drpc}} routes TRON JSON-RPC through its multi-provider load balancer; latency here is a good proxy for what a cross-chain integrator (multi-chain wallets, bridges) can expect from a load-balanced setup." + - "{{name:publicnode}} extends its universal multi-chain footprint to TRON JSON-RPC without a keyed path; the reliability column matters as much as p50 since TRON JSON-RPC compat is a thin layer over the native TRON API and can drift under load." + +faq: + - q: "What is the fastest free TRON RPC right now?" + a: "{{best_name}} currently leads at {{best_p50}} (eth_getBlockByNumber p50 over the last 24h), measured against 3 no-key JSON-RPC providers probed every 60 seconds from us-east, eu-west and Singapore. The leaderboard re-sorts continuously against fresh Prometheus samples, so the answer on this page is the answer right now, not a quarterly snapshot. Use the region tabs to see the leader from the origin closest to your deployment." + - q: "Which TRON RPCs work without an API key?" + a: "Three JSON-RPC endpoints sustain continuous keyless probing at launch: TronGrid (`api.trongrid.io/jsonrpc`), dRPC (`tron.drpc.org`) and PublicNode / Allnodes (`tron.publicnode.com/jsonrpc`). Every listed endpoint was live-verified with an `eth_getBlockByNumber` POST returning a parsable hex head before inclusion. Excluded by the audit: Ankr's TRON JSON-RPC path rejects keyless probes with `API key is not allowed to access blockchain`; Chainstack, NOWNodes, GetBlock, Tatum and BlockPI require an API key on the TRON JSON-RPC path even though branded as public; OnFinality, Blast API and AllThatNode have no public TRON JSON-RPC gateway. The TRON JSON-RPC provider market is materially smaller than the EVM one , most TRON infra vendors expose only the native TRON REST API keyless." + - q: "Why only 3 providers when other RPC benches have 5+?" + a: "TRON's JSON-RPC compat layer is thinner than the EVM one, and most infra vendors gate it behind an API key even when their native TRON REST endpoints are keyless. The 3 providers on this page are all keyless endpoints that responded correctly to a plain POST during the launch audit; when other vendors open a keyless JSON-RPC path we will add them. Latency and reliability numbers here are still meaningful because the 3 providers span a Foundation-official endpoint, a multi-provider aggregator (dRPC) and a universal multi-chain gateway (PublicNode) , the three infra archetypes an integrator would compare against each other anyway." + - q: "Does this bench cover the native TRON REST API (`wallet/getnowblock`)?" + a: "No. This bench scopes only the EVM-compatible JSON-RPC surface (`/jsonrpc` endpoints), because that is the path cross-chain wallets, TronWeb bridges, and arbitrage bots integrate against. The native TRON REST API surface (used by TronWeb + TronBox directly) has different method semantics (address encoding, resource model, `wallet/*` vs `walletsolidity/*` paths) and would need a chain-specific probe added. That will land as a separate `tron-rest` bench when the demand from integrators using TronWeb directly is clear." + - q: "Does the fastest TRON RPC change by region?" + a: "Often. TRON public infra concentrates operations in specific regions; a gateway that wins from Amsterdam can lose from Singapore by multiples. The region tabs at the top of the page re-scope every number on the page to a single origin; pick the one closest to where your requests actually originate." + - q: "How is TRON RPC latency measured here, technically?" + a: "One identical JSON-RPC POST (`eth_getBlockByNumber(\"latest\", false)`) every 60 seconds against each provider from each of 3 regions, using the same plain HTTP client the rest of the EVM cluster uses. Wall-clock round-trip is recorded at millisecond precision; p50/p90/p99 are computed via Prometheus `quantile_over_time` over 24 hours. Responses are classified (`ok` / `http_err` / `jsonrpc_err` / `stale` / `timeout`) so an endpoint stuck on an old head or returning errors behind HTTP 200 is never ranked as fastest." + +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/rpc-capabilities + +prometheus: + window: 24h + freshness_metric: rpc_latency_milliseconds + +# Per-cell (region) ranking matrix for scoped badge claims. Chain is +# fixed for the whole bench, so cells key on region alone. +rank_matrix_query: avg by (provider, region) (ocb:rpc_latency_milliseconds:p50_24h{chain="tron"}) + +# Region is the only dimension: chain is baked into every query. +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: trongrid + name: TronGrid + tag: Tron Foundation's official public API gateway + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to TronGrid's no-key TRON JSON-RPC endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="trongrid", chain="tron"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="trongrid", chain="tron"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="trongrid", chain="tron"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="trongrid", chain="tron"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="trongrid", chain="tron"}) / sum(ocb:rpc_call:rate_24h{provider="trongrid", chain="tron"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="trongrid", chain="tron"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="trongrid", chain="tron"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="trongrid", chain="tron", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="trongrid", chain="tron", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="trongrid", chain="tron", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="trongrid", chain="tron", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="trongrid", chain="tron", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="trongrid", chain="tron", region="sgp"}[1h]) + + - slug: drpc + name: dRPC + tag: Multi-provider RPC load balancer, edge-close routing + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to dRPC's no-key TRON JSON-RPC endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="tron"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="drpc", chain="tron"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="drpc", chain="tron"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="drpc", chain="tron"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="drpc", chain="tron"}) / sum(ocb:rpc_call:rate_24h{provider="drpc", chain="tron"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="drpc", chain="tron"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="tron"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="tron", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="tron", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="tron", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="tron", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="drpc", chain="tron", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="drpc", chain="tron", region="sgp"}[1h]) + + - slug: publicnode + name: PublicNode + tag: Allnodes-operated, 70+ chains, keyless TRON JSON-RPC path + formula: "50th percentile over 24h of client-side round-trip latency (ms) for a single `eth_getBlockByNumber(\"latest\", false)` POST sent every 60s from 3 regions (us-east + eu-west + sgp) to PublicNode's no-key TRON JSON-RPC endpoint." + queries: + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="tron"}) + p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="publicnode", chain="tron"}) + p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="publicnode", chain="tron"}) + mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="publicnode", chain="tron"}) + success: sum(ocb:rpc_call:ok_rate_24h{provider="publicnode", chain="tron"}) / sum(ocb:rpc_call:rate_24h{provider="publicnode", chain="tron"}) + sample_size: sum(ocb:rpc_call:increase_24h{provider="publicnode", chain="tron"}) + series: avg(avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="tron"}[1h])) + regions: + - region: us-east + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="tron", region="us-east"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="tron", region="us-east"}[1h]) + - region: eu-west + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="tron", region="eu-west"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="tron", region="eu-west"}[1h]) + - region: ap-southeast + p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="publicnode", chain="tron", region="sgp"}) + series: avg_over_time(rpc_latency_milliseconds{provider="publicnode", chain="tron", region="sgp"}[1h]) diff --git a/harnesses/rpc-capabilities/cmd/script/config.go b/harnesses/rpc-capabilities/cmd/script/config.go index da8d6880..927612b8 100644 --- a/harnesses/rpc-capabilities/cmd/script/config.go +++ b/harnesses/rpc-capabilities/cmd/script/config.go @@ -440,6 +440,53 @@ func chains() []Chain { {Slug: "soneium-official", Name: "Soneium Official", URL: envDefault("RPC_URL_SONEIUM_OFFICIAL", "https://rpc.soneium.org")}, }, }, + // ─── Hyperliquid HyperEVM (chain 999) — added 2026-07-24. Standard + // EVM JSON-RPC surface bolted onto the HyperCore perps engine. + // Providers live-verified keyless via eth_blockNumber during launch + // audit: hyperliquid-official (rpc.hyperliquid.xyz/evm), dRPC, + // Stakely, Purroof Group, Hypurrscan. Excluded by that sweep: + // Alchemy demo (rate-limited dead), thirdweb (`Invalid chain` + // error on HyperEVM), Grove/Pocket public LB (needs app id at + // public LB path), AllThatNode + Blast API + Chainstack + Gelato + // + Imperator HyperEVM guesses (DNS-fail or 401 without key), + // PublicNode (no HyperEVM subdomain yet). + { + Slug: "hyperliquid", + Name: "Hyperliquid", + Providers: []Provider{ + {Slug: "hyperliquid-official", Name: "Hyperliquid Labs", URL: envDefault("RPC_URL_HYPERLIQUID_OFFICIAL", "https://rpc.hyperliquid.xyz/evm")}, + {Slug: "drpc", Name: "dRPC", URL: envDefault("RPC_URL_HYPERLIQUID_DRPC", "https://hyperliquid.drpc.org")}, + {Slug: "stakely", Name: "Stakely", URL: envDefault("RPC_URL_HYPERLIQUID_STAKELY", "https://hyperliquid-json-rpc.stakely.io")}, + {Slug: "purroofgroup", Name: "Purroof Group", URL: envDefault("RPC_URL_HYPERLIQUID_PURROOF", "https://rpc.purroofgroup.com")}, + {Slug: "hypurrscan", Name: "Hypurrscan", URL: envDefault("RPC_URL_HYPERLIQUID_HYPURRSCAN", "https://rpc.hypurrscan.io")}, + }, + }, + // ─── TRON (JSON-RPC compat surface only) — added 2026-07-24. + // TRON exposes both a native REST API (wallet/getnowblock) and + // an EVM-compatible JSON-RPC surface at /jsonrpc. We probe the + // JSON-RPC surface because that is the path every cross-chain + // wallet + TronWeb/EVM bridge integrates against. Providers + // live-verified keyless via eth_blockNumber during launch + // audit: TronGrid (api.trongrid.io/jsonrpc — Tron Foundation + // official), dRPC and PublicNode/Allnodes. Excluded by that + // sweep: Ankr (API key required despite public branding), + // Chainstack + NOWNodes + GetBlock + Tatum + BlockPI (all + // require API key on TRON JSON-RPC path), OnFinality + Blast + // API + AllThatNode (no public TRON JSON-RPC gateway). The + // TRON JSON-RPC provider market is materially smaller than + // EVM — most TRON infra vendors expose only the native TRON + // REST API keyless. Native REST API surface is out of scope + // for this cluster; a `tron-rest` bench would need a + // chain-specific probe. + { + Slug: "tron", + Name: "TRON", + Providers: []Provider{ + {Slug: "trongrid", Name: "TronGrid", URL: envDefault("RPC_URL_TRON_TRONGRID", "https://api.trongrid.io/jsonrpc")}, + {Slug: "drpc", Name: "dRPC", URL: envDefault("RPC_URL_TRON_DRPC", "https://tron.drpc.org")}, + {Slug: "publicnode", Name: "PublicNode", URL: envDefault("RPC_URL_TRON_PUBLICNODE", "https://tron.publicnode.com/jsonrpc")}, + }, + }, } filter := strings.TrimSpace(os.Getenv("OCB_CHAINS")) diff --git a/src/data/provider-registry.ts b/src/data/provider-registry.ts index c639281c..18c02f94 100644 --- a/src/data/provider-registry.ts +++ b/src/data/provider-registry.ts @@ -609,6 +609,36 @@ export const PROVIDER_REGISTRY: Record = { "Cosmos validator running multi-chain no-key RPC endpoints under rpc.lavenderfive.com/ and lcd.lavenderfive.com/. Covers Osmosis, Cosmos Hub, Neutron, Injective and 20+ other Cosmos SDK chains.", twitter: "@LavenderFive", }, + "hyperliquid-official": { + url: "https://hyperliquid.xyz", + description: + "Hyperliquid Labs's official public HyperEVM RPC endpoint (rpc.hyperliquid.xyz/evm). Standard EVM JSON-RPC (eth_blockNumber, eth_getBlockByNumber, eth_getBalance), keyless, rate-limited per IP. The reference endpoint HyperCore front-ends and Hyperliquid dashboards route through by default.", + twitter: "@HyperliquidX", + }, + stakely: { + url: "https://stakely.io", + description: + "Non-custodial staking + infra provider running keyless public RPC endpoints across HyperEVM, Cosmos, Solana and 30+ chains. Founded 2019, EU-based, self-hosted validator fleet.", + twitter: "@stakely_io", + }, + purroofgroup: { + url: "https://purroofgroup.com", + description: + "Community-operated Hyperliquid validator and public RPC (rpc.purroofgroup.com). One of the earliest independent HyperEVM RPC providers; keyless, community-maintained.", + twitter: "@PurroofGroup", + }, + hypurrscan: { + url: "https://hypurrscan.io", + description: + "Community HyperEVM block explorer + public RPC gateway (rpc.hypurrscan.io). Indexed transaction search, contract verification, and a no-key HyperEVM JSON-RPC endpoint alongside the explorer UI.", + twitter: "@hypurrscan", + }, + trongrid: { + url: "https://www.trongrid.io", + description: + "TRON Foundation's official public API gateway (api.trongrid.io). Serves both the native TRON REST API (wallet/getnowblock, wallet/triggersmartcontract) and an EVM-compatible JSON-RPC endpoint (/jsonrpc). Keyless with a free API-key tier for higher quotas. The reference endpoint every TronWeb/tronbox integrator points at first.", + twitter: "@Trondao", + }, dwellir: { url: "https://www.dwellir.com", description: diff --git a/src/lib/chains.ts b/src/lib/chains.ts index 42a7b3b8..5444c075 100644 --- a/src/lib/chains.ts +++ b/src/lib/chains.ts @@ -333,6 +333,14 @@ export const CHAINS: ChainEntry[] = [ description: "Cosmos SDK appchain and the largest IBC-connected DEX. CometBFT (Tendermint) consensus with deterministic finality per block, ~6 s block time. TokenFactory + IBC v3 native, x/superfluid staking on LP shares.", }, + { + slug: "hyperliquid", + label: "Hyperliquid", + category: "L1", + nativeSymbol: "HYPE", + description: + "HyperEVM (chain id 999). Hyperliquid Labs's EVM execution layer bolted onto the HyperCore perps engine, ~2 s blocks, HyperBFT consensus, native HYPE gas. First on-chain perp DEX to reach $1B+ daily volume.", + }, ]; export const CHAIN_BY_SLUG = new Map(CHAINS.map((c) => [c.slug, c])); diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts index e1d29f33..2c63caef 100644 --- a/src/lib/logo-manifest.ts +++ b/src/lib/logo-manifest.ts @@ -386,6 +386,8 @@ const ALIASES: Record = { "solana-labs": "solana", "polkadot-official": "parity", "osmosis-official": "osmosis", + "hyperliquid-official": "hyperliquid", + trongrid: "tron", hood: "robinhood", coin: "coinbase", "megaeth-official": "megaeth", diff --git a/src/lib/spec.ts b/src/lib/spec.ts index 873997e8..38071a47 100644 --- a/src/lib/spec.ts +++ b/src/lib/spec.ts @@ -303,7 +303,8 @@ const loadBenchmarkUnfilteredCached = unstable_cache( // cadence). Bench SET shrank. // v38: mobula dropped from pm-data-freshness (they stopped serving 2026-07-19). // v39: bench 091 osmosis-rpc ship (Cosmos SDK Kind added to harness). - ["bench-unfiltered-v39", process.env.VERCEL_ENV === "production" ? "prod" : "all"], + // v40: benches 092 hyperliquid-rpc + 093 tron-rpc ship (bench SET grew by 2). + ["bench-unfiltered-v40", process.env.VERCEL_ENV === "production" ? "prod" : "all"], { revalidate: 300, tags: ["benchmarks"] }, ); @@ -509,7 +510,8 @@ const loadAllBenchmarksCached = unstable_cache( // v34: bumped with bench-unfiltered-v31 (084 indexer-latency dropped). // v41: bumped in lockstep with bench-unfiltered-v38 (mobula drop). // v42: bumped in lockstep with bench-unfiltered-v39 (osmosis-rpc ship). - ["all-benchmarks-v42", process.env.VERCEL_ENV === "production" ? "prod" : "all"], + // v43: bumped in lockstep with bench-unfiltered-v40 (hyperliquid-rpc + tron-rpc ship). + ["all-benchmarks-v43", process.env.VERCEL_ENV === "production" ? "prod" : "all"], { revalidate: 300, tags: ["benchmarks"] }, ); export const loadAllBenchmarks = cache(loadAllBenchmarksCached);