diff --git a/benchmarks/perp-pe-ratio.yml b/benchmarks/perp-pe-ratio.yml index 90fd9ffd..e8c76ab1 100644 --- a/benchmarks/perp-pe-ratio.yml +++ b/benchmarks/perp-pe-ratio.yml @@ -41,7 +41,7 @@ methodology: - "FDV source: CoinGecko /coins/markets fully_diluted_valuation (falls back to market_cap if FDV null). dYdX is priced on the dYdX Chain token (CoinGecko dydx-chain)." - "P/E = FDV / annual_revenue. Null if FDV or revenue unavailable." - "Protocols whose adapter publishes no revenue series (Aster, Avantis, Orderly) or reports zero (Drift perps) have no P/E; see bench 265 for their price to fees." - - "Poll cadence: harness fetches DeFiLlama + CoinGecko every 60 minutes. Prometheus scrapes :2112/metrics every 60s." + - "Poll cadence: harness fetches DeFiLlama + CoinGecko every 60 minutes. Prometheus scrapes :2112/metrics every 60s. The sample count per row is the number of scrapes in the 24h window, not a count of trades." findings: - "{{best_name}} has the lowest P/E at {{best_p50}}x; cheapest perp DEX token relative to protocol earnings." @@ -76,7 +76,7 @@ providers: p99: perp_protocol_pe_ratio{protocol="hyperliquid"} mean: perp_protocol_pe_ratio{protocol="hyperliquid"} success: perp_protocol_health{protocol="hyperliquid"} - sample_size: perp_protocol_pe_ratio{protocol="hyperliquid"} + sample_size: count_over_time(perp_protocol_health{protocol="hyperliquid"}[24h]) series: perp_protocol_pe_ratio{protocol="hyperliquid"} - slug: gmx @@ -89,7 +89,7 @@ providers: p99: perp_protocol_pe_ratio{protocol="gmx"} mean: perp_protocol_pe_ratio{protocol="gmx"} success: perp_protocol_health{protocol="gmx"} - sample_size: perp_protocol_pe_ratio{protocol="gmx"} + sample_size: count_over_time(perp_protocol_health{protocol="gmx"}[24h]) series: perp_protocol_pe_ratio{protocol="gmx"} - slug: gains @@ -102,7 +102,7 @@ providers: p99: perp_protocol_pe_ratio{protocol="gains"} mean: perp_protocol_pe_ratio{protocol="gains"} success: perp_protocol_health{protocol="gains"} - sample_size: perp_protocol_pe_ratio{protocol="gains"} + sample_size: count_over_time(perp_protocol_health{protocol="gains"}[24h]) series: perp_protocol_pe_ratio{protocol="gains"} - slug: dydx @@ -115,7 +115,7 @@ providers: p99: perp_protocol_pe_ratio{protocol="dydx"} mean: perp_protocol_pe_ratio{protocol="dydx"} success: perp_protocol_health{protocol="dydx"} - sample_size: perp_protocol_pe_ratio{protocol="dydx"} + sample_size: count_over_time(perp_protocol_health{protocol="dydx"}[24h]) series: perp_protocol_pe_ratio{protocol="dydx"} - slug: drift @@ -128,7 +128,7 @@ providers: p99: perp_protocol_pe_ratio{protocol="drift"} mean: perp_protocol_pe_ratio{protocol="drift"} success: perp_protocol_health{protocol="drift"} - sample_size: perp_protocol_pe_ratio{protocol="drift"} + sample_size: count_over_time(perp_protocol_health{protocol="drift"}[24h]) series: perp_protocol_pe_ratio{protocol="drift"} - slug: lighter @@ -141,7 +141,7 @@ providers: p99: perp_protocol_pe_ratio{protocol="lighter"} mean: perp_protocol_pe_ratio{protocol="lighter"} success: perp_protocol_health{protocol="lighter"} - sample_size: perp_protocol_pe_ratio{protocol="lighter"} + sample_size: count_over_time(perp_protocol_health{protocol="lighter"}[24h]) series: perp_protocol_pe_ratio{protocol="lighter"} - slug: jupiter @@ -154,7 +154,7 @@ providers: p99: perp_protocol_pe_ratio{protocol="jupiter"} mean: perp_protocol_pe_ratio{protocol="jupiter"} success: perp_protocol_health{protocol="jupiter"} - sample_size: perp_protocol_pe_ratio{protocol="jupiter"} + sample_size: count_over_time(perp_protocol_health{protocol="jupiter"}[24h]) series: perp_protocol_pe_ratio{protocol="jupiter"} - slug: apex @@ -167,7 +167,7 @@ providers: p99: perp_protocol_pe_ratio{protocol="apex"} mean: perp_protocol_pe_ratio{protocol="apex"} success: perp_protocol_health{protocol="apex"} - sample_size: perp_protocol_pe_ratio{protocol="apex"} + sample_size: count_over_time(perp_protocol_health{protocol="apex"}[24h]) series: perp_protocol_pe_ratio{protocol="apex"} - slug: synfutures @@ -180,7 +180,7 @@ providers: p99: perp_protocol_pe_ratio{protocol="synfutures"} mean: perp_protocol_pe_ratio{protocol="synfutures"} success: perp_protocol_health{protocol="synfutures"} - sample_size: perp_protocol_pe_ratio{protocol="synfutures"} + sample_size: count_over_time(perp_protocol_health{protocol="synfutures"}[24h]) series: perp_protocol_pe_ratio{protocol="synfutures"} - slug: derive @@ -193,5 +193,5 @@ providers: p99: perp_protocol_pe_ratio{protocol="derive"} mean: perp_protocol_pe_ratio{protocol="derive"} success: perp_protocol_health{protocol="derive"} - sample_size: perp_protocol_pe_ratio{protocol="derive"} + sample_size: count_over_time(perp_protocol_health{protocol="derive"}[24h]) series: perp_protocol_pe_ratio{protocol="derive"} diff --git a/benchmarks/perp-pf-ratio.yml b/benchmarks/perp-pf-ratio.yml index 6276d48b..bd1682be 100644 --- a/benchmarks/perp-pf-ratio.yml +++ b/benchmarks/perp-pf-ratio.yml @@ -52,7 +52,7 @@ methodology: - "Drift's DeFiLlama perps adapter (drift-trade) currently reports zero fees; the row stays in the cohort with every ratio undefined until the source recovers." - "Pre-TGE venues (Ostium, Pacifica, Extended, Nado, Decibel) are declared `unranked` in the spec: they sit under the ranked field with their fees and open interest, are excluded from ranks, leader claims and the best / median / worst strip, and gain a ratio the day a token lists." - "edgeX (EDGE) and Paradex (DIME) have listed tokens and are ranked. DeFiLlama's fee adapter reports very low fees for Paradex, which inflates its multiple; treat that row with caution until the adapter is fixed upstream." - - "Poll cadence: DeFiLlama and CoinGecko every 60 minutes. Prometheus scrapes :2112/metrics every 60s." + - "Poll cadence: DeFiLlama and CoinGecko every 60 minutes. Prometheus scrapes :2112/metrics every 60s. The sample count per row is the number of scrapes in the 24h window (about 1,440), not a count of trades; p50, p90 and p99 read the same instant gauge, so they are equal by construction." findings: - "{{best_name}} is the cheapest perp DEX token at {{best_p50}} annualized fees." @@ -176,7 +176,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="hyperliquid"} mean: perp_protocol_pf_ratio{protocol="hyperliquid"} success: perp_protocol_health{protocol="hyperliquid"} - sample_size: perp_protocol_fees_30d_usd{protocol="hyperliquid"} + sample_size: count_over_time(perp_protocol_health{protocol="hyperliquid"}[24h]) series: perp_protocol_pf_ratio{protocol="hyperliquid"} - slug: aster @@ -189,7 +189,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="aster"} mean: perp_protocol_pf_ratio{protocol="aster"} success: perp_protocol_health{protocol="aster"} - sample_size: perp_protocol_fees_30d_usd{protocol="aster"} + sample_size: count_over_time(perp_protocol_health{protocol="aster"}[24h]) series: perp_protocol_pf_ratio{protocol="aster"} - slug: lighter @@ -202,7 +202,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="lighter"} mean: perp_protocol_pf_ratio{protocol="lighter"} success: perp_protocol_health{protocol="lighter"} - sample_size: perp_protocol_fees_30d_usd{protocol="lighter"} + sample_size: count_over_time(perp_protocol_health{protocol="lighter"}[24h]) series: perp_protocol_pf_ratio{protocol="lighter"} - slug: jupiter @@ -215,7 +215,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="jupiter"} mean: perp_protocol_pf_ratio{protocol="jupiter"} success: perp_protocol_health{protocol="jupiter"} - sample_size: perp_protocol_fees_30d_usd{protocol="jupiter"} + sample_size: count_over_time(perp_protocol_health{protocol="jupiter"}[24h]) series: perp_protocol_pf_ratio{protocol="jupiter"} - slug: gmx @@ -228,7 +228,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="gmx"} mean: perp_protocol_pf_ratio{protocol="gmx"} success: perp_protocol_health{protocol="gmx"} - sample_size: perp_protocol_fees_30d_usd{protocol="gmx"} + sample_size: count_over_time(perp_protocol_health{protocol="gmx"}[24h]) series: perp_protocol_pf_ratio{protocol="gmx"} - slug: gains @@ -241,7 +241,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="gains"} mean: perp_protocol_pf_ratio{protocol="gains"} success: perp_protocol_health{protocol="gains"} - sample_size: perp_protocol_fees_30d_usd{protocol="gains"} + sample_size: count_over_time(perp_protocol_health{protocol="gains"}[24h]) series: perp_protocol_pf_ratio{protocol="gains"} - slug: dydx @@ -254,7 +254,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="dydx"} mean: perp_protocol_pf_ratio{protocol="dydx"} success: perp_protocol_health{protocol="dydx"} - sample_size: perp_protocol_fees_30d_usd{protocol="dydx"} + sample_size: count_over_time(perp_protocol_health{protocol="dydx"}[24h]) series: perp_protocol_pf_ratio{protocol="dydx"} - slug: drift @@ -267,7 +267,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="drift"} mean: perp_protocol_pf_ratio{protocol="drift"} success: perp_protocol_health{protocol="drift"} - sample_size: perp_protocol_fees_30d_usd{protocol="drift"} + sample_size: count_over_time(perp_protocol_health{protocol="drift"}[24h]) series: perp_protocol_pf_ratio{protocol="drift"} - slug: avantis @@ -280,7 +280,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="avantis"} mean: perp_protocol_pf_ratio{protocol="avantis"} success: perp_protocol_health{protocol="avantis"} - sample_size: perp_protocol_fees_30d_usd{protocol="avantis"} + sample_size: count_over_time(perp_protocol_health{protocol="avantis"}[24h]) series: perp_protocol_pf_ratio{protocol="avantis"} - slug: apex @@ -293,7 +293,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="apex"} mean: perp_protocol_pf_ratio{protocol="apex"} success: perp_protocol_health{protocol="apex"} - sample_size: perp_protocol_fees_30d_usd{protocol="apex"} + sample_size: count_over_time(perp_protocol_health{protocol="apex"}[24h]) series: perp_protocol_pf_ratio{protocol="apex"} - slug: orderly @@ -306,7 +306,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="orderly"} mean: perp_protocol_pf_ratio{protocol="orderly"} success: perp_protocol_health{protocol="orderly"} - sample_size: perp_protocol_fees_30d_usd{protocol="orderly"} + sample_size: count_over_time(perp_protocol_health{protocol="orderly"}[24h]) series: perp_protocol_pf_ratio{protocol="orderly"} - slug: synfutures @@ -319,7 +319,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="synfutures"} mean: perp_protocol_pf_ratio{protocol="synfutures"} success: perp_protocol_health{protocol="synfutures"} - sample_size: perp_protocol_fees_30d_usd{protocol="synfutures"} + sample_size: count_over_time(perp_protocol_health{protocol="synfutures"}[24h]) series: perp_protocol_pf_ratio{protocol="synfutures"} - slug: derive @@ -332,7 +332,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="derive"} mean: perp_protocol_pf_ratio{protocol="derive"} success: perp_protocol_health{protocol="derive"} - sample_size: perp_protocol_fees_30d_usd{protocol="derive"} + sample_size: count_over_time(perp_protocol_health{protocol="derive"}[24h]) series: perp_protocol_pf_ratio{protocol="derive"} - slug: ostium @@ -346,7 +346,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="ostium"} mean: perp_protocol_pf_ratio{protocol="ostium"} success: perp_protocol_health{protocol="ostium"} - sample_size: perp_protocol_fees_30d_usd{protocol="ostium"} + sample_size: count_over_time(perp_protocol_health{protocol="ostium"}[24h]) series: perp_protocol_pf_ratio{protocol="ostium"} - slug: pacifica @@ -360,7 +360,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="pacifica"} mean: perp_protocol_pf_ratio{protocol="pacifica"} success: perp_protocol_health{protocol="pacifica"} - sample_size: perp_protocol_fees_30d_usd{protocol="pacifica"} + sample_size: count_over_time(perp_protocol_health{protocol="pacifica"}[24h]) series: perp_protocol_pf_ratio{protocol="pacifica"} - slug: extended @@ -374,7 +374,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="extended"} mean: perp_protocol_pf_ratio{protocol="extended"} success: perp_protocol_health{protocol="extended"} - sample_size: perp_protocol_fees_30d_usd{protocol="extended"} + sample_size: count_over_time(perp_protocol_health{protocol="extended"}[24h]) series: perp_protocol_pf_ratio{protocol="extended"} - slug: edgex @@ -387,7 +387,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="edgex"} mean: perp_protocol_pf_ratio{protocol="edgex"} success: perp_protocol_health{protocol="edgex"} - sample_size: perp_protocol_fees_30d_usd{protocol="edgex"} + sample_size: count_over_time(perp_protocol_health{protocol="edgex"}[24h]) series: perp_protocol_pf_ratio{protocol="edgex"} - slug: paradex @@ -400,7 +400,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="paradex"} mean: perp_protocol_pf_ratio{protocol="paradex"} success: perp_protocol_health{protocol="paradex"} - sample_size: perp_protocol_fees_30d_usd{protocol="paradex"} + sample_size: count_over_time(perp_protocol_health{protocol="paradex"}[24h]) series: perp_protocol_pf_ratio{protocol="paradex"} - slug: nado @@ -414,7 +414,7 @@ providers: p99: perp_protocol_pf_ratio{protocol="nado"} mean: perp_protocol_pf_ratio{protocol="nado"} success: perp_protocol_health{protocol="nado"} - sample_size: perp_protocol_fees_30d_usd{protocol="nado"} + sample_size: count_over_time(perp_protocol_health{protocol="nado"}[24h]) series: perp_protocol_pf_ratio{protocol="nado"} - slug: decibel @@ -428,5 +428,5 @@ providers: p99: perp_protocol_pf_ratio{protocol="decibel"} mean: perp_protocol_pf_ratio{protocol="decibel"} success: perp_protocol_health{protocol="decibel"} - sample_size: perp_protocol_fees_30d_usd{protocol="decibel"} + sample_size: count_over_time(perp_protocol_health{protocol="decibel"}[24h]) series: perp_protocol_pf_ratio{protocol="decibel"} diff --git a/public/logos/arbitrum-nova.jpg b/public/logos/arbitrum-nova.jpg index faa993ec..85fe3f3e 100644 Binary files a/public/logos/arbitrum-nova.jpg and b/public/logos/arbitrum-nova.jpg differ diff --git a/public/logos/chiliz.png b/public/logos/chiliz.png index dfcc8d14..8d6a7f9d 100644 Binary files a/public/logos/chiliz.png and b/public/logos/chiliz.png differ diff --git a/public/logos/corn.png b/public/logos/corn.png index 1aa0a259..8b94d156 100644 Binary files a/public/logos/corn.png and b/public/logos/corn.png differ diff --git a/public/logos/etherlink.png b/public/logos/etherlink.png index 01138ea9..05c8785e 100644 Binary files a/public/logos/etherlink.png and b/public/logos/etherlink.png differ diff --git a/public/logos/fuse.jpg b/public/logos/fuse.jpg index 8a885530..6f8c689b 100644 Binary files a/public/logos/fuse.jpg and b/public/logos/fuse.jpg differ diff --git a/public/logos/hydration.png b/public/logos/hydration.png index 0606d01f..7b08bd64 100644 Binary files a/public/logos/hydration.png and b/public/logos/hydration.png differ diff --git a/public/logos/kiloex.png b/public/logos/kiloex.png index abb60c57..aec9a193 100644 Binary files a/public/logos/kiloex.png and b/public/logos/kiloex.png differ diff --git a/public/logos/manta.jpg b/public/logos/manta.jpg index 9d58f613..47e21d86 100644 Binary files a/public/logos/manta.jpg and b/public/logos/manta.jpg differ diff --git a/public/logos/moonriver.jpg b/public/logos/moonriver.jpg index 1e6961c5..784b4850 100644 Binary files a/public/logos/moonriver.jpg and b/public/logos/moonriver.jpg differ diff --git a/public/logos/morph.jpg b/public/logos/morph.jpg index 6940e21a..12a1dbb0 100644 Binary files a/public/logos/morph.jpg and b/public/logos/morph.jpg differ diff --git a/public/logos/peaq.png b/public/logos/peaq.png index 58850147..be461db5 100644 Binary files a/public/logos/peaq.png and b/public/logos/peaq.png differ diff --git a/public/logos/plume.png b/public/logos/plume.png index 3bb2a76f..d03c0411 100644 Binary files a/public/logos/plume.png and b/public/logos/plume.png differ diff --git a/public/logos/pulsechain.png b/public/logos/pulsechain.png index b9f68667..dcbc9828 100644 Binary files a/public/logos/pulsechain.png and b/public/logos/pulsechain.png differ diff --git a/public/logos/reya.png b/public/logos/reya.png index 7e3eda85..3a2cc9ef 100644 Binary files a/public/logos/reya.png and b/public/logos/reya.png differ diff --git a/public/logos/rootstock.jpg b/public/logos/rootstock.jpg index 55199585..9090fbbe 100644 Binary files a/public/logos/rootstock.jpg and b/public/logos/rootstock.jpg differ diff --git a/public/logos/sanko.png b/public/logos/sanko.png index d19623e7..b2e404e7 100644 Binary files a/public/logos/sanko.png and b/public/logos/sanko.png differ diff --git a/public/logos/songbird.png b/public/logos/songbird.png index fc8523fb..e753e5d3 100644 Binary files a/public/logos/songbird.png and b/public/logos/songbird.png differ diff --git a/public/logos/synfutures.png b/public/logos/synfutures.png index d88b0096..81fa9975 100644 Binary files a/public/logos/synfutures.png and b/public/logos/synfutures.png differ diff --git a/public/logos/telos.png b/public/logos/telos.png index 4606f143..7c46f73c 100644 Binary files a/public/logos/telos.png and b/public/logos/telos.png differ diff --git a/public/logos/xlayer.jpg b/public/logos/xlayer.jpg index 15302a87..55d51d3c 100644 Binary files a/public/logos/xlayer.jpg and b/public/logos/xlayer.jpg differ diff --git a/public/logos/zircuit.png b/public/logos/zircuit.png index 9a9d12ef..caca4907 100644 Binary files a/public/logos/zircuit.png and b/public/logos/zircuit.png differ diff --git a/src/app/benchmarks/[slug]/share-card/route.tsx b/src/app/benchmarks/[slug]/share-card/route.tsx index 752f7416..bb76cf76 100644 --- a/src/app/benchmarks/[slug]/share-card/route.tsx +++ b/src/app/benchmarks/[slug]/share-card/route.tsx @@ -32,6 +32,18 @@ function sortByP50(b: Benchmark): ProviderResult[] { ); } +/** True when every ranked row reads one instant gauge (p50 = p90 = p99): + * valuation multiples, market shares, daily totals. The cards then drop + * the "by p50" wording and the p99 captions, which would repeat the + * headline number under every bar. */ +function isGaugeBench(b: Benchmark): boolean { + const rows = sortByP50(b); + return ( + rows.length > 0 && + rows.every((r) => r.ms.p99 === r.ms.p50 && r.ms.p90 === r.ms.p50) + ); +} + /** Compact label for the share-card bar chart. Long multi-word names * (e.g. "BNB Smart Chain", "Avalanche C-Chain") wrap to two lines, * which breaks the bottom-aligned bar layout - the wrapped column gets @@ -45,7 +57,12 @@ function compactProviderName(name: string): string { StellarExpert: "Stellar Exp.", WalletExplorer: "Wallet Exp.", }; - return map[name] ?? name; + if (map[name]) return map[name]; + // "F (SynFutures)": a one- or two-letter ticker with the project in + // brackets. The bracket is the readable part; the full string clips + // to "F (SynFu" in a 12-bar column. + const ticker = name.match(/^(\S{1,2}) \((.+)\)$/); + return ticker ? ticker[2] : name; } /** Direction-aware comparison label for the Compare card centre cell. @@ -723,6 +740,7 @@ async function renderRanking( const sorted = sortByP50(benchmark).slice(0, MAX_BARS); const maxP50 = Math.max(...sorted.map((r) => r.ms.p50)) || 1; const count = sorted.length; + const gauge = isGaugeBench(benchmark); // Scale type sizes down when the bench has many providers, otherwise // the long names (StellarExpert, WalletExplorer, …) collide. const dense = count >= 7; @@ -768,7 +786,7 @@ async function renderRanking( maxWidth: 980, }} > - Product ranking by p50 · {benchmark.metric}. + {gauge ? "Product ranking" : "Product ranking by p50"} · {benchmark.metric}.