diff --git a/benchmarks/hyperliquid-frontends.yml b/benchmarks/hyperliquid-frontends.yml index 5e4f507c8..907f1b3b7 100644 --- a/benchmarks/hyperliquid-frontends.yml +++ b/benchmarks/hyperliquid-frontends.yml @@ -1504,6 +1504,19 @@ providers: success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 7200)) sample_size: hl_frontend_fills_total_24h_v2{builder="perpex"} series: hl_frontend_fees_usd_24h_v2{builder="perpex"} + + - slug: afterbell + name: Afterbell + tag: Hyperliquid builder code, USD revenue on the last complete UTC day + formula: "USD builder fees collected on the last complete UTC day, summed across every attributed fill in the daily feed file for Afterbell's builder address." + queries: + p50: hl_frontend_fees_usd_24h_v2{builder="afterbell"} + p90: hl_frontend_volume_usd_24h_v2{builder="afterbell"} + p99: hl_frontend_fees_per_user_usd_v2{builder="afterbell"} + mean: avg_over_time(hl_frontend_fees_usd_24h_v2{builder="afterbell"}[7d]) + success: (hl_frontend_local_last_tick_unix_v2 > bool (time() - 7200)) + sample_size: hl_frontend_fills_total_24h_v2{builder="afterbell"} + series: hl_frontend_fees_usd_24h_v2{builder="afterbell"} metric_panels: - id: volume label: Volume routed diff --git a/harnesses/hyperliquid-frontends/builders.json b/harnesses/hyperliquid-frontends/builders.json index 10e1ea212..4722bdb48 100644 --- a/harnesses/hyperliquid-frontends/builders.json +++ b/harnesses/hyperliquid-frontends/builders.json @@ -744,5 +744,12 @@ "address": "0x495a2c91b4173d979150ba108e2d80ce0145a7de", "valid_from": "2026-03-14", "notes": "Perpex (perpex.co, by Celebit Ltd), a Hyperliquid trading front-end on web, iOS and Android. Builder address and fee from the operator: 0.10% of eligible filled notional, including copied orders, published at perpex.co/fees. valid_from is the first day the public fills bucket returns a file, checked day by day from 2025-01-01 on 2026-10-23: 139 days have one, the earliest 2026-03-14. Hyperliquid's referral info for the address reports about $788 of builderRewards." + }, + { + "slug": "afterbell", + "name": "Afterbell", + "address": "0xda5584eb1dff6ee2ae383b077b4dca9c0df1d4f6", + "valid_from": "2026-11-04", + "notes": "Afterbell (afterbell.pro), a Hyperliquid trading front-end for stock, index and commodity perps (HIP-3) and crypto perps, each stock perp read against its home exchange's session. Builder address and fee from the operator; the live site bundle carries the same address and Hyperliquid's referral info gives it the code AFTERBELL. Fee published at afterbell.pro/fees: 0.03% standard; 0.015%, 0.01% and 0.008% from $10M, $50M and $250M of 30-day volume; 0.005% for a wallet's first 30 days; 0.04% on copied fills; 0.001% on every order until 2026-12-31. valid_from is the first day the public fills bucket returns a file, checked day by day from 2026-10-01 on 2026-11-08: 3 days have one, the earliest 2026-11-04, for 10 fills, $849 of notional and $0.011 of builder fees in total, all from one wallet, the builder address itself. Its first builder fill was 2026-11-03 at 20:16 UTC, after that day's export cutoff." } ] diff --git a/public/logos/afterbell.png b/public/logos/afterbell.png new file mode 100644 index 000000000..77396c649 Binary files /dev/null and b/public/logos/afterbell.png differ diff --git a/src/data/provider-registry.ts b/src/data/provider-registry.ts index 223dd6eaf..bfd6838d2 100644 --- a/src/data/provider-registry.ts +++ b/src/data/provider-registry.ts @@ -2255,6 +2255,12 @@ export const PROVIDER_REGISTRY: Record = { description: "Perpex is a third-party Hyperliquid trading front-end by Celebit Ltd on web, iOS and Android, covering perps, spot, HIP-3 and HIP-4 outcome markets and copy trading of public wallets, with a 0.10% builder fee on eligible fills.", }, + afterbell: { + url: "https://afterbell.pro", + description: + "Afterbell is a Hyperliquid trading front-end for stock, index and commodity perps (HIP-3) and crypto perps that reads each stock perp against its home exchange's session; its orders carry a registered builder code (Hyperliquid referral code AFTERBELL) at 0.03% standard, lower by 30-day volume.", + twitter: "@Afterbell_pro", + }, // ─── Perp funding venues (bench № 036) ───────────────────────────── bybit: { diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts index f5336a502..a80588dc2 100644 --- a/src/lib/logo-manifest.ts +++ b/src/lib/logo-manifest.ts @@ -636,6 +636,7 @@ const RAW: Record = { "binance-us": "/logos/binance-us.svg", cryptocom: "/logos/cryptocom.svg", // ─── Hyperliquid frontends (bench № 030) ─── + afterbell: "/logos/afterbell.png", "nova-markets": "/logos/nova-markets.jpeg", "phantom-perps": "/logos/phantom-perps.svg", // ─── Terminal fill quality (bench № 268): the wallets' in-app swap ─── diff --git a/src/lib/providers.ts b/src/lib/providers.ts index 013158e10..751a10d29 100644 --- a/src/lib/providers.ts +++ b/src/lib/providers.ts @@ -949,7 +949,9 @@ const buildProvidersCached = unstable_cache( // that appearance. Lockstep with bench-unfiltered-v115. // v32: BlockVectra gains two appearances, ethereum-rpc and arbitrum-rpc. // Lockstep with bench-unfiltered-v116. - ["providers-v32"], + // v33: Afterbell gains its first appearance, bench 030. + // Lockstep with bench-unfiltered-v117. + ["providers-v33"], // 900 s: the provider index feeds products / compare / answers, whose // numbers move slowly, and this revalidate is also the effective ISR // period of those ~500 pages (Next takes the min across a route's caches). diff --git a/src/lib/spec-provider-set.test.ts b/src/lib/spec-provider-set.test.ts index 768ec21f2..3a34b9f56 100644 --- a/src/lib/spec-provider-set.test.ts +++ b/src/lib/spec-provider-set.test.ts @@ -115,6 +115,6 @@ describe("the provider set behind the cache keys", () => { "Then set EXPECTED to the hash in this failure, and add the provider", `to PRODUCT_NAMES if it needs a display name. Providers now: ${count}.`, ].join("\n"), - ).toBe("c96bf5534dd9dc77"); + ).toBe("7e83b3a6fb29832f"); }); }); diff --git a/src/lib/spec.ts b/src/lib/spec.ts index a9901b765..f5229436a 100644 --- a/src/lib/spec.ts +++ b/src/lib/spec.ts @@ -601,7 +601,11 @@ const loadBenchmarkUnfilteredCached = unstable_cache( // arbitrum-rpc (issue #3573), one more public row on each. Cached // entries hold the old provider set. Moves with all-benchmarks-v109, // bench-filters-v55 and providers-v32. - ["bench-unfiltered-v116", process.env.VERCEL_ENV === "production" ? "prod" : "all"], + // v117: Afterbell joins bench 030 as a builder row (#3578). Cached + // entries hold the old provider set. Moves with all-benchmarks-v110 + // and providers-v33; bench 030 declares no dimensions, so + // bench-filters stays. + ["bench-unfiltered-v117", process.env.VERCEL_ENV === "production" ? "prod" : "all"], { revalidate: 300, tags: ["benchmarks"] }, ); @@ -879,7 +883,8 @@ const loadAllBenchmarksCached = unstable_cache( // retired 2026-11-06; a cached catalog would keep linking them). // v109: lockstep with bench-unfiltered-v116 (BlockVectra on Ethereum and // Arbitrum). - ["all-benchmarks-v109", process.env.VERCEL_ENV === "production" ? "prod" : "all"], + // v110: lockstep with bench-unfiltered-v117 (Afterbell on bench 030). + ["all-benchmarks-v110", process.env.VERCEL_ENV === "production" ? "prod" : "all"], { revalidate: 300, tags: ["benchmarks"] }, ); export const loadAllBenchmarks = cache(loadAllBenchmarksCached);