From 1979c4de16b447cf791d05b16dd441bf122cfc45 Mon Sep 17 00:00:00 2001
From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com>
Date: Sat, 29 Aug 2026 18:01:29 +0200
Subject: [PATCH] feat(rpc): add Union bench #253 (Nodes.Guru, Stake And Relax,
High Stakes)
---
benchmarks/union-rpc.yml | 138 ++++++++++++++++++
.../rpc-capabilities/cmd/script/config.go | 11 ++
public/logos/union.svg | 4 +
src/data/provider-registry.ts | 20 +++
src/lib/brand.ts | 3 +-
src/lib/logo-manifest.ts | 1 +
6 files changed, 176 insertions(+), 1 deletion(-)
create mode 100644 benchmarks/union-rpc.yml
create mode 100644 public/logos/union.svg
diff --git a/benchmarks/union-rpc.yml b/benchmarks/union-rpc.yml
new file mode 100644
index 00000000..0373e481
--- /dev/null
+++ b/benchmarks/union-rpc.yml
@@ -0,0 +1,138 @@
+# OpenChainBench. Bench No 253
+
+slug: union-rpc
+number: "253"
+title: Fastest free Union RPC, live no-key endpoint latency
+seo_title: "Fastest free Union RPC 2026"
+seo_description: "{{best_name}} leads free Union 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 Union (union-1) endpoint, audited every 60 seconds from 3 regions.
+
+category: RPCs
+status: live
+metric: RPC latency
+unit: ms
+higher_is_better: false
+
+seo_intro: |
+ Union is a trust-minimised, zero-knowledge cross-chain protocol built on a custom Cosmos SDK chain (chain ID union-1). It enables secure interoperability between Cosmos, EVM, and other ecosystems via ZK proof-based consensus verification — no external validators or multisigs required. The chain uses the standard Tendermint RPC interface; block height is fetched via the /status endpoint. Public keyless RPC nodes are provided by Nodes.Guru, Stake And Relax, and High Stakes. Every provider was live-verified with consecutive block-height probes at launch.
+
+abstract: |
+ Per-chain member of the RPC latency cluster, extended to Union (union-1).
+ We measure the round-trip latency of a Tendermint /status query against
+ every available public Union 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 /status request
+ from which the block number is extracted.
+ The harness classifies every response (ok / http_err / jsonrpc_err / stale / timeout)
+ with a Cosmos-scaled staleness gap (20 blocks, around 80 s at 4 s/block).
+ The cross-chain view lives on the parent rpc-capabilities benchmark;
+ this page is the Union-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. The result.sync_info.latest_block_height field (string-encoded integer) is extracted as the current 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 20 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=union. Provider coverage at launch: 3 endpoints (Nodes.Guru, Stake And Relax, High Stakes)."
+
+findings:
+ - "{{best_name}} leads free Union RPC at {{best_p50}} (Tendermint /status p50, 24h) across 3 measured providers."
+
+faq:
+ - q: "What is the fastest free Union RPC right now?"
+ a: "{{best_name}} currently leads at {{best_p50}} (Union 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 Union RPC endpoints work without an API key?"
+ a: "3 endpoints sustain continuous keyless probing at launch: Nodes.Guru (rpc-1.union.nodes.guru), Stake And Relax (union-rpc.stakeandrelax.net), and High Stakes (union-rpc.highstakes.ch). Every listed endpoint was live-verified before inclusion."
+ - q: "What is Union and why does its RPC latency matter?"
+ a: "Union is a ZK-based cross-chain interoperability protocol with a native Cosmos SDK chain (union-1). It connects blockchains without trusted intermediaries by verifying consensus proofs on-chain. Developers building cross-chain applications, bridges, or omnichain protocols on Union need reliable low-latency RPC access to query transactions, proofs, and chain state."
+ - q: "Does the fastest Union RPC change by region?"
+ a: "Often. Community validators like Nodes.Guru and High Stakes host in different datacentres. The region tabs re-scope every number to a single probe origin so you can pick the best endpoint for your user base."
+ - q: "What makes Union different from other cross-chain protocols?"
+ a: "Union replaces trusted validator sets and multisigs with ZK consensus proofs, making cross-chain message passing verifiable on-chain. This means no external trust assumptions — the security of the bridge reduces to the security of the underlying chains and ZK proof system."
+
+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="union"})
+
+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: nodes-guru
+ name: Nodes.Guru
+ tag: Nodes.Guru public Union RPC, no API key required
+ formula: "50th percentile over 24h of client-side round-trip latency (ms) for a GET /status sent every 60s from 3 regions to rpc-1.union.nodes.guru."
+ queries:
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodes-guru", chain="union"})
+ p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="nodes-guru", chain="union"})
+ p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="nodes-guru", chain="union"})
+ mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="nodes-guru", chain="union"})
+ success: sum(ocb:rpc_call:ok_rate_24h{provider="nodes-guru", chain="union"}) / sum(ocb:rpc_call:rate_24h{provider="nodes-guru", chain="union"})
+ sample_size: sum(ocb:rpc_call:increase_24h{provider="nodes-guru", chain="union"})
+ series: avg(avg_over_time(rpc_latency_milliseconds{provider="nodes-guru", chain="union"}[1h]))
+ regions:
+ - region: us-east
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodes-guru", chain="union", region="us-east"})
+ series: avg_over_time(rpc_latency_milliseconds{provider="nodes-guru", chain="union", region="us-east"}[1h])
+ - region: eu-west
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodes-guru", chain="union", region="eu-west"})
+ series: avg_over_time(rpc_latency_milliseconds{provider="nodes-guru", chain="union", region="eu-west"}[1h])
+ - region: ap-southeast
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="nodes-guru", chain="union", region="sgp"})
+ series: avg_over_time(rpc_latency_milliseconds{provider="nodes-guru", chain="union", region="sgp"}[1h])
+
+ - slug: stakeandrelax
+ name: Stake And Relax
+ tag: Stake And Relax public Union RPC, no API key required
+ formula: "50th percentile over 24h of client-side round-trip latency (ms) for a GET /status sent every 60s from 3 regions to union-rpc.stakeandrelax.net."
+ queries:
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakeandrelax", chain="union"})
+ p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="stakeandrelax", chain="union"})
+ p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="stakeandrelax", chain="union"})
+ mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="stakeandrelax", chain="union"})
+ success: sum(ocb:rpc_call:ok_rate_24h{provider="stakeandrelax", chain="union"}) / sum(ocb:rpc_call:rate_24h{provider="stakeandrelax", chain="union"})
+ sample_size: sum(ocb:rpc_call:increase_24h{provider="stakeandrelax", chain="union"})
+ series: avg(avg_over_time(rpc_latency_milliseconds{provider="stakeandrelax", chain="union"}[1h]))
+ regions:
+ - region: us-east
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakeandrelax", chain="union", region="us-east"})
+ series: avg_over_time(rpc_latency_milliseconds{provider="stakeandrelax", chain="union", region="us-east"}[1h])
+ - region: eu-west
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakeandrelax", chain="union", region="eu-west"})
+ series: avg_over_time(rpc_latency_milliseconds{provider="stakeandrelax", chain="union", region="eu-west"}[1h])
+ - region: ap-southeast
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="stakeandrelax", chain="union", region="sgp"})
+ series: avg_over_time(rpc_latency_milliseconds{provider="stakeandrelax", chain="union", region="sgp"}[1h])
+
+ - slug: highstakes
+ name: High Stakes
+ tag: High Stakes public Union RPC, no API key required
+ formula: "50th percentile over 24h of client-side round-trip latency (ms) for a GET /status sent every 60s from 3 regions to union-rpc.highstakes.ch."
+ queries:
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="highstakes", chain="union"})
+ p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="highstakes", chain="union"})
+ p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="highstakes", chain="union"})
+ mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="highstakes", chain="union"})
+ success: sum(ocb:rpc_call:ok_rate_24h{provider="highstakes", chain="union"}) / sum(ocb:rpc_call:rate_24h{provider="highstakes", chain="union"})
+ sample_size: sum(ocb:rpc_call:increase_24h{provider="highstakes", chain="union"})
+ series: avg(avg_over_time(rpc_latency_milliseconds{provider="highstakes", chain="union"}[1h]))
+ regions:
+ - region: us-east
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="highstakes", chain="union", region="us-east"})
+ series: avg_over_time(rpc_latency_milliseconds{provider="highstakes", chain="union", region="us-east"}[1h])
+ - region: eu-west
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="highstakes", chain="union", region="eu-west"})
+ series: avg_over_time(rpc_latency_milliseconds{provider="highstakes", chain="union", region="eu-west"}[1h])
+ - region: ap-southeast
+ p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="highstakes", chain="union", region="sgp"})
+ series: avg_over_time(rpc_latency_milliseconds{provider="highstakes", chain="union", region="sgp"}[1h])
diff --git a/harnesses/rpc-capabilities/cmd/script/config.go b/harnesses/rpc-capabilities/cmd/script/config.go
index c985e447..18646067 100644
--- a/harnesses/rpc-capabilities/cmd/script/config.go
+++ b/harnesses/rpc-capabilities/cmd/script/config.go
@@ -1693,6 +1693,17 @@ func chains() []Chain {
{Slug: "cosmos-directory", Name: "Cosmos Directory", URL: envDefault("RPC_URL_SENTINEL_COSMOSDIRECTORY", "https://rpc.cosmos.directory/sentinel")},
},
},
+ // 2026-08-29 wave-12. Union — Cosmos SDK (union-1), Tendermint /status. Nodes.Guru + Stake And Relax + High Stakes.
+ {
+ Slug: "union",
+ Name: "Union",
+ Kind: "cosmos",
+ Providers: []Provider{
+ {Slug: "nodes-guru", Name: "Nodes.Guru", URL: envDefault("RPC_URL_UNION_NODESGURU", "https://rpc-1.union.nodes.guru")},
+ {Slug: "stakeandrelax", Name: "Stake And Relax", URL: envDefault("RPC_URL_UNION_STAKEANDRELAX", "https://union-rpc.stakeandrelax.net")},
+ {Slug: "highstakes", Name: "High Stakes", URL: envDefault("RPC_URL_UNION_HIGHSTAKES", "https://union-rpc.highstakes.ch")},
+ },
+ },
// 2026-08-28 wave-11. Fetch.ai (FetchHub-4) — Cosmos SDK, Tendermint /status. Official + PublicNode + Cosmos Directory.
{
Slug: "fetchhub",
diff --git a/public/logos/union.svg b/public/logos/union.svg
new file mode 100644
index 00000000..a1957ae2
--- /dev/null
+++ b/public/logos/union.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/data/provider-registry.ts b/src/data/provider-registry.ts
index a3e40769..9046f4ba 100644
--- a/src/data/provider-registry.ts
+++ b/src/data/provider-registry.ts
@@ -2619,6 +2619,26 @@ export const PROVIDER_REGISTRY: Record = {
"Fetch.ai official public Tendermint RPC node for the FetchHub-4 mainnet. Keyless endpoint maintained by the Fetch.ai / ASI Alliance team.",
twitter: "@Fetch_ai",
},
+
+ // ─── Union providers (bench 253) ─────────────────────────────────────
+ "nodes-guru": {
+ url: "https://nodes.guru",
+ description:
+ "Nodes.Guru community validator and public RPC operator. Runs keyless Tendermint RPC endpoints for multiple Cosmos SDK chains including Union.",
+ twitter: "@nodes_guru",
+ },
+ stakeandrelax: {
+ url: "https://stakeandrelax.net",
+ description:
+ "Stake And Relax community validator providing public keyless Tendermint RPC for Cosmos SDK chains including Union.",
+ twitter: "@StakeAndRelax",
+ },
+ highstakes: {
+ url: "https://highstakes.ch",
+ description:
+ "High Stakes Swiss validator and public RPC operator. Provides keyless Tendermint RPC endpoints for multiple Cosmos SDK chains including Union.",
+ twitter: "@HighStakesCH",
+ },
};
/**
diff --git a/src/lib/brand.ts b/src/lib/brand.ts
index 8fb6c311..453dc405 100644
--- a/src/lib/brand.ts
+++ b/src/lib/brand.ts
@@ -173,11 +173,12 @@ const BRANDS: Record = {
acala: { color: "#E40C5B" }, // acala red/pink (official brand)
interlay: { color: "#1A3BDB" }, // interlay blue (official brand)
- // ─── Cosmos SDK chains (benches 247, 250-252) ───
+ // ─── Cosmos SDK chains (benches 247, 250-253) ───
babylon: { color: "#F8811A" }, // babylon orange (official brand)
chihuahua: { color: "#E05F2A" }, // chihuahua orange-red (official brand)
sentinel: { color: "#00C2FF" }, // sentinel cyan (official brand)
fetchhub: { color: "#3B2D8E" }, // fetch.ai deep purple (official brand)
+ union: { color: "#6366F1" }, // union indigo (brand kit)
"cosmos-directory": { color: "#1B1B2F", dark: true }, // cosmos directory dark navy
// ─── Bitcoin Cash chain + providers (bench 244) ───
diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts
index 3fca81c4..d221da4d 100644
--- a/src/lib/logo-manifest.ts
+++ b/src/lib/logo-manifest.ts
@@ -331,6 +331,7 @@ const RAW: Record = {
chihuahua: "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/logos/chihuahua.svg",
sentinel: "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/logos/sentinel.svg",
fetchhub: "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/logos/fetchai.svg",
+ union: "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/logos/union.svg",
"cosmos-directory": "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/logos/cosmos-directory.svg",
// ─── Oracle deviation (bench 025) — additional brand logos ───