diff --git a/next.config.ts b/next.config.ts index be6528ee..ad07b9bb 100644 --- a/next.config.ts +++ b/next.config.ts @@ -269,7 +269,7 @@ const nextConfig: NextConfig = { }, { source: "/apps", - destination: "/benchmarks", + destination: "/trading-apps", permanent: true, }, ...chainRedirects, diff --git a/src/app/trading-apps/page.tsx b/src/app/trading-apps/page.tsx new file mode 100644 index 00000000..050557da --- /dev/null +++ b/src/app/trading-apps/page.tsx @@ -0,0 +1,436 @@ +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"; + +const DESCRIPTION = + "Live benchmarks for Solana trading platforms and Telegram bots — volume, fees, execution quality, unique traders, and app store ratings."; + +export const metadata: import("next").Metadata = pageMetadata({ + path: "/trading-apps", + title: "Best Solana Trading Apps 2026, ranked by benchmark", + description: DESCRIPTION, +}); + +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 = [ + { + label: "Volume & activity", + items: [ + { + slug: "solana-trading-platform-wars", + title: "Trading platform volume", + 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", + }, + { + slug: "solana-unique-traders", + title: "Unique traders", + 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", + }, + ], + }, + { + label: "Launchpads", + items: [ + { + slug: "solana-launchpad-wars", + title: "Launchpad volume", + description: + "24h volume for pump.fun, Flap, Bankr and other bonding-curve programs", + }, + ], + }, + { + label: "Fees & execution", + items: [ + { + slug: "memecoin-platforms", + title: "Platform fee rates", + 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", + }, + ], + }, + { + label: "App store", + items: [ + { + slug: "app-store-ratings", + title: "iOS app store ratings", + 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"), + ]); + + 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 }, + { name: "Trading Apps", item: `${SITE.url}/trading-apps` }, + ]), + }; + + const itemListLd = { + "@context": "https://schema.org", + "@type": "ItemList", + 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 ( +
+