Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/app/compare/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -372,13 +372,13 @@ function buildComparisonProse(

const parts: string[] = [];
if (aWinTitles.length === 0) {
const word = total === 1 ? "the only live benchmark" : `all ${total} live benchmarks`;
const word = total === 1 ? "the only live benchmark" : total === 2 ? "both live benchmarks" : `all ${total} live benchmarks`;
parts.push(`${bName} leads on ${word}.`);
} else if (bWinTitles.length === 0) {
const word = total === 1 ? "the only live benchmark" : `all ${total} live benchmarks`;
const word = total === 1 ? "the only live benchmark" : total === 2 ? "both live benchmarks" : `all ${total} live benchmarks`;
parts.push(`${aName} leads on ${word}.`);
} else if (aWinTitles.length === bWinTitles.length) {
parts.push(`Split: ${aName} leads on ${aWinTitles.slice(0, 2).join(", ")}; ${bName} leads on ${bWinTitles.slice(0, 2).join(", ")}.`);
parts.push(`Split decision: ${aName} leads on ${aWinTitles.slice(0, 2).join(", ")}; ${bName} leads on ${bWinTitles.slice(0, 2).join(", ")}.`);
} else {
parts.push(
`${aName} leads on ${aWinTitles.length} of ${total} shared benchmarks, ${bName} on ${bWinTitles.length}${ties > 0 ? ` (${ties} tied)` : ""}.`,
Expand Down Expand Up @@ -819,14 +819,14 @@ export default async function ComparePage({
if (aWinsBench) {
const st = shortBenchTitle(aWinsBench.title);
faqEntries.push({
q: `Which is ${verbForBench(aWinsBench)} on ${st}, ${a.name} or ${b.name}?`,
q: `Which is ${verbForBench(aWinsBench)}, ${a.name} or ${b.name}?`,
a: `On the ${st} benchmark, ${a.name} leads at ${fmtUnit(aWinsBench.aResult.p50, aWinsBench.unit)} versus ${b.name} at ${fmtUnit(aWinsBench.bResult.p50, aWinsBench.unit)}. Live measurement is updated continuously by the OpenChainBench harness.`,
});
}
if (bWinsBench) {
const st = shortBenchTitle(bWinsBench.title);
faqEntries.push({
q: `Which is ${verbForBench(bWinsBench)} on ${st}, ${a.name} or ${b.name}?`,
q: `Which is ${verbForBench(bWinsBench)}, ${a.name} or ${b.name}?`,
a: `On the ${st} benchmark, ${b.name} leads at ${fmtUnit(bWinsBench.bResult.p50, bWinsBench.unit)} versus ${a.name} at ${fmtUnit(bWinsBench.aResult.p50, bWinsBench.unit)}. Live measurement is updated continuously by the OpenChainBench harness.`,
});
}
Expand Down
10 changes: 10 additions & 0 deletions src/components/compare-bench-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -197,10 +197,20 @@ function ScopeTable({
<tbody>
{(["a", "b"] as const).map((side) => {
const name = side === "a" ? aName : bName;
const sampleSize = side === "a" ? (bench.aResult?.sampleSize ?? 0) : (bench.bResult?.sampleSize ?? 0);
const provisional = sampleSize > 0 && sampleSize < 100;
return (
<tr key={side} className="border-t border-rule">
<td className="py-3 pr-4 text-[11px] font-medium uppercase tracking-[0.14em] text-ink-muted sticky left-0 bg-bg border-r border-rule/40">
{name}
{provisional && (
<span
className="ml-1.5 text-amber-400/80 font-normal normal-case tracking-normal"
title={`${Math.round(sampleSize)} samples — treat as provisional`}
>
provisional
</span>
)}
</td>
{cols.map((c) => {
const val = side === "a" ? c.aValue : c.bValue;
Expand Down
4 changes: 2 additions & 2 deletions src/data/provider-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1226,13 +1226,13 @@ export const PROVIDER_REGISTRY: Record<string, ProviderRegistryEntry> = {
fomo: {
url: "https://fomo.family",
description:
"FOMO is a multi-chain trading app (Solana, Base, BNB Chain) for memecoins and perps. It provides social copy-trading, onchain signals, and routes swaps through pump.fun, Raydium, and other DEX pools. Backed by Index Ventures and USV.",
"FOMO is a multi-chain trading app (Solana, Base, BNB Chain, and more) for memecoins and perps. It provides social copy-trading, onchain signals, and routes swaps through pump.fun, Raydium, and other DEX pools.",
twitter: "@tryfomo",
},
"pump-fun": {
url: "https://pump.fun",
description:
"pump.fun is the leading Solana memecoin launchpad. Tokens start on a bonding curve and graduate to PumpSwap (pump.fun's native AMM, launched March 2025) when the curve completes. The platform charges a 1% fee on every buy and sell on the bonding curve.",
"pump.fun is the leading Solana memecoin launchpad. Tokens start on a bonding curve and graduate to PumpSwap (pump.fun's native AMM, launched March 2025) when the curve completes.",
twitter: "@pumpdotfun",
},
pumpswap: {
Expand Down
Loading