diff --git a/src/app/trading-apps/page.tsx b/src/app/trading-apps/page.tsx index fc4743fe..050557da 100644 --- a/src/app/trading-apps/page.tsx +++ b/src/app/trading-apps/page.tsx @@ -1,5 +1,6 @@ -import type { Metadata } from "next"; import Link from "next/link"; +import { ProviderLogo } from "@/components/provider-logo"; +import { readSnapshot } from "@/lib/snapshot"; import { pageMetadata } from "@/lib/page-metadata"; import { safeJsonLd, buildBreadcrumbJsonLd } from "@/lib/jsonld"; import { SITE } from "@/data/site"; @@ -7,13 +8,72 @@ import { SITE } from "@/data/site"; const DESCRIPTION = "Live benchmarks for Solana trading platforms and Telegram bots — volume, fees, execution quality, unique traders, and app store ratings."; -export const metadata: Metadata = pageMetadata({ +export const metadata: import("next").Metadata = pageMetadata({ path: "/trading-apps", - title: "Trading App Benchmarks — pump.fun, Axiom, GMGN, FOMO | OpenChainBench", + title: "Best Solana Trading Apps 2026, ranked by benchmark", description: DESCRIPTION, }); -export const revalidate = 3600; +export const revalidate = 60; + +const BENCH_SLUGS = [ + "solana-trading-platform-wars", + "solana-dex-volume", + "solana-unique-traders", + "solana-avg-trade-size", + "solana-launchpad-wars", + "memecoin-platforms", + "trading-app-execution", + "app-store-ratings", +] as const; + +const PRODUCTS = [ + { + slug: "pump-fun", + name: "pump.fun", + description: "Leading Solana memecoin launchpad and AMM", + }, + { + slug: "fomo", + name: "FOMO", + description: "Multi-chain memecoin trading with social copy-trading", + }, + { + slug: "gmgn", + name: "GMGN", + description: "Memecoin terminal with smart money tracking and Telegram bot", + }, + { + slug: "axiom", + name: "Axiom", + description: "Telegram trading bot for Solana memecoins", + }, + { + slug: "trojan", + name: "Trojan", + description: "Fast Solana Telegram bot with sniping and MEV protection", + }, + { + slug: "photon", + name: "Photon", + description: "Advanced Solana trading terminal with wallet tracking", + }, + { + slug: "maestro", + name: "Maestro", + description: "Multi-chain Telegram trading bot with limit orders", + }, + { + slug: "banana-gun", + name: "Banana Gun", + description: "Multi-chain Telegram bot for memecoins and EVM tokens", + }, + { + slug: "bullx", + name: "BullX", + description: "Multi-chain terminal for memecoins on Solana and EVM", + }, +] as const; const GROUPS = [ { @@ -22,22 +82,23 @@ const GROUPS = [ { slug: "solana-trading-platform-wars", title: "Trading platform volume", - description: "24h volume for pump.fun, GMGN, Axiom, FOMO and Telegram bots. Updated every 15 min.", + description: + "24h volume for pump.fun, GMGN, Axiom, FOMO and Telegram bots", }, { slug: "solana-dex-volume", title: "DEX volume & protocol revenue", - description: "24h trading volume and protocol fees from DeFiLlama. Updated every 30 min.", + description: "24h trading volume and protocol fees from DeFiLlama", }, { slug: "solana-unique-traders", title: "Unique traders", - description: "Unique swap transactions per platform in the last 24h. Whale vs retail signal.", + description: "Unique swap transactions per platform in the last 24h", }, { slug: "solana-avg-trade-size", title: "Average trade size", - description: "Average swap size in USD per platform — reveals trader profile.", + description: "Average swap size in USD per platform", }, ], }, @@ -47,7 +108,8 @@ const GROUPS = [ { slug: "solana-launchpad-wars", title: "Launchpad volume", - description: "24h volume for pump.fun, Flap, Bankr and other bonding-curve programs.", + description: + "24h volume for pump.fun, Flap, Bankr and other bonding-curve programs", }, ], }, @@ -57,12 +119,14 @@ const GROUPS = [ { slug: "memecoin-platforms", title: "Platform fee rates", - description: "Protocol fee revenue divided by volume — who earns most per dollar traded.", + description: + "Protocol fee revenue divided by volume — who earns most per dollar traded", }, { slug: "trading-app-execution", title: "Execution quality", - description: "Priority fees, Jito bundle rates, CU price and platform fee per transaction.", + description: + "Priority fees, Jito bundle rates, CU price and platform fee per transaction", }, ], }, @@ -72,14 +136,33 @@ const GROUPS = [ { slug: "app-store-ratings", title: "iOS app store ratings", - description: "Live Apple App Store ratings for Coinbase, Robinhood, Crypto.com and more. Updated every 30 min.", + description: + "Live Apple App Store ratings for Coinbase, Robinhood, Crypto.com and more", }, ], }, -]; +] as const; + +function fmtUSD(v: number): string { + if (v >= 1_000_000_000) return `$${(v / 1_000_000_000).toFixed(1)}B`; + if (v >= 1_000_000) return `$${(v / 1_000_000).toFixed(0)}M`; + if (v >= 1_000) return `$${(v / 1_000).toFixed(0)}K`; + return `$${v.toFixed(0)}`; +} + +export default async function TradingAppsHubPage() { + const [volumeSnap, ratingsSnap] = await Promise.all([ + readSnapshot("solana-trading-platform-wars"), + readSnapshot("app-store-ratings"), + ]); -export default function TradingAppsHubPage() { - const breadcrumb = { + const topVolumePlatform = volumeSnap?.results[0]; + const topRatedApp = ratingsSnap?.results[0]; + const platformsTracked = new Set( + PRODUCTS.map((p) => p.slug) + ).size; + + const breadcrumbLd = { "@context": "https://schema.org", ...buildBreadcrumbJsonLd([ { name: "Home", item: SITE.url }, @@ -87,86 +170,267 @@ export default function TradingAppsHubPage() { ]), }; - const itemList = { + const itemListLd = { "@context": "https://schema.org", "@type": "ItemList", - name: "Trading app benchmarks — OpenChainBench", - numberOfItems: GROUPS.reduce((n, g) => n + g.items.length, 0), - itemListElement: GROUPS.flatMap((g, gi) => - g.items.map((item, ii) => ({ - "@type": "ListItem", - position: GROUPS.slice(0, gi).reduce((n, g2) => n + g2.items.length, 0) + ii + 1, - name: item.title, - url: `${SITE.url}/benchmarks/${item.slug}`, - })) - ), + name: "Trading app benchmarks by OpenChainBench", + description: DESCRIPTION, + numberOfItems: BENCH_SLUGS.length, + itemListElement: BENCH_SLUGS.map((slug, i) => ({ + "@type": "ListItem", + position: i + 1, + name: slug, + url: `${SITE.url}/benchmarks/${slug}`, + })), }; return ( -
+