diff --git a/benchmarks/bandchain-rpc.yml b/benchmarks/bandchain-rpc.yml new file mode 100644 index 00000000..67a1c01f --- /dev/null +++ b/benchmarks/bandchain-rpc.yml @@ -0,0 +1,35 @@ +id: 256 +slug: bandchain-rpc +title: "Band Protocol RPC" +chain: bandchain +description: "Latency and availability benchmark for Band Protocol public RPC endpoints" +category: rpc +kind: cosmos + +providers: + - slug: band-official + name: "Band Protocol" + url: "http://rpc.laozi1.bandchain.org:80" + - slug: highstakes + name: "High Stakes" + url: "https://bandprotocol-rpc.highstakes.ch" + - slug: stakewolle + name: "Stakewolle" + url: "https://public.stakewolle.com/cosmos/bandchain/rpc" + +seo_intro: | + Band Protocol is a cross-chain oracle network built on Cosmos SDK that aggregates and connects real-world data and APIs to smart contracts. The laozi-mainnet hosts its decentralized data oracle infrastructure, enabling DeFi protocols across multiple blockchains to access tamper-proof price feeds. + + This benchmark continuously measures RPC latency, availability and block-height freshness across public Band Protocol Tendermint endpoints from three geographic regions. Use it to select the fastest endpoint for your integration or validator setup. + +faq: + - q: "What does this benchmark measure?" + a: "Each probe issues a GET /status request with anti-cache headers to retrieve the latest block height. We record round-trip latency (p50/p90/p99), HTTP availability, and whether the returned block height is current. Probes run every 30 seconds from US East, EU West, and AP Southeast." + - q: "Which endpoints are included?" + a: "The benchmark covers the Band Protocol official endpoint (rpc.laozi1.bandchain.org), High Stakes, and Stakewolle. All three are keyless public endpoints requiring no authentication." + - q: "Why does Band Protocol RPC performance matter?" + a: "Band Protocol validators and oracle scripts depend on reliable RPC access to submit data requests and retrieve oracle results. DeFi protocols integrating Band price feeds need low-latency RPC for real-time data consumption." + - q: "How are oracle scripts affected by RPC latency?" + a: "Yoda (the oracle daemon) and Bothan (data proxy) both rely on RPC to monitor pending data requests and submit responses within the request window. High latency or downtime directly reduces oracle reliability and can cause missed rewards." + - q: "Can I contribute an endpoint?" + a: "Yes. Open an issue or PR at github.com/ChainBench/OpenChainBench with the endpoint URL and operator name. We verify liveness and independence before adding." diff --git a/benchmarks/cheqd-rpc.yml b/benchmarks/cheqd-rpc.yml new file mode 100644 index 00000000..c5d02883 --- /dev/null +++ b/benchmarks/cheqd-rpc.yml @@ -0,0 +1,35 @@ +id: 257 +slug: cheqd-rpc +title: "cheqd RPC" +chain: cheqd +description: "Latency and availability benchmark for cheqd public RPC endpoints" +category: rpc +kind: cosmos + +providers: + - slug: cheqd-official + name: "cheqd" + url: "https://rpc.cheqd.net" + - slug: publicnode + name: "PublicNode" + url: "https://cheqd-rpc.publicnode.com:443" + - slug: nodestake + name: "NodeStake" + url: "https://rpc.cheqd.nodestake.org" + +seo_intro: | + cheqd is a purpose-built Cosmos SDK blockchain for decentralized identity, enabling self-sovereign identity (SSI) and verifiable credentials at scale. The cheqd-mainnet-1 network anchors DIDs and credential schemas used by enterprises, governments, and developers building trust infrastructure. + + This benchmark continuously measures RPC latency, availability and block-height freshness across public cheqd Tendermint endpoints from three geographic regions. Use it to select the most reliable endpoint for identity resolution, node operation, or application integration. + +faq: + - q: "What does this benchmark measure?" + a: "Each probe issues a GET /status request with anti-cache headers to retrieve the latest block height. We record round-trip latency (p50/p90/p99), HTTP availability, and whether the returned block height is current. Probes run every 30 seconds from US East, EU West, and AP Southeast." + - q: "Which endpoints are included?" + a: "The benchmark covers the official cheqd endpoint (rpc.cheqd.net), PublicNode, and NodeStake. All three are keyless public endpoints requiring no API key." + - q: "Why does cheqd RPC performance matter?" + a: "DID resolution, verifiable credential anchoring, and CHEQ token transfers all depend on RPC availability. Applications using the cheqd DID method resolve identifiers via RPC, making latency directly visible to end users." + - q: "How does RPC latency affect DID resolution?" + a: "The Universal Resolver and cheqd-specific resolvers query RPC endpoints to fetch DID documents. Slow or unavailable endpoints increase credential verification times and can break SSI flows in production." + - q: "Can I contribute an endpoint?" + a: "Yes. Open an issue or PR at github.com/ChainBench/OpenChainBench with the endpoint URL and operator name. We verify liveness and independence before adding." diff --git a/harnesses/rpc-capabilities/cmd/script/config.go b/harnesses/rpc-capabilities/cmd/script/config.go index 8af3e2ce..dc35473f 100644 --- a/harnesses/rpc-capabilities/cmd/script/config.go +++ b/harnesses/rpc-capabilities/cmd/script/config.go @@ -1671,6 +1671,94 @@ func chains() []Chain { {Slug: "interlay-official", Name: "Interlay", URL: envDefault("RPC_URL_INTERLAY_OFFICIAL", "https://api.interlay.io/parachain")}, }, }, + // 2026-08-28 wave-11. Chihuahua — Cosmos SDK, Tendermint /status. Official node + Polkachu + Validatus. + { + Slug: "chihuahua", + Name: "Chihuahua", + Kind: "cosmos", + Providers: []Provider{ + {Slug: "chihuahua-official", Name: "Chihuahua", URL: envDefault("RPC_URL_CHIHUAHUA_OFFICIAL", "https://rpc.chihuahua.wtf")}, + {Slug: "polkachu", Name: "Polkachu", URL: envDefault("RPC_URL_CHIHUAHUA_POLKACHU", "https://chihuahua-rpc.polkachu.com")}, + {Slug: "validatus", Name: "Validatus", URL: envDefault("RPC_URL_CHIHUAHUA_VALIDATUS", "https://rpc.chihuahua.validatus.com")}, + }, + }, + // 2026-08-28 wave-11. Sentinel — Cosmos SDK, Tendermint /status. Polkachu + PublicNode + Cosmos Directory. + { + Slug: "sentinel", + Name: "Sentinel", + Kind: "cosmos", + Providers: []Provider{ + {Slug: "polkachu", Name: "Polkachu", URL: envDefault("RPC_URL_SENTINEL_POLKACHU", "https://sentinel-rpc.polkachu.com")}, + {Slug: "publicnode", Name: "PublicNode", URL: envDefault("RPC_URL_SENTINEL_PUBLICNODE", "https://sentinel-rpc.publicnode.com")}, + {Slug: "cosmos-directory", Name: "Cosmos Directory", URL: envDefault("RPC_URL_SENTINEL_COSMOSDIRECTORY", "https://rpc.cosmos.directory/sentinel")}, + }, + }, + // 2026-08-29 wave-12. Shentu — Cosmos SDK (shentu-2.2), Tendermint /status. Shentu official + Polkachu + High Stakes. + { + Slug: "shentu", + Name: "Shentu", + Kind: "cosmos", + Providers: []Provider{ + {Slug: "shentu-official", Name: "Shentu", URL: envDefault("RPC_URL_SHENTU_OFFICIAL", "https://rpc.shentu.org:443")}, + {Slug: "polkachu", Name: "Polkachu", URL: envDefault("RPC_URL_SHENTU_POLKACHU", "https://shentu-rpc.polkachu.com:443")}, + {Slug: "highstakes", Name: "High Stakes", URL: envDefault("RPC_URL_SHENTU_HIGHSTAKES", "https://shentu-rpc.highstakes.ch")}, + }, + }, + // 2026-08-29 wave-12. MANTRA Chain — Cosmos SDK (mantra-1), Tendermint /status. Official + ITRocket + Polkachu. + { + Slug: "mantrachain", + Name: "MANTRA Chain", + Kind: "cosmos", + Providers: []Provider{ + {Slug: "mantrachain-official", Name: "MANTRA", URL: envDefault("RPC_URL_MANTRA_OFFICIAL", "https://rpc.mantrachain.io")}, + {Slug: "itrocket", Name: "ITRocket", URL: envDefault("RPC_URL_MANTRA_ITROCKET", "https://mantra-mainnet-rpc.itrocket.net:443")}, + {Slug: "polkachu", Name: "Polkachu", URL: envDefault("RPC_URL_MANTRA_POLKACHU", "https://mantra-rpc.polkachu.com:443")}, + }, + }, + // 2026-08-29 wave-13. Band Protocol — Cosmos SDK (laozi-mainnet), Tendermint /status. Official + High Stakes + Stakewolle. + { + Slug: "bandchain", + Name: "Band Protocol", + Kind: "cosmos", + Providers: []Provider{ + {Slug: "band-official", Name: "Band Protocol", URL: envDefault("RPC_URL_BAND_OFFICIAL", "http://rpc.laozi1.bandchain.org:80")}, + {Slug: "highstakes", Name: "High Stakes", URL: envDefault("RPC_URL_BAND_HIGHSTAKES", "https://bandprotocol-rpc.highstakes.ch")}, + {Slug: "stakewolle", Name: "Stakewolle", URL: envDefault("RPC_URL_BAND_STAKEWOLLE", "https://public.stakewolle.com/cosmos/bandchain/rpc")}, + }, + }, + // 2026-08-29 wave-13. cheqd — Cosmos SDK (cheqd-mainnet-1), Tendermint /status. Official + PublicNode + NodeStake. + { + Slug: "cheqd", + Name: "cheqd", + Kind: "cosmos", + Providers: []Provider{ + {Slug: "cheqd-official", Name: "cheqd", URL: envDefault("RPC_URL_CHEQD_OFFICIAL", "https://rpc.cheqd.net")}, + {Slug: "publicnode", Name: "PublicNode", URL: envDefault("RPC_URL_CHEQD_PUBLICNODE", "https://cheqd-rpc.publicnode.com:443")}, + {Slug: "nodestake", Name: "NodeStake", URL: envDefault("RPC_URL_CHEQD_NODESTAKE", "https://rpc.cheqd.nodestake.org")}, + }, + }, + // 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", + Name: "Fetch.ai", + Kind: "cosmos", + Providers: []Provider{ + {Slug: "fetchai-official", Name: "Fetch.ai", URL: envDefault("RPC_URL_FETCHHUB_OFFICIAL", "https://rpc-fetchhub.fetch.ai")}, + {Slug: "publicnode", Name: "PublicNode", URL: envDefault("RPC_URL_FETCHHUB_PUBLICNODE", "https://fetch-rpc.publicnode.com")}, + {Slug: "cosmos-directory", Name: "Cosmos Directory", URL: envDefault("RPC_URL_FETCHHUB_COSMOSDIRECTORY", "https://rpc.cosmos.directory/fetchhub")}, + }, + }, // 2026-08-27 wave-10. Zcash — getblockcount JSON-RPC (Tatum zcashd + Tatum Zebra) + Blockchair REST GET. ~75 s/block. { Slug: "zcash", diff --git a/public/logos/bandchain.svg b/public/logos/bandchain.svg new file mode 100644 index 00000000..ec9ec2f2 --- /dev/null +++ b/public/logos/bandchain.svg @@ -0,0 +1,4 @@ + + + BAND + diff --git a/public/logos/cheqd.svg b/public/logos/cheqd.svg new file mode 100644 index 00000000..10461cae --- /dev/null +++ b/public/logos/cheqd.svg @@ -0,0 +1,4 @@ + + + CHEQD + diff --git a/public/logos/nodestake.svg b/public/logos/nodestake.svg new file mode 100644 index 00000000..609a7590 --- /dev/null +++ b/public/logos/nodestake.svg @@ -0,0 +1,5 @@ + + + NODE + STAKE + diff --git a/public/logos/stakewolle.svg b/public/logos/stakewolle.svg new file mode 100644 index 00000000..08a9774d --- /dev/null +++ b/public/logos/stakewolle.svg @@ -0,0 +1,5 @@ + + + STAKE + WOLLE + diff --git a/src/app/api/fee-compare/route.ts b/src/app/api/fee-compare/route.ts index e2d8c6ed..15affc83 100644 --- a/src/app/api/fee-compare/route.ts +++ b/src/app/api/fee-compare/route.ts @@ -180,7 +180,8 @@ type HlWalletData = { type GainsWalletData = { events: number; - feesUsdc: number; + feesUsdc: number; // taker fee only (uiRealizedPnlData) + vaultFeesUsdc: number; // OI imbalance vault fee (tradeFeesData - uiRealizedPnlData) fundingFeesUsdc: number; fundingEstimated: boolean; borrowingFeesUsdc: number; @@ -192,9 +193,11 @@ type GainsWalletData = { pair: string; action: string; notional: number; - tradingFee: number; + tradingFee: number; // taker fee only + vaultFee: number; // OI vault fee fundingFee: number; borrowingFee: number; + equivFee?: number; // equivalent taker fee on the other venue pnl_net: number; }>; }; @@ -1503,23 +1506,36 @@ export async function GET(req: Request) { } else if (fetchEvmWallet && slug === "gains") { const CLOSE_ACTIONS = new Set(["TradeClosedMarket", "TradeClosedTP", "TradeClosedSL", "TradeClosedLIQ"]); const usdcTrades = gainsTradesData.filter((t) => t.collateralIndex === 3); + const otherSlug = slug === venueA ? venueB : venueA; + const otherRate = slug === venueA ? rateB : rateA; let feesUsdc = 0; + let vaultFeesUsdc = 0; let fundingFeesUsdc = 0; let borrowingFeesUsdc = 0; let notionalUsd = 0; const recentTrades: GainsWalletData["recentTrades"] = []; for (const t of usdcTrades) { - const tradingFee = t.meta?.tradeFeesData?.realizedTradingFeesCollateral ?? 0; + // uiRealizedPnlData = pure taker fee; tradeFeesData = taker + OI vault fee + const takerFee = t.meta?.uiRealizedPnlData?.realizedTradingFeesCollateral + ?? t.meta?.tradeFeesData?.realizedTradingFeesCollateral + ?? 0; + const totalTradingFee = t.meta?.tradeFeesData?.realizedTradingFeesCollateral ?? takerFee; + const vaultFee = Math.max(0, totalTradingFee - takerFee); const isClose = CLOSE_ACTIONS.has(t.action); const fundingFee = isClose ? (t.meta?.uiRealizedPnlData?.realizedFundingFeesCollateral ?? 0) : 0; const borrowingFee = isClose ? (t.meta?.uiRealizedPnlData?.realizedNewBorrowingFeesCollateral ?? 0) : 0; - feesUsdc += tradingFee; + const tradeNotional = t.size * t.leverage; + feesUsdc += takerFee; + vaultFeesUsdc += vaultFee; fundingFeesUsdc += fundingFee; borrowingFeesUsdc += borrowingFee; - notionalUsd += t.size * t.leverage; + notionalUsd += tradeNotional; if (recentTrades.length < 50) { - recentTrades.push({ date: t.date, pair: t.pair, action: t.action, notional: t.size * t.leverage, tradingFee, fundingFee, borrowingFee, pnl_net: t.pnl_net }); + const equivFee = otherSlug === "hyperliquid" + ? tradeNotional * (gainsData.perSide[t.pair.split("/")[0]] ?? otherRate) + : tradeNotional * otherRate; + recentTrades.push({ date: t.date, pair: t.pair, action: t.action, notional: tradeNotional, tradingFee: takerFee, vaultFee, fundingFee, borrowingFee, equivFee, pnl_net: t.pnl_net }); } } @@ -1535,10 +1551,11 @@ export async function GET(req: Request) { } } - const netCostUsdc = feesUsdc + fundingFeesUsdc + borrowingFeesUsdc; + const netCostUsdc = feesUsdc + vaultFeesUsdc + fundingFeesUsdc + borrowingFeesUsdc; walletData = { events: usdcTrades.length, feesUsdc, + vaultFeesUsdc, fundingFeesUsdc, fundingEstimated, borrowingFeesUsdc, diff --git a/src/components/fee-compare-client.tsx b/src/components/fee-compare-client.tsx index a98e7b83..0f8fc2d2 100644 --- a/src/components/fee-compare-client.tsx +++ b/src/components/fee-compare-client.tsx @@ -75,6 +75,7 @@ type HlWalletData = { type GainsWalletData = { events: number; feesUsdc: number; + vaultFeesUsdc: number; fundingFeesUsdc: number; fundingEstimated: boolean; borrowingFeesUsdc: number; @@ -87,8 +88,10 @@ type GainsWalletData = { action: string; notional: number; tradingFee: number; + vaultFee: number; fundingFee: number; borrowingFee: number; + equivFee?: number; pnl_net: number; }>; }; @@ -732,6 +735,7 @@ function WalletSide({ })()} {venue.slug === "gains" && (() => { const gW = w as GainsWalletData; + const hasVault = (gW.vaultFeesUsdc ?? 0) > 0.5; const hasFunding = Math.abs(gW.fundingFeesUsdc) > 0.5; const hasBorrowing = gW.borrowingFeesUsdc > 0.5; return ( @@ -742,9 +746,18 @@ function WalletSide({
-

