From d689fb442569fc07883ac9c559e12e279c68cbef Mon Sep 17 00:00:00 2001 From: Florent Tapponnier Date: Sun, 28 Jun 2026 12:27:15 +0200 Subject: [PATCH 1/4] fix(hl-frontends): don't linkify raw hex builder slugs (was 404) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The HL frontends bench leaderboard renders one row per builder. When a builder address isn't yet in /opt/hl-bench/builders.json, the row slug stays as a truncated 8-char hex prefix (e.g. 0x557edb25). The ledger-table component unconditionally wraps every row name in a , but /products/ is blacklisted in providers.ts (HEX_ADDRESS_SLUG regex), so the link 404s. Now hex slugs render as plain text — same path as region slugs — until the builder gets identified and added to builders.json, at which point the slug becomes a real name and the link reappears. --- src/lib/providers.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/lib/providers.ts b/src/lib/providers.ts index 1e1b3084..0629eed8 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); From 5b235e3fb5130eff6479952f5f56ec35e9a82d53 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier Date: Sun, 28 Jun 2026 12:27:41 +0200 Subject: [PATCH 2/4] fix(hl-frontends): apply hex-skip in ledger-table renderer --- src/components/ledger-table.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ledger-table.tsx b/src/components/ledger-table.tsx index a5ea3dec..024ed8d9 100644 --- a/src/components/ledger-table.tsx +++ b/src/components/ledger-table.tsx @@ -19,6 +19,7 @@ import { fmtUnit } from "@/lib/format"; import { buildProviderColors } from "@/lib/series-colors"; import { isRegion } from "@/lib/brand"; import { isAll } from "@/lib/dimensions"; +import { isHexAddressSlug } from "@/lib/providers"; type Props = { benchmark: Benchmark; From 532d979fdac510eec5245f7e3c909225ea5ed8c1 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier Date: Sun, 28 Jun 2026 12:28:10 +0200 Subject: [PATCH 3/4] fix(ledger-table): skip /products link for hex builder slugs --- src/components/ledger-table.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/ledger-table.tsx b/src/components/ledger-table.tsx index 024ed8d9..11a2b332 100644 --- a/src/components/ledger-table.tsx +++ b/src/components/ledger-table.tsx @@ -405,7 +405,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. Date: Sun, 28 Jun 2026 12:34:13 +0200 Subject: [PATCH 4/4] fix(ledger-table): inline hex slug check (client/server boundary) providers.ts is server-only (unstable_cache + bench loaders); importing isHexAddressSlug from it into this 'use client' component breaks Turbopack build. Inline the regex check instead, same pattern as the existing isRegion/isAll inline checks. --- src/components/ledger-table.tsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/components/ledger-table.tsx b/src/components/ledger-table.tsx index 11a2b332..87799374 100644 --- a/src/components/ledger-table.tsx +++ b/src/components/ledger-table.tsx @@ -19,7 +19,17 @@ import { fmtUnit } from "@/lib/format"; import { buildProviderColors } from "@/lib/series-colors"; import { isRegion } from "@/lib/brand"; import { isAll } from "@/lib/dimensions"; -import { isHexAddressSlug } from "@/lib/providers"; + +// 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()); +} type Props = { benchmark: Benchmark;