diff --git a/benchmarks/hyperliquid-frontends.yml b/benchmarks/hyperliquid-frontends.yml index 063ce78d..04c649cb 100644 --- a/benchmarks/hyperliquid-frontends.yml +++ b/benchmarks/hyperliquid-frontends.yml @@ -916,19 +916,6 @@ providers: sample_size: hl_frontend_fills_total_24h_v2{builder="0x7cc0fd2b"} series: hl_frontend_fees_usd_24h_v2{builder="0x7cc0fd2b"} - - slug: "0x557edb25" - name: "0x557e…3c81" - tag: Unidentified builder address, rename pending identification - formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for this not yet identified builder address." - queries: - p50: hl_frontend_fees_usd_24h_v2{builder="0x557edb25"} - p90: hl_frontend_volume_usd_24h_v2{builder="0x557edb25"} - p99: hl_frontend_fees_per_user_usd_v2{builder="0x557edb25"} - mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="0x557edb25"}[7d]) - success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) - sample_size: hl_frontend_fills_total_24h_v2{builder="0x557edb25"} - series: hl_frontend_fees_usd_24h_v2{builder="0x557edb25"} - - slug: "0x446fbc72" name: "0x446f…d6c6" tag: Unidentified builder address, rename pending identification @@ -968,19 +955,6 @@ providers: sample_size: hl_frontend_fills_total_24h_v2{builder="0xb290f2f3"} series: hl_frontend_fees_usd_24h_v2{builder="0xb290f2f3"} - - slug: "0xa1fcd6e2" - name: "0xa1fc…bf4d" - tag: Unidentified builder address, rename pending identification - formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for this not yet identified builder address." - queries: - p50: hl_frontend_fees_usd_24h_v2{builder="0xa1fcd6e2"} - p90: hl_frontend_volume_usd_24h_v2{builder="0xa1fcd6e2"} - p99: hl_frontend_fees_per_user_usd_v2{builder="0xa1fcd6e2"} - mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="0xa1fcd6e2"}[7d]) - success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) - sample_size: hl_frontend_fills_total_24h_v2{builder="0xa1fcd6e2"} - series: hl_frontend_fees_usd_24h_v2{builder="0xa1fcd6e2"} - - slug: "0x53a19541" name: "0x53a1…fcd1" tag: Unidentified builder address, rename pending identification @@ -1007,32 +981,6 @@ providers: sample_size: hl_frontend_fills_total_24h_v2{builder="0xdbc27ea7"} series: hl_frontend_fees_usd_24h_v2{builder="0xdbc27ea7"} - - slug: "0xea2c82b5" - name: "0xea2c…75b3" - tag: Unidentified builder address, rename pending identification - formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for this not yet identified builder address." - queries: - p50: hl_frontend_fees_usd_24h_v2{builder="0xea2c82b5"} - p90: hl_frontend_volume_usd_24h_v2{builder="0xea2c82b5"} - p99: hl_frontend_fees_per_user_usd_v2{builder="0xea2c82b5"} - mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="0xea2c82b5"}[7d]) - success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) - sample_size: hl_frontend_fills_total_24h_v2{builder="0xea2c82b5"} - series: hl_frontend_fees_usd_24h_v2{builder="0xea2c82b5"} - - - slug: "0x49791d46" - name: "0x4979…37b8" - tag: Unidentified builder address, rename pending identification - formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for this not yet identified builder address." - queries: - p50: hl_frontend_fees_usd_24h_v2{builder="0x49791d46"} - p90: hl_frontend_volume_usd_24h_v2{builder="0x49791d46"} - p99: hl_frontend_fees_per_user_usd_v2{builder="0x49791d46"} - mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="0x49791d46"}[7d]) - success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) - sample_size: hl_frontend_fills_total_24h_v2{builder="0x49791d46"} - series: hl_frontend_fees_usd_24h_v2{builder="0x49791d46"} - - slug: "0x9f83fe01" name: "0x9f83…31d9" tag: Unidentified builder address, rename pending identification @@ -1072,32 +1020,6 @@ providers: sample_size: hl_frontend_fills_total_24h_v2{builder="0xc95d92dc"} series: hl_frontend_fees_usd_24h_v2{builder="0xc95d92dc"} - - slug: "0xdf39721d" - name: "0xdf39…4750" - tag: Unidentified builder address, rename pending identification - formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for this not yet identified builder address." - queries: - p50: hl_frontend_fees_usd_24h_v2{builder="0xdf39721d"} - p90: hl_frontend_volume_usd_24h_v2{builder="0xdf39721d"} - p99: hl_frontend_fees_per_user_usd_v2{builder="0xdf39721d"} - mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="0xdf39721d"}[7d]) - success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) - sample_size: hl_frontend_fills_total_24h_v2{builder="0xdf39721d"} - series: hl_frontend_fees_usd_24h_v2{builder="0xdf39721d"} - - - slug: "0x40e9d9fe" - name: "0x40e9…5260" - tag: Unidentified builder address, rename pending identification - formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for this not yet identified builder address." - queries: - p50: hl_frontend_fees_usd_24h_v2{builder="0x40e9d9fe"} - p90: hl_frontend_volume_usd_24h_v2{builder="0x40e9d9fe"} - p99: hl_frontend_fees_per_user_usd_v2{builder="0x40e9d9fe"} - mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="0x40e9d9fe"}[7d]) - success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) - sample_size: hl_frontend_fills_total_24h_v2{builder="0x40e9d9fe"} - series: hl_frontend_fees_usd_24h_v2{builder="0x40e9d9fe"} - # All five metrics come from the local hl-node harness and update at the # same sub-minute cadence as the main headline. @@ -1478,6 +1400,85 @@ providers: sample_size: hl_frontend_fills_total_24h_v2{builder="nansen"} series: hl_frontend_fees_usd_24h_v2{builder="nansen"} + # ─── Identified 2026-06-28 via on-chain HL referral code cross-reference ─── + - slug: invo + name: Invo + tag: Hyperliquid builder code, USD revenue captured over rolling 24h window + formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for Invo's builder address." + queries: + p50: hl_frontend_fees_usd_24h_v2{builder="invo"} + p90: hl_frontend_volume_usd_24h_v2{builder="invo"} + p99: hl_frontend_fees_per_user_usd_v2{builder="invo"} + mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="invo"}[7d]) + success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) + sample_size: hl_frontend_fills_total_24h_v2{builder="invo"} + series: hl_frontend_fees_usd_24h_v2{builder="invo"} + + - slug: bitget-wallet + name: Bitget Wallet + tag: Hyperliquid builder code, USD revenue captured over rolling 24h window + formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for Bitget Wallet's builder address." + queries: + p50: hl_frontend_fees_usd_24h_v2{builder="bitget-wallet"} + p90: hl_frontend_volume_usd_24h_v2{builder="bitget-wallet"} + p99: hl_frontend_fees_per_user_usd_v2{builder="bitget-wallet"} + mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="bitget-wallet"}[7d]) + success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) + sample_size: hl_frontend_fills_total_24h_v2{builder="bitget-wallet"} + series: hl_frontend_fees_usd_24h_v2{builder="bitget-wallet"} + + - slug: defi-saver + name: DeFi Saver + tag: Hyperliquid builder code, USD revenue captured over rolling 24h window + formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for DeFi Saver's builder address." + queries: + p50: hl_frontend_fees_usd_24h_v2{builder="defi-saver"} + p90: hl_frontend_volume_usd_24h_v2{builder="defi-saver"} + p99: hl_frontend_fees_per_user_usd_v2{builder="defi-saver"} + mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="defi-saver"}[7d]) + success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) + sample_size: hl_frontend_fills_total_24h_v2{builder="defi-saver"} + series: hl_frontend_fees_usd_24h_v2{builder="defi-saver"} + + - slug: marsgo + name: MarsGO + tag: Hyperliquid builder code, USD revenue captured over rolling 24h window + formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for MarsGO's builder address." + queries: + p50: hl_frontend_fees_usd_24h_v2{builder="marsgo"} + p90: hl_frontend_volume_usd_24h_v2{builder="marsgo"} + p99: hl_frontend_fees_per_user_usd_v2{builder="marsgo"} + mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="marsgo"}[7d]) + success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) + sample_size: hl_frontend_fills_total_24h_v2{builder="marsgo"} + series: hl_frontend_fees_usd_24h_v2{builder="marsgo"} + + - slug: unitywallet + name: UnityWallet + tag: Hyperliquid builder code, USD revenue captured over rolling 24h window + formula: "USD builder fees collected over the rolling 24h window, summed across every attributed fill on the local hl-node stream for UnityWallet's builder address." + queries: + p50: hl_frontend_fees_usd_24h_v2{builder="unitywallet"} + p90: hl_frontend_volume_usd_24h_v2{builder="unitywallet"} + p99: hl_frontend_fees_per_user_usd_v2{builder="unitywallet"} + mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="unitywallet"}[7d]) + success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) + sample_size: hl_frontend_fills_total_24h_v2{builder="unitywallet"} + series: hl_frontend_fees_usd_24h_v2{builder="unitywallet"} + + - slug: metamask-alt + name: MetaMask (alt) + tag: Hyperliquid builder code, USD revenue captured over rolling 24h window + formula: "USD builder fees collected over the rolling 24h window via MetaMask's secondary on-chain HL builder address (0xea2c…75b3, documented alongside the primary 0xe95a…53aa)." + queries: + p50: hl_frontend_fees_usd_24h_v2{builder="metamask-alt"} + p90: hl_frontend_volume_usd_24h_v2{builder="metamask-alt"} + p99: hl_frontend_fees_per_user_usd_v2{builder="metamask-alt"} + mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="metamask-alt"}[7d]) + success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 120)) + sample_size: hl_frontend_fills_total_24h_v2{builder="metamask-alt"} + series: hl_frontend_fees_usd_24h_v2{builder="metamask-alt"} + metric_panels: - id: volume label: Volume routed diff --git a/public/logos/bitget-wallet.png b/public/logos/bitget-wallet.png new file mode 100644 index 00000000..7c38c02a Binary files /dev/null and b/public/logos/bitget-wallet.png differ diff --git a/public/logos/defi-saver.svg b/public/logos/defi-saver.svg new file mode 100644 index 00000000..61eb4ce2 --- /dev/null +++ b/public/logos/defi-saver.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/logos/invo.png b/public/logos/invo.png new file mode 100644 index 00000000..50747734 Binary files /dev/null and b/public/logos/invo.png differ diff --git a/public/logos/marsgo.jpg b/public/logos/marsgo.jpg new file mode 100644 index 00000000..2f5d90a2 Binary files /dev/null and b/public/logos/marsgo.jpg differ diff --git a/public/logos/unitywallet.png b/public/logos/unitywallet.png new file mode 100644 index 00000000..5ae67f8a Binary files /dev/null and b/public/logos/unitywallet.png differ diff --git a/src/components/ledger-table.tsx b/src/components/ledger-table.tsx index ddc5a91b..b840d59c 100644 --- a/src/components/ledger-table.tsx +++ b/src/components/ledger-table.tsx @@ -21,6 +21,17 @@ import { buildProviderColors } from "@/lib/series-colors"; import { isRegion } from "@/lib/brand"; import { isAll } from "@/lib/dimensions"; +// Hyperliquid frontends bench surfaces builder addresses that aren't +// yet in /opt/hl-bench/builders.json with a raw hex slug. Mirrors the +// HEX_ADDRESS_SLUG regex in src/lib/providers.ts (the /products route +// blacklist) — kept inline because providers.ts is server-only (it +// imports unstable_cache + the bench loaders) and pulling it into +// this client component breaks the build. +const HEX_ADDRESS_SLUG = /^0x[a-f0-9]+$/; +function isHexAddressSlug(slug: string): boolean { + return HEX_ADDRESS_SLUG.test(slug.toLowerCase()); +} + /** Sort keys exposed by the header click handlers. `null` (the default) * means "use the bench's natural sort" — pickValue + higherIsBetter — * which is what callers, OG renders, and share cards depend on. Any @@ -589,7 +600,13 @@ function Row({
- {isRegion(r.slug) ? ( + {isRegion(r.slug) || isHexAddressSlug(r.slug) ? ( + // Hex builder addresses (HL frontends not yet in + // builders.json) have no /products/ page — the + // route is blacklisted in providers.ts, so a link would + // 404. Render as plain text until the builder is added + // to the registry, at which point it gets a real slug + // and the link reappears automatically. = { twitter: "@Blink_Exchange", }, + // ─── Hyperliquid frontends registry expansion 60 → 65 (on-chain referral code cross-reference, 2026-06-28) ─── + // Identified by matching each builder address's HL referral code to a + // public brand. Provenance lives in /opt/hl-bench/builders.json notes + // on the HL node. + "defi-saver": { + url: "https://defisaver.com", + description: + "DeFi Saver is a long-running DeFi management dashboard that added a Hyperliquid perps tab routing orders via a registered builder code (HL referral code DFS).", + twitter: "@DeFiSaver", + }, + unitywallet: { + url: "https://unitywallet.com", + description: + "UnityWallet is a self-custodial wallet with an in-app Hyperliquid perps integration that routes orders through a registered builder code (HL referral code UNITYWALLET).", + twitter: "@unitywallet_", + }, + invo: { + url: "https://invoapp.com", + description: + "Invo is a Hyperliquid-powered social trading mobile app supporting 170+ perp pairs with copy-trading and a registered builder code (HL referral code INVO, 25k+ referrals).", + twitter: "@invoapp", + }, + marsgo: { + url: "https://t.me/marsgo_bot", + description: + "MarsGO is a Telegram mini-app for crypto trading that routes Hyperliquid perp orders through a registered builder code (HL referral code MARSGO).", + twitter: "@MarsGOBot", + }, + "bitget-wallet": { + url: "https://web3.bitget.com", + description: + "Bitget Wallet is the self-custodial wallet by Bitget; its Hyperliquid perps integration launched Dec 2025 and routes orders through a registered builder code (HL referral code BITGETWALLET, 3.6k+ referrals).", + twitter: "@BitgetWallet", + }, + // ─── Perp funding venues (bench № 036) ───────────────────────────── bybit: { url: "https://www.bybit.com", diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts index 1f383257..631d4b51 100644 --- a/src/lib/logo-manifest.ts +++ b/src/lib/logo-manifest.ts @@ -279,6 +279,16 @@ const RAW: Record = { flowbot: "/logos/flowbot.jpg", "nautilus-trader": "/logos/nautilus-trader.png", blink: "/logos/blink.png", + + // ─── Hyperliquid frontends registry expansion (60 → 66, 2026-06-28) ─── + // Identified via on-chain HL referral codes + brand cross-reference + // (DFS, UNITYWALLET, INVO, MARSGO, BITGETWALLET). See builders.json + // notes on the HL node for the provenance trail per address. + "defi-saver": "/logos/defi-saver.svg", + unitywallet: "/logos/unitywallet.png", + invo: "/logos/invo.png", + marsgo: "/logos/marsgo.jpg", + "bitget-wallet": "/logos/bitget-wallet.png", }; // Asset-symbol aliases used by perp-fees as chain dimension values. @@ -292,6 +302,8 @@ const ALIASES: Record = { bsc: "bnb", hypercore: "hyperliquid", // HyperCore is the Hyperliquid trading engine, same brand "publicnode-feehistory": "publicnode", + // Same brand split across two HL builder addresses; one logo is enough. + "metamask-alt": "metamask", // Oracle-deviation bench exposes one provider per trading pair (e.g. // `btc-usd`). The page describes the underlying asset, so alias each diff --git a/src/lib/providers.ts b/src/lib/providers.ts index 1e1b3084..a908d794 100644 --- a/src/lib/providers.ts +++ b/src/lib/providers.ts @@ -428,6 +428,15 @@ export const DEAD_COMPOSITE_SLUGS = new Set([ // suppressed. const HEX_ADDRESS_SLUG = /^0x[a-f0-9]+$/; +/** True when the slug looks like a raw hex builder address (e.g. an + * unidentified Hyperliquid frontend that hasn't been added to + * builders.json yet). The /products/ route is blacklisted so + * these would 404 if linked. Used by ledger-table.tsx to render the + * row name as plain text instead of an anchor. */ +export function isHexAddressSlug(slug: string): boolean { + return HEX_ADDRESS_SLUG.test(slug.toLowerCase()); +} + function isBlacklistedSlug(slug: string): boolean { const lc = slug.toLowerCase(); return DEAD_COMPOSITE_SLUGS.has(lc) || HEX_ADDRESS_SLUG.test(lc); @@ -469,7 +478,11 @@ const buildProvidersCached = unstable_cache( // serving the v3 list (containing 0x... slugs) until the `benchmarks` // tag fires, leaving thin /products/ URLs in the sitemap for the // next 60s window after deploy. - ["providers-v4"], + // v5: bumped to flush the stale snapshot that didn't include the 6 + // newly identified HL frontends (invo, bitget-wallet, defi-saver, + // unitywallet, marsgo, metamask-alt). Without the bump, /products/ + // 404s for them even after the YAML + builders.json updates landed. + ["providers-v5"], { revalidate: 60, tags: ["benchmarks"] }, ); diff --git a/src/lib/spec.ts b/src/lib/spec.ts index 1bd05c35..bda826c5 100644 --- a/src/lib/spec.ts +++ b/src/lib/spec.ts @@ -258,7 +258,9 @@ const loadBenchmarkUnfilteredCached = unstable_cache( // expectedN + dataConfidence aggregate (sample-health system). Cached // v13 entries lack these fields, so the sample-health badge would // not render on existing benches until the cache aged out. - ["bench-unfiltered-v15"], + // v16: bumped to flush stale HL frontends snapshot after adding 6 + // identified frontends in #772 (invo/bitget-wallet/etc.). + ["bench-unfiltered-v16"], { revalidate: 300, tags: ["benchmarks"] }, ); @@ -393,7 +395,9 @@ const loadAllBenchmarksCached = unstable_cache( // Without this, /api/citable + products + sitemap surfaces would // keep serving v17 benches without the new dataConfidence / // sampleHealth / expectedN fields. - ["all-benchmarks-v19"], + // v20: bumped with bench-unfiltered-v16 to flush the HL frontends + // snapshot that didn't include the 6 newly identified frontends. + ["all-benchmarks-v20"], { revalidate: 300, tags: ["benchmarks"] }, ); export const loadAllBenchmarks = cache(loadAllBenchmarksCached);