Trading fees

+

Taker fees

{fmtUsd(gW.feesUsdc)}

+ {hasVault && ( +
+

+ OI vault fee + (OI imbalance surcharge) +

+

+{fmtUsd(gW.vaultFeesUsdc)}

+
+ )} {hasFunding && (

@@ -772,7 +785,7 @@ function WalletSide({

Net cost{" "} - {hasFunding || hasBorrowing ? "incl. carry" : "trading only"} + {hasVault || hasFunding || hasBorrowing ? "all fees" : "taker only"}

@@ -1135,13 +1148,16 @@ function HlTradeTable({ function GainsTradeTable({ trades, venueName, + otherVenueName, }: { trades: GainsWalletData["recentTrades"]; venueName: string; + otherVenueName?: string; }) { const [showAll, setShowAll] = useState(false); const PREVIEW = 10; const rows = showAll ? trades : trades.slice(0, PREVIEW); + const hasEquiv = !!otherVenueName && trades.some((t) => t.equivFee !== undefined); if (trades.length === 0) return null; @@ -1159,7 +1175,9 @@ function GainsTradeTable({

-

{venueName} trade history

+

+ {hasEquiv ? `${venueName} vs ${otherVenueName} — per trade` : `${venueName} trade history`} +

{trades.length} actions

@@ -1171,15 +1189,20 @@ function GainsTradeTable({ Market Action Notional - Net cost - PnL + {venueName} fee + {hasEquiv && ( + {otherVenueName} fee + )} + {!hasEquiv && ( + PnL + )} {rows.map((t, i) => { - const carry = t.fundingFee + t.borrowingFee; - const netCost = t.tradingFee + carry; - const hasCarry = Math.abs(t.fundingFee) > 0.001 || t.borrowingFee > 0.001; + const hasVault = (t.vaultFee ?? 0) > 0.001; + const netCost = t.tradingFee + (t.vaultFee ?? 0) + t.fundingFee + t.borrowingFee; + const diff = hasEquiv && t.equivFee !== undefined ? t.equivFee - netCost : undefined; return ( @@ -1198,29 +1221,40 @@ function GainsTradeTable({ {fmtUsd(t.notional)}

{fmtUsd(netCost)}

- {hasCarry && ( + {hasVault && (

- {fmtUsd(t.tradingFee)} fee - {t.borrowingFee > 0.001 ? ` +${fmtUsd(t.borrowingFee)} borrow` : ""} - {Math.abs(t.fundingFee) > 0.001 - ? ` ${t.fundingFee > 0 ? "+" : "−"}${fmtUsd(Math.abs(t.fundingFee))} fund` - : ""} + {fmtUsd(t.tradingFee)} taker + {` +${fmtUsd(t.vaultFee)} vault`}

)} - - {t.action.includes("Closed") ? ( - t.pnl_net > 0.01 ? ( - +{fmtUsd(t.pnl_net)} - ) : t.pnl_net < -0.01 ? ( - {fmtUsd(t.pnl_net)} + {hasEquiv && t.equivFee !== undefined && ( + netCost ? "text-red-400" : "text-ink-faint" + }`}> + {fmtUsd(t.equivFee)} + {diff !== undefined && Math.abs(diff) > 0.001 && ( +

0 ? "text-emerald-500" : "text-red-400"}`}> + {diff > 0 ? `+${fmtUsd(diff)}` : fmtUsd(diff)} +

+ )} + + )} + {!hasEquiv && ( + + {t.action.includes("Closed") ? ( + t.pnl_net > 0.01 ? ( + +{fmtUsd(t.pnl_net)} + ) : t.pnl_net < -0.01 ? ( + {fmtUsd(t.pnl_net)} + ) : ( + $0 + ) ) : ( - $0 - ) - ) : ( - open - )} - + open + )} + + )} ); })} @@ -1426,10 +1460,10 @@ function Results({ result }: { result: FeeCompareResult }) { /> )} {gainsVenueA && gainsVenueA.recentTrades.length > 0 && ( - + )} {gainsVenueB && gainsVenueB.recentTrades.length > 0 && ( - + )} {gmxVenueA && gmxVenueA.recentTrades.length > 0 && ( @@ -1530,8 +1564,8 @@ export function FeeCompareClient({ const data = (await res.json()) as FeeCompareResult; setResult(data); if (trimmed) { - const newPath = `/fee-compare/${va}/${vb}/${trimmed}`; - window.history.pushState({}, "", newPath); + const qs = new URLSearchParams({ venueA: va, venueB: vb, wallet: trimmed, days: String(overrideDays ?? days) }); + window.history.pushState({}, "", `/fee-compare?${qs}`); } } catch { setError("Network error — check your connection."); diff --git a/src/data/provider-registry.ts b/src/data/provider-registry.ts index 169cffc4..89121719 100644 --- a/src/data/provider-registry.ts +++ b/src/data/provider-registry.ts @@ -2591,6 +2591,105 @@ export const PROVIDER_REGISTRY: Record = { "Acala official public RPC node 2 (acala-rpc-2.aca-api.network). Keyless Substrate JSON-RPC interface for the Acala DeFi parachain on Polkadot.", twitter: "@AcalaNetwork", }, + + // ─── Chihuahua providers (bench 250) ───────────────────────────────── + "chihuahua-official": { + url: "https://rpc.chihuahua.wtf", + description: + "Chihuahua official public Tendermint RPC node. Keyless endpoint for the Chihuahua Cosmos SDK chain.", + twitter: "@ChihuahuaChain", + }, + validatus: { + url: "https://github.com/validatus", + description: + "Validatus public Cosmos RPC infrastructure. Provides keyless Tendermint RPC endpoints for multiple Cosmos SDK chains.", + }, + + // ─── Cosmos Directory (shared across benches 251-252) ──────────────── + "cosmos-directory": { + url: "https://cosmos.directory", + description: + "Cosmos Directory public RPC proxy. Aggregates Tendermint RPC endpoints across the Cosmos ecosystem, no API key required.", + }, + + // ─── Fetch.ai providers (bench 252) ────────────────────────────────── + "fetchai-official": { + url: "https://rpc-fetchhub.fetch.ai", + description: + "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", + }, + + // ─── Shentu providers (bench 254) ──────────────────────────────────── + "shentu-official": { + url: "https://www.shentu.technology", + description: + "Shentu Chain official public Tendermint RPC node for the shentu-2.2 mainnet. Keyless endpoint maintained by the CertiK / Shentu Foundation team.", + twitter: "@ShentuChain", + }, + + // ─── MANTRA Chain providers (bench 255) ────────────────────────────── + "mantrachain-official": { + url: "https://www.mantrachain.io", + description: + "MANTRA Chain official public Tendermint RPC node for the mantra-1 mainnet. Keyless endpoint for real-world asset tokenization on Cosmos.", + twitter: "@MANTRA_Chain", + }, + itrocket: { + url: "https://itrocket.net", + description: + "ITRocket community validator and public RPC operator. Provides keyless Tendermint RPC endpoints for multiple Cosmos SDK chains.", + twitter: "@ITRocketTeam", + }, + + + // ─── Band Protocol providers (bench 256) ──────────────────────────── + "band-official": { + url: "https://www.bandprotocol.com", + description: + "Band Protocol official public Tendermint RPC node for the laozi-mainnet. Keyless endpoint maintained by the Band Protocol team.", + twitter: "@BandProtocol", + }, + stakewolle: { + url: "https://stakewolle.com", + description: + "Stakewolle community validator and public RPC provider. Runs keyless Tendermint RPC endpoints for multiple Cosmos SDK chains.", + twitter: "@stakewolle", + }, + + // ─── cheqd providers (bench 257) ───────────────────────────────────── + "cheqd-official": { + url: "https://cheqd.io", + description: + "cheqd official public Tendermint RPC node for cheqd-mainnet-1. Keyless endpoint maintained by the cheqd Network team.", + twitter: "@cheqd_io", + }, + nodestake: { + url: "https://nodestake.org", + description: + "NodeStake community validator and public RPC operator. Provides keyless Tendermint RPC endpoints for multiple Cosmos SDK chains.", + twitter: "@NodeStake", + }, + + // ─── 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 83d02a58..c1c41817 100644 --- a/src/lib/brand.ts +++ b/src/lib/brand.ts @@ -176,6 +176,14 @@ const BRANDS: Record = { // ─── Cosmos SDK chains (bench 247) ─── babylon: { color: "#F8811A" }, // babylon orange (official brand) + // ─── Band Protocol + cheqd (benches 256-257) ─── + bandchain: { color: "#516AFF" }, // band protocol indigo (official brand) + cheqd: { color: "#00B59C" }, // cheqd teal (official brand) + "band-official": { color: "#516AFF" }, // band official inherits band indigo + "cheqd-official": { color: "#00B59C" }, // cheqd official inherits cheqd teal + stakewolle: { color: "#F97316" }, // stakewolle orange + nodestake: { color: "#8B5CF6" }, // nodestake violet + // ─── 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 0c20e4c4..e893db5a 100644 --- a/src/lib/logo-manifest.ts +++ b/src/lib/logo-manifest.ts @@ -328,6 +328,21 @@ const RAW: Record = { acala: "/logos/acala.svg", interlay: "/logos/interlay.svg", litecoinspace: "/logos/litecoinspace.svg", + chihuahua: "/logos/chihuahua.svg", + sentinel: "/logos/sentinel.svg", + fetchhub: "/logos/fetchai.svg", + union: "/logos/union.svg", + shentu: "/logos/shentu.svg", + mantrachain: "/logos/mantrachain.svg", + "nodes-guru": "/logos/nodes-guru.svg", + stakeandrelax: "/logos/stakeandrelax.svg", + highstakes: "/logos/highstakes.svg", + itrocket: "/logos/itrocket.svg", + "cosmos-directory": "/logos/cosmos-directory.svg", + bandchain: "/logos/bandchain.svg", + cheqd: "/logos/cheqd.svg", + stakewolle: "/logos/stakewolle.svg", + nodestake: "/logos/nodestake.svg", // ─── Oracle deviation (bench 025) — additional brand logos ─── // (pairs alias to chain/asset logos in the ALIASES block below) @@ -736,6 +751,14 @@ const ALIASES: Record = { "acala-rpc0": "acala", "acala-rpc2": "acala", + // Chihuahua + Fetch.ai official node aliases → chain logo + "chihuahua-official": "chihuahua", + "fetchai-official": "fetchhub", + "shentu-official": "shentu", + "mantrachain-official": "mantrachain", + "band-official": "bandchain", + "cheqd-official": "cheqd", + // Non-EVM wave-3 (benches 222-231) — provider-official aliases to chain slug "ecadinfra": "tezos", "tzbeta": "tezos",