From 4552471271b83f0f13d3e52c7ef6d236e29ec5e9 Mon Sep 17 00:00:00 2001 From: Flotapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:28:32 +0200 Subject: [PATCH 1/3] feat: dune-platform-volume harness + trading-apps hub overhaul (#2023) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(trading-apps): add Terminal (Padre), hide pump.fun volume pump.fun cut fees to 0% in Aug 2026 — no referral tag, bonding-curve volume mixes all UIs and bots, not comparable. Show — instead. Terminal = pump.fun's own app (formerly Padre, acq. Apr 2025), trackable via its own referral tag, added to PLATFORMS as padre. * feat: dune-platform-volume harness + bench 201 switch to Sacha datasets New harness queries adam_tehc's Dune community datasets for cross-chain trading platform volume (Solana + BNB + Base + Robinhood + HyperEVM + Monad). Datasets confirmed: gmgn, axiom, trojan, terminal (padre), photon, basedbot, fomo (sol-only), pumpapp + relay (pump.fun). Bench YAML updated: metric dune_platform_volume_24h_usd, removed Mobula lighthouse dependency, added BasedBot as new provider. trading-apps page: add BasedBot, update tooltip + footer for new source, restore pump.fun volume (now properly pumpapp-only not all bonding-curve). Dune query ID: 8400444 (set as DUNE_QUERY_ID on VPS) --- benchmarks/solana-trading-platform-wars.yml | 188 +++++++++--------- harnesses/dune-platform-volume/Dockerfile | 15 ++ .../dune-platform-volume/cmd/script/dune.go | 174 ++++++++++++++++ .../dune-platform-volume/cmd/script/main.go | 127 ++++++++++++ .../cmd/script/metrics.go | 44 ++++ harnesses/dune-platform-volume/go.mod | 18 ++ harnesses/dune-platform-volume/go.sum | 46 +++++ src/app/trading-apps/page.tsx | 20 +- 8 files changed, 531 insertions(+), 101 deletions(-) create mode 100644 harnesses/dune-platform-volume/Dockerfile create mode 100644 harnesses/dune-platform-volume/cmd/script/dune.go create mode 100644 harnesses/dune-platform-volume/cmd/script/main.go create mode 100644 harnesses/dune-platform-volume/cmd/script/metrics.go create mode 100644 harnesses/dune-platform-volume/go.mod create mode 100644 harnesses/dune-platform-volume/go.sum diff --git a/benchmarks/solana-trading-platform-wars.yml b/benchmarks/solana-trading-platform-wars.yml index 5c42bac9..1ea97b67 100644 --- a/benchmarks/solana-trading-platform-wars.yml +++ b/benchmarks/solana-trading-platform-wars.yml @@ -2,10 +2,10 @@ slug: solana-trading-platform-wars number: "201" -title: "Solana trading platform leaderboard: pump.fun vs GMGN vs Axiom vs Fomo, live 24h volume" -seo_title: "Solana trading platform comparison 2026: pump.fun, GMGN, Axiom, Fomo, Trojan" -seo_description: "{{best_name}} leads Solana trading platforms at ${{best_p50}} 24h volume. pump.fun vs GMGN vs Axiom vs Fomo vs Trojan vs Padre vs Phantom ranked live from Mobula lighthouse data." -subtitle: Live 24-hour trading volume for each Solana trading platform and Telegram bot. Polled every 15 minutes from Mobula lighthouse, which aggregates on-chain swap events routed through each frontend across all Solana DEX programs. +title: "Trading platform leaderboard: GMGN vs Axiom vs Fomo vs pump.fun, live 24h volume" +seo_title: "Trading platform comparison 2026: GMGN, Axiom, Fomo, pump.fun, Trojan, Terminal" +seo_description: "{{best_name}} leads trading platforms at ${{best_p50}} 24h volume. GMGN vs Axiom vs Fomo vs Trojan vs Terminal vs BasedBot ranked live from Dune community datasets." +subtitle: Live 24-hour trading volume per platform and Telegram bot, cross-chain (Solana + BNB + Base + Robinhood node + HyperEVM + Monad). Sourced from Sacha's Dune community datasets, refreshed every 4 hours. category: Trading status: live @@ -14,7 +14,7 @@ unit: usd higher_is_better: true disclaimer: | - Volume figures are sourced from Mobula's lighthouse aggregator, which indexes on-chain swap events attributed to each trading platform or Telegram bot. Data is refreshed every 15 minutes. Platforms with zero volume may indicate no attributable on-chain activity in the last 24 hours or a temporary attribution gap in Mobula's indexing. + Volume figures are sourced from Sacha's (adam_tehc) Dune community datasets, which aggregate cross-chain trading activity per platform (Solana, BNB Chain, Base, Robinhood node, HyperEVM, Monad, and more). Data is refreshed every 4 hours. pump.fun volume = bonding-curve Solana swaps (dataset_pumpapp_sol_daily) + cross-chain relay swaps (dataset_pumpfun_relay_daily). Fomo = Solana only (dataset_fomo_sol_daily). All others sum across all blockchains. seo_intro: | Solana's trading frontend market is a contested race between GMGN, Axiom and @@ -42,12 +42,12 @@ abstract: | trading platforms as providers. methodology: - - "Source: Mobula lighthouse (api.mobula.io/api/2/market/lighthouse), byPlatform field. Mobula attributes swap events using on-chain referral tags, program IDs and memo fields." - - "Poll cadence: harness fetches the endpoint every 15 minutes and updates Prometheus gauges. Prometheus scrapes :2112/metrics every 60 seconds." - - "Volume: sum of all swap event notional values (in USD at time of swap) within the last 24 hours for swaps attributed to this platform. Higher = more user activity routed through this frontend." - - "Attribution: Mobula uses on-chain referral tags, program IDs and memo fields. Each swap is attributed to exactly one platform. Platforms without standard referral tags may be undercounted." - - "pump.fun: sourced from Mobula's byLaunchpad bucket (bonding-curve swaps via pump.fun's own frontend). PumpSwap trades routed through GMGN or Axiom count under those platforms." - - "Phantom: wallet-initiated swaps via Jupiter or other aggregators, not active trading sessions." + - "Source: Sacha's (adam_tehc) Dune community datasets (dune.adam_tehc_co.dataset_*_daily). Each dataset covers one trading platform across all blockchains it operates on." + - "Poll cadence: harness queries Dune every 4 hours and updates Prometheus gauges. Prometheus scrapes :2112/metrics every 60 seconds." + - "Volume: sum of volume_usd across all blockchains for the most recent complete day in each platform's dataset. Higher = more total user activity." + - "pump.fun: dataset_pumpapp_sol_daily (Solana bonding-curve) + dataset_pumpfun_relay_daily filtered to req_class='swap'. pump.fun cut fees to 0% in Aug 2026; volume is for their own frontend only (pumpapp), not all bonding-curve activity." + - "fomo: dataset_fomo_sol_daily (Solana only). Includes Fomo's relay cross-chain volume when Sacha incorporates it." + - "BasedBot: multi-chain bot (Robinhood node, BNB, Base, Solana, ETH, HyperEVM, Avalanche)." findings: - "{{best_name}} leads Solana trading platforms at ${{best_p50}} 24h volume." @@ -56,11 +56,11 @@ findings: - "Trojan serves the Telegram-native segment and accounts for significant bot-driven Solana swap flow. Padre is a web trading terminal, not a Telegram bot." - "Phantom collects a 0.85% platform fee on in-wallet swaps routed to its own fee wallets; it is a monetised frontend, not a passive aggregator pass-through." -source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/solana-trading-platform-wars +source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/dune-platform-volume prometheus: window: 24h - freshness_metric: solana_platform_volume_24h_usd + freshness_metric: dune_platform_volume_24h_usd faq: - q: "Which Solana trading platform has the most volume?" @@ -79,106 +79,106 @@ faq: a: "BullX has limited Solana attribution in Mobula's lighthouse data. BullX primarily targets EVM chains and its Solana swap volume may not be tagged with referral data that Mobula can attribute. DEX volume for BullX across chains is tracked in bench 205." providers: - - slug: pump-fun - name: pump.fun - tag: "Solana meme launchpad, bonding curve" - formula: "24h swap volume in USD on pump.fun's bonding curve via pump.fun's own frontend (Mobula lighthouse byLaunchpad[name=PumpFun].volumeUSD.24h, updated every 15 min)." - queries: - p50: solana_platform_volume_24h_usd{platform="pump-fun"} - p90: solana_platform_volume_24h_usd{platform="pump-fun"} - p99: solana_platform_volume_24h_usd{platform="pump-fun"} - mean: solana_platform_volume_24h_usd{platform="pump-fun"} - success: solana_platform_health{platform="pump-fun"} - sample_size: solana_platform_fees_24h_usd{platform="pump-fun"} - series: solana_platform_volume_24h_usd{platform="pump-fun"} - - slug: gmgn name: GMGN - tag: "AI trading terminal on Solana" - formula: "24h swap volume in USD attributed to GMGN (Mobula lighthouse byPlatform[name=GMGN].volumeUSD.24h, updated every 15 min)." + tag: "AI trading terminal, multi-chain" + formula: "24h cross-chain volume in USD (Solana + BNB + Robinhood node + Base + ETH + more) from dune.adam_tehc_co.dataset_gmgn_daily, latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="gmgn"} - p90: solana_platform_volume_24h_usd{platform="gmgn"} - p99: solana_platform_volume_24h_usd{platform="gmgn"} - mean: solana_platform_volume_24h_usd{platform="gmgn"} - success: solana_platform_health{platform="gmgn"} - sample_size: solana_platform_fees_24h_usd{platform="gmgn"} - series: solana_platform_volume_24h_usd{platform="gmgn"} + p50: dune_platform_volume_24h_usd{platform="gmgn"} + p90: dune_platform_volume_24h_usd{platform="gmgn"} + p99: dune_platform_volume_24h_usd{platform="gmgn"} + mean: dune_platform_volume_24h_usd{platform="gmgn"} + success: dune_platform_volume_health{platform="gmgn"} + sample_size: dune_platform_volume_24h_usd{platform="gmgn"} + series: dune_platform_volume_24h_usd{platform="gmgn"} - slug: axiom name: Axiom - tag: "Web trading terminal on Solana" - formula: "24h swap volume in USD attributed to Axiom (Mobula lighthouse byPlatform[name=Axiom].volumeUSD.24h, updated every 15 min)." + tag: "Web trading terminal, multi-chain" + formula: "24h cross-chain volume in USD (Solana + Robinhood node + BNB + ETH) from dune.adam_tehc_co.dataset_axiom_daily, latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="axiom"} - p90: solana_platform_volume_24h_usd{platform="axiom"} - p99: solana_platform_volume_24h_usd{platform="axiom"} - mean: solana_platform_volume_24h_usd{platform="axiom"} - success: solana_platform_health{platform="axiom"} - sample_size: solana_platform_fees_24h_usd{platform="axiom"} - series: solana_platform_volume_24h_usd{platform="axiom"} + p50: dune_platform_volume_24h_usd{platform="axiom"} + p90: dune_platform_volume_24h_usd{platform="axiom"} + p99: dune_platform_volume_24h_usd{platform="axiom"} + mean: dune_platform_volume_24h_usd{platform="axiom"} + success: dune_platform_volume_health{platform="axiom"} + sample_size: dune_platform_volume_24h_usd{platform="axiom"} + series: dune_platform_volume_24h_usd{platform="axiom"} - slug: fomo name: Fomo tag: "Solana trading platform" - formula: "24h swap volume in USD attributed to Fomo (Mobula lighthouse byPlatform[name=Fomo].volumeUSD.24h, updated every 15 min). Fees from DeFiLlama (dailyRevenue)." + formula: "24h Solana volume in USD from dune.adam_tehc_co.dataset_fomo_sol_daily, latest complete day." + queries: + p50: dune_platform_volume_24h_usd{platform="fomo"} + p90: dune_platform_volume_24h_usd{platform="fomo"} + p99: dune_platform_volume_24h_usd{platform="fomo"} + mean: dune_platform_volume_24h_usd{platform="fomo"} + success: dune_platform_volume_health{platform="fomo"} + sample_size: dune_platform_volume_24h_usd{platform="fomo"} + series: dune_platform_volume_24h_usd{platform="fomo"} + + - slug: basedbot + name: BasedBot + tag: "Multi-chain trading bot" + formula: "24h cross-chain volume in USD (Robinhood node + BNB + Base + Solana + ETH + HyperEVM) from dune.adam_tehc_co.dataset_basedbot_daily, latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="fomo"} - p90: solana_platform_volume_24h_usd{platform="fomo"} - p99: solana_platform_volume_24h_usd{platform="fomo"} - mean: solana_platform_volume_24h_usd{platform="fomo"} - success: solana_platform_health{platform="fomo"} - sample_size: defillama_dex_fees_24h_usd{platform="fomo"} - series: solana_platform_volume_24h_usd{platform="fomo"} + p50: dune_platform_volume_24h_usd{platform="basedbot"} + p90: dune_platform_volume_24h_usd{platform="basedbot"} + p99: dune_platform_volume_24h_usd{platform="basedbot"} + mean: dune_platform_volume_24h_usd{platform="basedbot"} + success: dune_platform_volume_health{platform="basedbot"} + sample_size: dune_platform_volume_24h_usd{platform="basedbot"} + series: dune_platform_volume_24h_usd{platform="basedbot"} - - slug: trojan - name: Trojan - tag: "Telegram trading bot on Solana" - formula: "24h swap volume in USD attributed to Trojan (Mobula lighthouse byPlatform[name=Trojan].volumeUSD.24h, updated every 15 min)." + - slug: pump-fun + name: pump.fun + tag: "Solana meme launchpad + cross-chain relay" + formula: "24h volume = pump.fun app Solana swaps (dataset_pumpapp_sol_daily) + cross-chain relay swaps (dataset_pumpfun_relay_daily, req_class=swap). pump.fun cut fees to 0% Aug 2026; volume is for pumpapp frontend only." queries: - p50: solana_platform_volume_24h_usd{platform="trojan"} - p90: solana_platform_volume_24h_usd{platform="trojan"} - p99: solana_platform_volume_24h_usd{platform="trojan"} - mean: solana_platform_volume_24h_usd{platform="trojan"} - success: solana_platform_health{platform="trojan"} - sample_size: solana_platform_fees_24h_usd{platform="trojan"} - series: solana_platform_volume_24h_usd{platform="trojan"} + p50: dune_platform_volume_24h_usd{platform="pump-fun"} + p90: dune_platform_volume_24h_usd{platform="pump-fun"} + p99: dune_platform_volume_24h_usd{platform="pump-fun"} + mean: dune_platform_volume_24h_usd{platform="pump-fun"} + success: dune_platform_volume_health{platform="pump-fun"} + sample_size: dune_platform_volume_24h_usd{platform="pump-fun"} + series: dune_platform_volume_24h_usd{platform="pump-fun"} - slug: padre - name: Padre - tag: "AI web trading terminal on Solana" - formula: "24h swap volume in USD attributed to Padre (Mobula lighthouse byPlatform[name=Padre].volumeUSD.24h, updated every 15 min)." + name: Terminal + tag: "pump.fun's own trading app (formerly Padre, acquired Apr 2025)" + formula: "24h cross-chain volume in USD (Solana + Robinhood node + Base + BNB) from dune.adam_tehc_co.dataset_terminal_daily, latest complete day." + queries: + p50: dune_platform_volume_24h_usd{platform="padre"} + p90: dune_platform_volume_24h_usd{platform="padre"} + p99: dune_platform_volume_24h_usd{platform="padre"} + mean: dune_platform_volume_24h_usd{platform="padre"} + success: dune_platform_volume_health{platform="padre"} + sample_size: dune_platform_volume_24h_usd{platform="padre"} + series: dune_platform_volume_24h_usd{platform="padre"} + + - slug: trojan + name: Trojan + tag: "Telegram trading bot on Solana" + formula: "24h Solana volume in USD from dune.adam_tehc_co.dataset_trojan_daily, latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="padre"} - p90: solana_platform_volume_24h_usd{platform="padre"} - p99: solana_platform_volume_24h_usd{platform="padre"} - mean: solana_platform_volume_24h_usd{platform="padre"} - success: solana_platform_health{platform="padre"} - sample_size: solana_platform_fees_24h_usd{platform="padre"} - series: solana_platform_volume_24h_usd{platform="padre"} + p50: dune_platform_volume_24h_usd{platform="trojan"} + p90: dune_platform_volume_24h_usd{platform="trojan"} + p99: dune_platform_volume_24h_usd{platform="trojan"} + mean: dune_platform_volume_24h_usd{platform="trojan"} + success: dune_platform_volume_health{platform="trojan"} + sample_size: dune_platform_volume_24h_usd{platform="trojan"} + series: dune_platform_volume_24h_usd{platform="trojan"} - slug: photon name: Photon tag: "Solana trading terminal" - formula: "24h swap volume in USD attributed to Photon (Mobula lighthouse byPlatform[name=Photon].volumeUSD.24h, updated every 15 min)." - queries: - p50: solana_platform_volume_24h_usd{platform="photon"} - p90: solana_platform_volume_24h_usd{platform="photon"} - p99: solana_platform_volume_24h_usd{platform="photon"} - mean: solana_platform_volume_24h_usd{platform="photon"} - success: solana_platform_health{platform="photon"} - sample_size: solana_platform_fees_24h_usd{platform="photon"} - series: solana_platform_volume_24h_usd{platform="photon"} - - - slug: maestro - name: Maestro - tag: "Telegram trading bot on Solana" - formula: "24h swap volume in USD attributed to Maestro (Mobula lighthouse byPlatform[name=Maestro].volumeUSD.24h, updated every 15 min)." + formula: "24h Solana volume in USD from dune.adam_tehc_co.dataset_photon_daily, latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="maestro"} - p90: solana_platform_volume_24h_usd{platform="maestro"} - p99: solana_platform_volume_24h_usd{platform="maestro"} - mean: solana_platform_volume_24h_usd{platform="maestro"} - success: solana_platform_health{platform="maestro"} - sample_size: solana_platform_fees_24h_usd{platform="maestro"} - series: solana_platform_volume_24h_usd{platform="maestro"} + p50: dune_platform_volume_24h_usd{platform="photon"} + p90: dune_platform_volume_24h_usd{platform="photon"} + p99: dune_platform_volume_24h_usd{platform="photon"} + mean: dune_platform_volume_24h_usd{platform="photon"} + success: dune_platform_volume_health{platform="photon"} + sample_size: dune_platform_volume_24h_usd{platform="photon"} + series: dune_platform_volume_24h_usd{platform="photon"} diff --git a/harnesses/dune-platform-volume/Dockerfile b/harnesses/dune-platform-volume/Dockerfile new file mode 100644 index 00000000..2f083814 --- /dev/null +++ b/harnesses/dune-platform-volume/Dockerfile @@ -0,0 +1,15 @@ +FROM golang:1.24-alpine AS builder + +WORKDIR /app +RUN apk add --no-cache git + +COPY go.mod go.sum ./ +COPY cmd ./cmd +RUN go mod tidy && CGO_ENABLED=0 GOOS=linux go build -o /app/harness ./cmd/script + +FROM debian:bookworm-slim +WORKDIR /app +RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/* +COPY --from=builder /app/harness /app/harness +EXPOSE 2112 +CMD ["/app/harness"] diff --git a/harnesses/dune-platform-volume/cmd/script/dune.go b/harnesses/dune-platform-volume/cmd/script/dune.go new file mode 100644 index 00000000..a10a020c --- /dev/null +++ b/harnesses/dune-platform-volume/cmd/script/dune.go @@ -0,0 +1,174 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "time" +) + +// querySQL fetches yesterday's total cross-chain volume per platform from +// Sacha's community datasets (dune.adam_tehc_co.dataset_*). +// +// Dataset schemas: +// dataset_{platform}_daily → day, blockchain, volume_usd, fees_usd, txns, wallets +// dataset_fomo_sol_daily → day, volume_usd, fees_usd, txns, wallets, wallets_dedup (no blockchain col) +// dataset_pumpapp_sol_daily → day, blockchain, volume_usd, fees_usd, txns, wallets, wallets_dedup +// dataset_pumpfun_relay_daily → day, fill_chain, req_class, volume_usd, app_fees_usd, txns, wallets +// +// pump.fun total = pumpapp Solana + relay swaps (req_class='swap'). +// All others: SUM(volume_usd) across all blockchains for latest available day. +const querySQL = ` +WITH latest AS ( + SELECT + 'gmgn' AS platform, SUM(volume_usd) AS volume_usd FROM dune.adam_tehc_co.dataset_gmgn_daily + WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_gmgn_daily) + UNION ALL + SELECT 'axiom', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_axiom_daily + WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_axiom_daily) + UNION ALL + SELECT 'trojan', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_trojan_daily + WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_trojan_daily) + UNION ALL + SELECT 'padre', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_terminal_daily + WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_terminal_daily) + UNION ALL + SELECT 'photon', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_photon_daily + WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_photon_daily) + UNION ALL + SELECT 'basedbot', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_basedbot_daily + WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_basedbot_daily) + UNION ALL + SELECT 'fomo', volume_usd FROM dune.adam_tehc_co.dataset_fomo_sol_daily + WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_fomo_sol_daily) + UNION ALL + SELECT 'pump-fun', + COALESCE((SELECT SUM(volume_usd) FROM dune.adam_tehc_co.dataset_pumpapp_sol_daily + WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_pumpapp_sol_daily)), 0) + + COALESCE((SELECT SUM(volume_usd) FROM dune.adam_tehc_co.dataset_pumpfun_relay_daily + WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_pumpfun_relay_daily) + AND req_class = 'swap'), 0) +) +SELECT platform, volume_usd FROM latest ORDER BY volume_usd DESC +` + +const duneBase = "https://api.dune.com/api/v1" + +type duneClient struct { + apiKey string + http *http.Client +} + +type duneRow struct { + Platform string `json:"platform"` + VolumeUSD float64 `json:"volume_usd"` +} + +func newDuneClient(apiKey string) *duneClient { + return &duneClient{ + apiKey: apiKey, + http: &http.Client{Timeout: 30 * time.Second}, + } +} + +func (d *duneClient) req(method, path string, body any) (*http.Response, error) { + var r io.Reader + if body != nil { + b, err := json.Marshal(body) + if err != nil { + return nil, err + } + r = bytes.NewReader(b) + } + req, err := http.NewRequest(method, duneBase+path, r) + if err != nil { + return nil, err + } + req.Header.Set("X-Dune-Api-Key", d.apiKey) + if body != nil { + req.Header.Set("Content-Type", "application/json") + } + return d.http.Do(req) +} + +func (d *duneClient) createQuery() (string, error) { + payload := map[string]any{ + "name": "OCB: Cross-chain trading platform volume (Sacha datasets)", + "query_sql": querySQL, + "is_private": false, + "parameters": []any{}, + } + resp, err := d.req("POST", "/query", payload) + if err != nil { + return "", err + } + defer resp.Body.Close() + if resp.StatusCode >= 400 { + body, _ := io.ReadAll(resp.Body) + return "", fmt.Errorf("HTTP %d: %s", resp.StatusCode, body) + } + var out struct { + QueryID int `json:"query_id"` + } + if err := json.NewDecoder(resp.Body).Decode(&out); err != nil { + return "", err + } + return fmt.Sprintf("%d", out.QueryID), nil +} + +func (d *duneClient) execute(queryID string) (string, error) { + resp, err := d.req("POST", "/query/"+queryID+"/execute", map[string]any{}) + if err != nil { + return "", err + } + defer resp.Body.Close() + if resp.StatusCode >= 400 { + body, _ := io.ReadAll(resp.Body) + return "", fmt.Errorf("HTTP %d: %s", resp.StatusCode, body) + } + var out struct { + ExecutionID string `json:"execution_id"` + } + if err := json.NewDecoder(resp.Body).Decode(&out); err != nil { + return "", err + } + return out.ExecutionID, nil +} + +func (d *duneClient) executionState(execID string) (string, error) { + resp, err := d.req("GET", "/execution/"+execID+"/status", nil) + if err != nil { + return "", err + } + defer resp.Body.Close() + var out struct { + State string `json:"state"` + } + if err := json.NewDecoder(resp.Body).Decode(&out); err != nil { + return "", err + } + return out.State, nil +} + +func (d *duneClient) latestResult(queryID string) ([]duneRow, error) { + resp, err := d.req("GET", "/query/"+queryID+"/results", nil) + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode >= 400 { + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, body) + } + var out struct { + Result struct { + Rows []duneRow `json:"rows"` + } `json:"result"` + } + if err := json.NewDecoder(resp.Body).Decode(&out); err != nil { + return nil, err + } + return out.Result.Rows, nil +} diff --git a/harnesses/dune-platform-volume/cmd/script/main.go b/harnesses/dune-platform-volume/cmd/script/main.go new file mode 100644 index 00000000..84ce6664 --- /dev/null +++ b/harnesses/dune-platform-volume/cmd/script/main.go @@ -0,0 +1,127 @@ +// dune-platform-volume -- Bench 201 (replaces Mobula lighthouse source) +// +// Queries Sacha's community datasets on Dune (dune.adam_tehc_co.dataset_*_daily) +// for cross-chain trading platform volume. Each dataset has columns: +// day, blockchain, volume_usd, fees_usd, txns, wallets. +// pump.fun uses dataset_pumpapp_sol_daily (Solana) + dataset_pumpfun_relay_daily (relay). +// fomo uses dataset_fomo_sol_daily (no blockchain column). +// +// Required env vars: +// DUNE_API_KEY - Dune Analytics API key +// +// Metrics on :2112/metrics: +// dune_platform_volume_24h_usd{platform} +// dune_platform_volume_health{platform} +package main + +import ( + "fmt" + "os" + "os/signal" + "syscall" + "time" +) + +const ( + fetchInterval = 15 * time.Minute + refreshInterval = 4 * time.Hour +) + +func main() { + fmt.Println("=== dune-platform-volume harness ===") + fmt.Println("OpenChainBench Bench 201 -- Cross-chain trading platform volume via Sacha's Dune datasets.") + + apiKey := os.Getenv("DUNE_API_KEY") + if apiKey == "" { + fmt.Fprintln(os.Stderr, "[fatal] DUNE_API_KEY not set") + os.Exit(1) + } + + queryID := os.Getenv("DUNE_QUERY_ID") + client := newDuneClient(apiKey) + + if queryID == "" { + fmt.Println("[init] DUNE_QUERY_ID not set, creating Dune query...") + id, err := client.createQuery() + if err != nil { + fmt.Fprintf(os.Stderr, "[fatal] failed to create Dune query: %v\n", err) + os.Exit(1) + } + fmt.Printf("[init] Dune query created: %s\n", id) + fmt.Printf("[init] Set DUNE_QUERY_ID=%s and restart the harness.\n", id) + os.Exit(0) + } + + go func() { + if err := startMetricsServer(":2112"); err != nil { + fmt.Printf("[fatal] metrics server: %v\n", err) + os.Exit(1) + } + }() + + sig := make(chan os.Signal, 1) + signal.Notify(sig, os.Interrupt, syscall.SIGTERM) + + runFetch(client, queryID) + go func() { + execID, err := client.execute(queryID) + if err != nil { + fmt.Printf("[refresh] execute failed: %v\n", err) + return + } + pollUntilDone(client, queryID, execID) + }() + + fetchTick := time.NewTicker(fetchInterval) + refreshTick := time.NewTicker(refreshInterval) + defer fetchTick.Stop() + defer refreshTick.Stop() + + for { + select { + case <-sig: + fmt.Println("[shutdown] received signal") + return + case <-fetchTick.C: + runFetch(client, queryID) + case <-refreshTick.C: + execID, err := client.execute(queryID) + if err != nil { + fmt.Printf("[refresh] execute failed: %v\n", err) + continue + } + go pollUntilDone(client, queryID, execID) + } + } +} + +func runFetch(c *duneClient, queryID string) { + rows, err := c.latestResult(queryID) + if err != nil { + fmt.Printf("[fetch] failed: %v\n", err) + return + } + publishRows(rows) + fmt.Printf("[fetch] updated %d platform(s)\n", len(rows)) +} + +func pollUntilDone(c *duneClient, queryID, execID string) { + for range 60 { + time.Sleep(30 * time.Second) + state, err := c.executionState(execID) + if err != nil { + fmt.Printf("[poll] state check failed: %v\n", err) + return + } + switch state { + case "QUERY_STATE_COMPLETED": + fmt.Printf("[poll] execution %s complete\n", execID) + runFetch(c, queryID) + return + case "QUERY_STATE_FAILED", "QUERY_STATE_CANCELLED", "QUERY_STATE_EXPIRED": + fmt.Printf("[poll] execution %s ended with state %s\n", execID, state) + return + } + } + fmt.Printf("[poll] execution %s timed out waiting\n", execID) +} diff --git a/harnesses/dune-platform-volume/cmd/script/metrics.go b/harnesses/dune-platform-volume/cmd/script/metrics.go new file mode 100644 index 00000000..b087b85a --- /dev/null +++ b/harnesses/dune-platform-volume/cmd/script/metrics.go @@ -0,0 +1,44 @@ +package main + +import ( + "net/http" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +var ( + platformVolume = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "dune_platform_volume_24h_usd", + Help: "24h trading volume in USD per platform, summed across all blockchains (Sacha's Dune community datasets).", + }, []string{"platform"}) + + platformHealth = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "dune_platform_volume_health", + Help: "1 if this platform returned volume data in the last Dune poll.", + }, []string{"platform"}) +) + +func init() { + prometheus.MustRegister(platformVolume, platformHealth) +} + +func publishRows(rows []duneRow) { + for _, r := range rows { + if r.Platform == "" { + continue + } + platformVolume.WithLabelValues(r.Platform).Set(r.VolumeUSD) + platformHealth.WithLabelValues(r.Platform).Set(1) + } +} + +func startMetricsServer(addr string) error { + mux := http.NewServeMux() + mux.Handle("/metrics", promhttp.Handler()) + mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("OK")) + }) + return http.ListenAndServe(addr, mux) +} diff --git a/harnesses/dune-platform-volume/go.mod b/harnesses/dune-platform-volume/go.mod new file mode 100644 index 00000000..342382f7 --- /dev/null +++ b/harnesses/dune-platform-volume/go.mod @@ -0,0 +1,18 @@ +module dune-platform-volume + +go 1.24.0 + +require github.com/prometheus/client_golang v1.23.2 + +require ( + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.66.1 // indirect + github.com/prometheus/procfs v0.16.1 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + golang.org/x/sys v0.35.0 // indirect + google.golang.org/protobuf v1.36.8 // indirect +) diff --git a/harnesses/dune-platform-volume/go.sum b/harnesses/dune-platform-volume/go.sum new file mode 100644 index 00000000..d6b8ca98 --- /dev/null +++ b/harnesses/dune-platform-volume/go.sum @@ -0,0 +1,46 @@ +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= +github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/src/app/trading-apps/page.tsx b/src/app/trading-apps/page.tsx index ea76cd87..ed66e625 100644 --- a/src/app/trading-apps/page.tsx +++ b/src/app/trading-apps/page.tsx @@ -27,17 +27,21 @@ const BENCH_SLUGS = [ "app-store-ratings", ] as const; -// pump.fun is tracked via byLaunchpad (bonding curve, no referral tag system). -// All other platforms are tracked via byPlatform (referral tags). Volume is -// not directly comparable across the two groups — tooltip discloses this. +// Volume source: Sacha's (adam_tehc) Dune community datasets (dataset_*_daily). +// Each platform is a separate dataset with cross-chain breakdown (blockchain col). +// pump.fun = pumpapp Solana + relay swaps, shown with proper attribution now. +// Terminal (slug: padre) = pump.fun's own trading app (formerly Padre, acq Apr 2025). +// BasedBot is a multi-chain bot (Robinhood node, BNB, Base, Solana, ETH, HyperEVM). const PLATFORMS = [ { slug: "pump-fun", name: "pump.fun" }, + { slug: "padre", name: "Terminal" }, { slug: "gmgn", name: "GMGN" }, { slug: "axiom", name: "Axiom" }, { slug: "fomo", name: "FOMO" }, { slug: "trojan", name: "Trojan" }, { slug: "photon", name: "Photon" }, { slug: "maestro", name: "Maestro" }, + { slug: "basedbot", name: "BasedBot" }, ] as const; const COLUMNS = [ @@ -46,7 +50,7 @@ const COLUMNS = [ label: "24h Volume", bench: "solana-trading-platform-wars", fmt: fmtUSD, - tip: "Mobula attribution. pump.fun = bonding-curve launchpad volume. All others = terminal routing volume via referral tag. Not directly comparable across the two groups.", + tip: "Cross-chain 24h volume from Sacha's (adam_tehc) Dune community datasets. Includes Solana + BNB + Base + Robinhood node + HyperEVM + Monad etc. pump.fun = pumpapp frontend only (not all bonding-curve). Terminal = pump.fun's own trading app (formerly Padre, acq. Apr 2025).", higherBetter: true, }, { @@ -420,9 +424,11 @@ export default async function TradingAppsHubPage() { Methodology
- Volume via Mobula lighthouse: pump.fun uses bonding-curve launchpad - attribution; terminals use referral-tag attribution — not directly - comparable across the two groups. Swap transaction counts from Dune + Volume from Sacha's (adam_tehc) Dune community datasets: cross-chain + totals per platform (Solana + BNB + Base + Robinhood node + HyperEVM + + Monad). pump.fun = pumpapp frontend + relay swaps only, not all + bonding-curve activity. Terminal = pump.fun's own app (formerly Padre, + acq. Apr 2025). Swap transaction counts from Dune Analytics (pump.fun: dex-level; terminals: fee-wallet detection). Average trade size = volume ÷ trade count, includes bots and MEV. Fee rate = on-chain fee revenue ÷ fee-paying volume (Dune tx join); From 8c9b49832549f910776d1c855bbe090cc9e075bc Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:40:10 +0200 Subject: [PATCH 2/3] feat: dune community datasets for all 4 trading-app bench metrics + padre/basedbot + clean refs --- benchmarks/memecoin-platforms.yml | 134 ++++++++++------- benchmarks/solana-avg-trade-size.yml | 137 ++++++++++-------- benchmarks/solana-trading-platform-wars.yml | 22 +-- benchmarks/solana-unique-traders.yml | 132 ++++++++++------- .../dune-platform-volume/cmd/script/dune.go | 70 ++++----- .../dune-platform-volume/cmd/script/main.go | 4 +- .../cmd/script/metrics.go | 39 ++++- src/app/trading-apps/page.tsx | 6 +- 8 files changed, 322 insertions(+), 222 deletions(-) diff --git a/benchmarks/memecoin-platforms.yml b/benchmarks/memecoin-platforms.yml index cb651588..49e4a060 100644 --- a/benchmarks/memecoin-platforms.yml +++ b/benchmarks/memecoin-platforms.yml @@ -66,7 +66,7 @@ source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/memecoi prometheus: window: 24h - freshness_metric: memecoin_platform_health + freshness_metric: dune_platform_fee_rate_pct faq: - q: "What is a take rate?" @@ -87,86 +87,112 @@ faq: providers: - slug: axiom name: Axiom - tag: "Solana trading terminal, 0.9% fee" - formula: "24h protocol fee revenue (Dune wallet inflows) / 24h fee-paying volume (Dune tx join). Fees: native SOL inflows to 20 known fee wallets. Fee-paying volume: largest swap in each fee-receiving tx from dex_solana.trades." + tag: "Trading terminal, 0.9% fee" + formula: "24h fee rate % (fees_usd / volume_usd * 100) from Dune community datasets (dataset_axiom_daily, cross-chain), latest complete day." queries: - p50: memecoin_platform_fee_paying_rate_pct{platform="axiom"} - p90: memecoin_platform_fee_paying_rate_pct{platform="axiom"} - p99: memecoin_platform_fee_paying_rate_pct{platform="axiom"} - mean: memecoin_platform_fee_paying_rate_pct{platform="axiom"} - success: memecoin_platform_health - sample_size: memecoin_platform_fees_usd_24h{platform="axiom"} - series: memecoin_platform_fee_paying_rate_pct{platform="axiom"} + p50: dune_platform_fee_rate_pct{platform="axiom"} + p90: dune_platform_fee_rate_pct{platform="axiom"} + p99: dune_platform_fee_rate_pct{platform="axiom"} + mean: dune_platform_fee_rate_pct{platform="axiom"} + success: dune_platform_volume_health{platform="axiom"} + sample_size: dune_platform_fees_24h_usd{platform="axiom"} + series: dune_platform_fee_rate_pct{platform="axiom"} - slug: fomo name: Fomo - tag: "Solana mobile trading app" - formula: "24h protocol fee revenue (DeFiLlama Solana) / 24h volume (Mobula lighthouse). Fomo fees include on-chain USDC + off-chain relay fees via DeFiLlama; fee-paying volume not available for Fomo." + tag: "Solana trading platform" + formula: "24h fee rate % (fees_usd / volume_usd * 100) from Dune community datasets (dataset_fomo_sol_daily, Solana), latest complete day." queries: - p50: memecoin_platform_fee_rate_pct{platform="fomo"} - p90: memecoin_platform_fee_rate_pct{platform="fomo"} - p99: memecoin_platform_fee_rate_pct{platform="fomo"} - mean: memecoin_platform_fee_rate_pct{platform="fomo"} - success: memecoin_platform_health - sample_size: memecoin_platform_fees_usd_24h{platform="fomo"} - series: memecoin_platform_fee_rate_pct{platform="fomo"} + p50: dune_platform_fee_rate_pct{platform="fomo"} + p90: dune_platform_fee_rate_pct{platform="fomo"} + p99: dune_platform_fee_rate_pct{platform="fomo"} + mean: dune_platform_fee_rate_pct{platform="fomo"} + success: dune_platform_volume_health{platform="fomo"} + sample_size: dune_platform_fees_24h_usd{platform="fomo"} + series: dune_platform_fee_rate_pct{platform="fomo"} - slug: pump-fun name: pump.fun - tag: "Solana meme launchpad + PumpSwap AMM" - formula: "24h protocol fee revenue (Dune wallet inflows) / 24h fee-paying volume (Dune tx join). Captures protocol share (0.95%) on bonding curve and PumpSwap trades; creator and LP shares excluded." + tag: "Solana meme launchpad + relay, 0% fee since Aug 2026" + formula: "24h fee rate % (fees_usd / volume_usd * 100) from Dune community datasets (dataset_pumpapp_sol_daily + dataset_pumpfun_relay_daily), latest complete day. fees=0 since fee cut Aug 2026." queries: - p50: memecoin_platform_fee_paying_rate_pct{platform="pump-fun"} - p90: memecoin_platform_fee_paying_rate_pct{platform="pump-fun"} - p99: memecoin_platform_fee_paying_rate_pct{platform="pump-fun"} - mean: memecoin_platform_fee_paying_rate_pct{platform="pump-fun"} - success: memecoin_platform_health - sample_size: memecoin_platform_fees_usd_24h{platform="pump-fun"} - series: memecoin_platform_fee_paying_rate_pct{platform="pump-fun"} + p50: dune_platform_fee_rate_pct{platform="pump-fun"} + p90: dune_platform_fee_rate_pct{platform="pump-fun"} + p99: dune_platform_fee_rate_pct{platform="pump-fun"} + mean: dune_platform_fee_rate_pct{platform="pump-fun"} + success: dune_platform_volume_health{platform="pump-fun"} + sample_size: dune_platform_fees_24h_usd{platform="pump-fun"} + series: dune_platform_fee_rate_pct{platform="pump-fun"} - slug: gmgn name: GMGN - tag: "Solana AI trading terminal, 1% fee" - formula: "24h Solana protocol fee revenue (Dune, 9 wallet addresses) / 24h fee-paying volume (Dune tx join). Total revenue across all chains is ~5x higher per DeFiLlama." + tag: "AI trading terminal, ~1% fee, multi-chain" + formula: "24h fee rate % (fees_usd / volume_usd * 100) from Dune community datasets (dataset_gmgn_daily, cross-chain), latest complete day." queries: - p50: memecoin_platform_fee_paying_rate_pct{platform="gmgn"} - p90: memecoin_platform_fee_paying_rate_pct{platform="gmgn"} - p99: memecoin_platform_fee_paying_rate_pct{platform="gmgn"} - mean: memecoin_platform_fee_paying_rate_pct{platform="gmgn"} - success: memecoin_platform_health - sample_size: memecoin_platform_fees_usd_24h{platform="gmgn"} - series: memecoin_platform_fee_paying_rate_pct{platform="gmgn"} + p50: dune_platform_fee_rate_pct{platform="gmgn"} + p90: dune_platform_fee_rate_pct{platform="gmgn"} + p99: dune_platform_fee_rate_pct{platform="gmgn"} + mean: dune_platform_fee_rate_pct{platform="gmgn"} + success: dune_platform_volume_health{platform="gmgn"} + sample_size: dune_platform_fees_24h_usd{platform="gmgn"} + series: dune_platform_fee_rate_pct{platform="gmgn"} - slug: photon name: Photon tag: "Solana trading terminal, ~1% fee" - formula: "24h protocol fee revenue (Dune wallet inflows) / 24h fee-paying volume (Dune tx join)." + formula: "24h fee rate % (fees_usd / volume_usd * 100) from Dune community datasets (dataset_photon_daily), latest complete day." queries: - p50: memecoin_platform_fee_paying_rate_pct{platform="photon"} - p90: memecoin_platform_fee_paying_rate_pct{platform="photon"} - p99: memecoin_platform_fee_paying_rate_pct{platform="photon"} - mean: memecoin_platform_fee_paying_rate_pct{platform="photon"} - success: memecoin_platform_health - sample_size: memecoin_platform_fees_usd_24h{platform="photon"} - series: memecoin_platform_fee_paying_rate_pct{platform="photon"} + p50: dune_platform_fee_rate_pct{platform="photon"} + p90: dune_platform_fee_rate_pct{platform="photon"} + p99: dune_platform_fee_rate_pct{platform="photon"} + mean: dune_platform_fee_rate_pct{platform="photon"} + success: dune_platform_volume_health{platform="photon"} + sample_size: dune_platform_fees_24h_usd{platform="photon"} + series: dune_platform_fee_rate_pct{platform="photon"} - slug: trojan name: Trojan tag: "Solana Telegram bot, ~0.9% fee" - formula: "24h protocol fee revenue (Dune wallet inflows) / 24h fee-paying volume (Dune tx join). Fee is collected in the swap transaction; DeFiLlama Solana match within 6% confirms capture." + formula: "24h fee rate % (fees_usd / volume_usd * 100) from Dune community datasets (dataset_trojan_daily), latest complete day." queries: - p50: memecoin_platform_fee_paying_rate_pct{platform="trojan"} - p90: memecoin_platform_fee_paying_rate_pct{platform="trojan"} - p99: memecoin_platform_fee_paying_rate_pct{platform="trojan"} - mean: memecoin_platform_fee_paying_rate_pct{platform="trojan"} - success: memecoin_platform_health - sample_size: memecoin_platform_fees_usd_24h{platform="trojan"} - series: memecoin_platform_fee_paying_rate_pct{platform="trojan"} + p50: dune_platform_fee_rate_pct{platform="trojan"} + p90: dune_platform_fee_rate_pct{platform="trojan"} + p99: dune_platform_fee_rate_pct{platform="trojan"} + mean: dune_platform_fee_rate_pct{platform="trojan"} + success: dune_platform_volume_health{platform="trojan"} + sample_size: dune_platform_fees_24h_usd{platform="trojan"} + series: dune_platform_fee_rate_pct{platform="trojan"} + + - slug: padre + name: Terminal + tag: "pump.fun's own trading app (formerly Padre)" + formula: "24h fee rate % (fees_usd / volume_usd * 100) from Dune community datasets (dataset_terminal_daily, cross-chain), latest complete day." + queries: + p50: dune_platform_fee_rate_pct{platform="padre"} + p90: dune_platform_fee_rate_pct{platform="padre"} + p99: dune_platform_fee_rate_pct{platform="padre"} + mean: dune_platform_fee_rate_pct{platform="padre"} + success: dune_platform_volume_health{platform="padre"} + sample_size: dune_platform_fees_24h_usd{platform="padre"} + series: dune_platform_fee_rate_pct{platform="padre"} + + - slug: basedbot + name: BasedBot + tag: "Multi-chain trading bot" + formula: "24h fee rate % (fees_usd / volume_usd * 100) from Dune community datasets (dataset_basedbot_daily, cross-chain), latest complete day." + queries: + p50: dune_platform_fee_rate_pct{platform="basedbot"} + p90: dune_platform_fee_rate_pct{platform="basedbot"} + p99: dune_platform_fee_rate_pct{platform="basedbot"} + mean: dune_platform_fee_rate_pct{platform="basedbot"} + success: dune_platform_volume_health{platform="basedbot"} + sample_size: dune_platform_fees_24h_usd{platform="basedbot"} + series: dune_platform_fee_rate_pct{platform="basedbot"} - slug: maestro name: Maestro tag: "Solana Telegram bot, ~1% fee" - formula: "24h protocol fee revenue (Dune wallet inflows) / 24h fee-paying volume (Dune tx join)." + formula: "24h protocol fee revenue (Dune wallet inflows) / 24h fee-paying volume (Dune tx join). No community dataset available; sourced from on-chain fee wallet detection." queries: p50: memecoin_platform_fee_paying_rate_pct{platform="maestro"} p90: memecoin_platform_fee_paying_rate_pct{platform="maestro"} diff --git a/benchmarks/solana-avg-trade-size.yml b/benchmarks/solana-avg-trade-size.yml index 34e320e1..75a66258 100644 --- a/benchmarks/solana-avg-trade-size.yml +++ b/benchmarks/solana-avg-trade-size.yml @@ -54,7 +54,7 @@ source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/solana- prometheus: window: 24h - freshness_metric: solana_platform_trades_24h + freshness_metric: dune_platform_avg_trade_usd faq: - q: "What does average swap size measure?" @@ -69,42 +69,42 @@ faq: providers: - slug: pump-fun name: pump.fun - tag: "Solana meme launchpad" - formula: "Average swap size in USD on pump.fun's bonding curve (solana_platform_volume_24h_usd{platform=pump-fun} / solana_platform_trades_24h{platform=pump-fun}, Mobula lighthouse byLaunchpad, 15 min poll)." + tag: "Solana meme launchpad + relay" + formula: "Average swap size in USD (volume_usd / txns) from Dune community datasets (dataset_pumpapp_sol_daily + dataset_pumpfun_relay_daily), latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="pump-fun"} / solana_platform_trades_24h{platform="pump-fun"} - p90: solana_platform_volume_24h_usd{platform="pump-fun"} / solana_platform_trades_24h{platform="pump-fun"} - p99: solana_platform_volume_24h_usd{platform="pump-fun"} / solana_platform_trades_24h{platform="pump-fun"} - mean: solana_platform_volume_24h_usd{platform="pump-fun"} / solana_platform_trades_24h{platform="pump-fun"} - success: solana_platform_health{platform="pump-fun"} - sample_size: solana_platform_trades_24h{platform="pump-fun"} - series: solana_platform_volume_24h_usd{platform="pump-fun"} / solana_platform_trades_24h{platform="pump-fun"} + p50: dune_platform_avg_trade_usd{platform="pump-fun"} + p90: dune_platform_avg_trade_usd{platform="pump-fun"} + p99: dune_platform_avg_trade_usd{platform="pump-fun"} + mean: dune_platform_avg_trade_usd{platform="pump-fun"} + success: dune_platform_volume_health{platform="pump-fun"} + sample_size: dune_platform_txns_24h{platform="pump-fun"} + series: dune_platform_avg_trade_usd{platform="pump-fun"} - slug: gmgn name: GMGN - tag: "AI trading terminal on Solana" - formula: "Average swap size in USD routed through GMGN (Mobula lighthouse byPlatform, 15 min poll)." + tag: "AI trading terminal, multi-chain" + formula: "Average swap size in USD (volume_usd / txns) from Dune community datasets (dataset_gmgn_daily, cross-chain), latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="gmgn"} / solana_platform_trades_24h{platform="gmgn"} - p90: solana_platform_volume_24h_usd{platform="gmgn"} / solana_platform_trades_24h{platform="gmgn"} - p99: solana_platform_volume_24h_usd{platform="gmgn"} / solana_platform_trades_24h{platform="gmgn"} - mean: solana_platform_volume_24h_usd{platform="gmgn"} / solana_platform_trades_24h{platform="gmgn"} - success: solana_platform_health{platform="gmgn"} - sample_size: solana_platform_trades_24h{platform="gmgn"} - series: solana_platform_volume_24h_usd{platform="gmgn"} / solana_platform_trades_24h{platform="gmgn"} + p50: dune_platform_avg_trade_usd{platform="gmgn"} + p90: dune_platform_avg_trade_usd{platform="gmgn"} + p99: dune_platform_avg_trade_usd{platform="gmgn"} + mean: dune_platform_avg_trade_usd{platform="gmgn"} + success: dune_platform_volume_health{platform="gmgn"} + sample_size: dune_platform_txns_24h{platform="gmgn"} + series: dune_platform_avg_trade_usd{platform="gmgn"} - slug: trojan name: Trojan tag: "Telegram trading bot on Solana" - formula: "Average swap size in USD routed through Trojan (Mobula lighthouse byPlatform, 15 min poll)." + formula: "Average swap size in USD (volume_usd / txns) from Dune community datasets (dataset_trojan_daily), latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="trojan"} / solana_platform_trades_24h{platform="trojan"} - p90: solana_platform_volume_24h_usd{platform="trojan"} / solana_platform_trades_24h{platform="trojan"} - p99: solana_platform_volume_24h_usd{platform="trojan"} / solana_platform_trades_24h{platform="trojan"} - mean: solana_platform_volume_24h_usd{platform="trojan"} / solana_platform_trades_24h{platform="trojan"} - success: solana_platform_health{platform="trojan"} - sample_size: solana_platform_trades_24h{platform="trojan"} - series: solana_platform_volume_24h_usd{platform="trojan"} / solana_platform_trades_24h{platform="trojan"} + p50: dune_platform_avg_trade_usd{platform="trojan"} + p90: dune_platform_avg_trade_usd{platform="trojan"} + p99: dune_platform_avg_trade_usd{platform="trojan"} + mean: dune_platform_avg_trade_usd{platform="trojan"} + success: dune_platform_volume_health{platform="trojan"} + sample_size: dune_platform_txns_24h{platform="trojan"} + series: dune_platform_avg_trade_usd{platform="trojan"} - slug: maestro name: Maestro @@ -122,54 +122,67 @@ providers: - slug: fomo name: Fomo tag: "Solana trading platform" - formula: "Average swap size in USD routed through Fomo (Mobula lighthouse byPlatform, 15 min poll)." + formula: "Average swap size in USD (volume_usd / txns) from Dune community datasets (dataset_fomo_sol_daily, Solana), latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="fomo"} / solana_platform_trades_24h{platform="fomo"} - p90: solana_platform_volume_24h_usd{platform="fomo"} / solana_platform_trades_24h{platform="fomo"} - p99: solana_platform_volume_24h_usd{platform="fomo"} / solana_platform_trades_24h{platform="fomo"} - mean: solana_platform_volume_24h_usd{platform="fomo"} / solana_platform_trades_24h{platform="fomo"} - success: solana_platform_health{platform="fomo"} - sample_size: solana_platform_trades_24h{platform="fomo"} - series: solana_platform_volume_24h_usd{platform="fomo"} / solana_platform_trades_24h{platform="fomo"} + p50: dune_platform_avg_trade_usd{platform="fomo"} + p90: dune_platform_avg_trade_usd{platform="fomo"} + p99: dune_platform_avg_trade_usd{platform="fomo"} + mean: dune_platform_avg_trade_usd{platform="fomo"} + success: dune_platform_volume_health{platform="fomo"} + sample_size: dune_platform_txns_24h{platform="fomo"} + series: dune_platform_avg_trade_usd{platform="fomo"} - slug: axiom name: Axiom - tag: "Web trading terminal on Solana" - formula: "Average swap size in USD routed through Axiom (Mobula lighthouse byPlatform, 15 min poll)." + tag: "Web trading terminal, multi-chain" + formula: "Average swap size in USD (volume_usd / txns) from Dune community datasets (dataset_axiom_daily, cross-chain), latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="axiom"} / solana_platform_trades_24h{platform="axiom"} - p90: solana_platform_volume_24h_usd{platform="axiom"} / solana_platform_trades_24h{platform="axiom"} - p99: solana_platform_volume_24h_usd{platform="axiom"} / solana_platform_trades_24h{platform="axiom"} - mean: solana_platform_volume_24h_usd{platform="axiom"} / solana_platform_trades_24h{platform="axiom"} - success: solana_platform_health{platform="axiom"} - sample_size: solana_platform_trades_24h{platform="axiom"} - series: solana_platform_volume_24h_usd{platform="axiom"} / solana_platform_trades_24h{platform="axiom"} + p50: dune_platform_avg_trade_usd{platform="axiom"} + p90: dune_platform_avg_trade_usd{platform="axiom"} + p99: dune_platform_avg_trade_usd{platform="axiom"} + mean: dune_platform_avg_trade_usd{platform="axiom"} + success: dune_platform_volume_health{platform="axiom"} + sample_size: dune_platform_txns_24h{platform="axiom"} + series: dune_platform_avg_trade_usd{platform="axiom"} - slug: photon name: Photon tag: "Solana trading terminal" - formula: "Average swap size in USD routed through Photon (Mobula lighthouse byPlatform, 15 min poll)." + formula: "Average swap size in USD (volume_usd / txns) from Dune community datasets (dataset_photon_daily), latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="photon"} / solana_platform_trades_24h{platform="photon"} - p90: solana_platform_volume_24h_usd{platform="photon"} / solana_platform_trades_24h{platform="photon"} - p99: solana_platform_volume_24h_usd{platform="photon"} / solana_platform_trades_24h{platform="photon"} - mean: solana_platform_volume_24h_usd{platform="photon"} / solana_platform_trades_24h{platform="photon"} - success: solana_platform_health{platform="photon"} - sample_size: solana_platform_trades_24h{platform="photon"} - series: solana_platform_volume_24h_usd{platform="photon"} / solana_platform_trades_24h{platform="photon"} + p50: dune_platform_avg_trade_usd{platform="photon"} + p90: dune_platform_avg_trade_usd{platform="photon"} + p99: dune_platform_avg_trade_usd{platform="photon"} + mean: dune_platform_avg_trade_usd{platform="photon"} + success: dune_platform_volume_health{platform="photon"} + sample_size: dune_platform_txns_24h{platform="photon"} + series: dune_platform_avg_trade_usd{platform="photon"} - slug: padre - name: Padre - tag: "AI Telegram bot on Solana" - formula: "Average swap size in USD routed through Padre (Mobula lighthouse byPlatform, 15 min poll)." + name: Terminal + tag: "pump.fun's own trading app (formerly Padre)" + formula: "Average swap size in USD (volume_usd / txns) from Dune community datasets (dataset_terminal_daily, cross-chain), latest complete day." queries: - p50: solana_platform_volume_24h_usd{platform="padre"} / solana_platform_trades_24h{platform="padre"} - p90: solana_platform_volume_24h_usd{platform="padre"} / solana_platform_trades_24h{platform="padre"} - p99: solana_platform_volume_24h_usd{platform="padre"} / solana_platform_trades_24h{platform="padre"} - mean: solana_platform_volume_24h_usd{platform="padre"} / solana_platform_trades_24h{platform="padre"} - success: solana_platform_health{platform="padre"} - sample_size: solana_platform_trades_24h{platform="padre"} - series: solana_platform_volume_24h_usd{platform="padre"} / solana_platform_trades_24h{platform="padre"} + p50: dune_platform_avg_trade_usd{platform="padre"} + p90: dune_platform_avg_trade_usd{platform="padre"} + p99: dune_platform_avg_trade_usd{platform="padre"} + mean: dune_platform_avg_trade_usd{platform="padre"} + success: dune_platform_volume_health{platform="padre"} + sample_size: dune_platform_txns_24h{platform="padre"} + series: dune_platform_avg_trade_usd{platform="padre"} + + - slug: basedbot + name: BasedBot + tag: "Multi-chain trading bot" + formula: "Average swap size in USD (volume_usd / txns) from Dune community datasets (dataset_basedbot_daily, cross-chain), latest complete day." + queries: + p50: dune_platform_avg_trade_usd{platform="basedbot"} + p90: dune_platform_avg_trade_usd{platform="basedbot"} + p99: dune_platform_avg_trade_usd{platform="basedbot"} + mean: dune_platform_avg_trade_usd{platform="basedbot"} + success: dune_platform_volume_health{platform="basedbot"} + sample_size: dune_platform_txns_24h{platform="basedbot"} + series: dune_platform_avg_trade_usd{platform="basedbot"} - slug: phantom name: Phantom diff --git a/benchmarks/solana-trading-platform-wars.yml b/benchmarks/solana-trading-platform-wars.yml index 1ea97b67..6e22c459 100644 --- a/benchmarks/solana-trading-platform-wars.yml +++ b/benchmarks/solana-trading-platform-wars.yml @@ -5,7 +5,7 @@ number: "201" title: "Trading platform leaderboard: GMGN vs Axiom vs Fomo vs pump.fun, live 24h volume" seo_title: "Trading platform comparison 2026: GMGN, Axiom, Fomo, pump.fun, Trojan, Terminal" seo_description: "{{best_name}} leads trading platforms at ${{best_p50}} 24h volume. GMGN vs Axiom vs Fomo vs Trojan vs Terminal vs BasedBot ranked live from Dune community datasets." -subtitle: Live 24-hour trading volume per platform and Telegram bot, cross-chain (Solana + BNB + Base + Robinhood node + HyperEVM + Monad). Sourced from Sacha's Dune community datasets, refreshed every 4 hours. +subtitle: Live 24-hour trading volume per platform and Telegram bot, cross-chain (Solana + BNB + Base + Robinhood node + HyperEVM + Monad). Sourced from Dune community datasets, refreshed every 4 hours. category: Trading status: live @@ -14,7 +14,7 @@ unit: usd higher_is_better: true disclaimer: | - Volume figures are sourced from Sacha's (adam_tehc) Dune community datasets, which aggregate cross-chain trading activity per platform (Solana, BNB Chain, Base, Robinhood node, HyperEVM, Monad, and more). Data is refreshed every 4 hours. pump.fun volume = bonding-curve Solana swaps (dataset_pumpapp_sol_daily) + cross-chain relay swaps (dataset_pumpfun_relay_daily). Fomo = Solana only (dataset_fomo_sol_daily). All others sum across all blockchains. + Volume figures are sourced from Dune community datasets, which aggregate cross-chain trading activity per platform (Solana, BNB Chain, Base, Robinhood node, HyperEVM, Monad, and more). Data is refreshed every 4 hours. pump.fun volume = bonding-curve Solana swaps (dataset_pumpapp_sol_daily) + cross-chain relay swaps (dataset_pumpfun_relay_daily). Fomo = Solana only (dataset_fomo_sol_daily). All others sum across all blockchains. seo_intro: | Solana's trading frontend market is a contested race between GMGN, Axiom and @@ -42,11 +42,11 @@ abstract: | trading platforms as providers. methodology: - - "Source: Sacha's (adam_tehc) Dune community datasets (dune.adam_tehc_co.dataset_*_daily). Each dataset covers one trading platform across all blockchains it operates on." + - "Source: Dune community datasets (dataset_*_daily). Each dataset covers one trading platform across all blockchains it operates on." - "Poll cadence: harness queries Dune every 4 hours and updates Prometheus gauges. Prometheus scrapes :2112/metrics every 60 seconds." - "Volume: sum of volume_usd across all blockchains for the most recent complete day in each platform's dataset. Higher = more total user activity." - "pump.fun: dataset_pumpapp_sol_daily (Solana bonding-curve) + dataset_pumpfun_relay_daily filtered to req_class='swap'. pump.fun cut fees to 0% in Aug 2026; volume is for their own frontend only (pumpapp), not all bonding-curve activity." - - "fomo: dataset_fomo_sol_daily (Solana only). Includes Fomo's relay cross-chain volume when Sacha incorporates it." + - "fomo: dataset_fomo_sol_daily (Solana only)." - "BasedBot: multi-chain bot (Robinhood node, BNB, Base, Solana, ETH, HyperEVM, Avalanche)." findings: @@ -82,7 +82,7 @@ providers: - slug: gmgn name: GMGN tag: "AI trading terminal, multi-chain" - formula: "24h cross-chain volume in USD (Solana + BNB + Robinhood node + Base + ETH + more) from dune.adam_tehc_co.dataset_gmgn_daily, latest complete day." + formula: "24h cross-chain volume in USD (Solana + BNB + Robinhood node + Base + ETH + more) from Dune community datasets (dataset_gmgn_daily), latest complete day." queries: p50: dune_platform_volume_24h_usd{platform="gmgn"} p90: dune_platform_volume_24h_usd{platform="gmgn"} @@ -95,7 +95,7 @@ providers: - slug: axiom name: Axiom tag: "Web trading terminal, multi-chain" - formula: "24h cross-chain volume in USD (Solana + Robinhood node + BNB + ETH) from dune.adam_tehc_co.dataset_axiom_daily, latest complete day." + formula: "24h cross-chain volume in USD (Solana + Robinhood node + BNB + ETH) from Dune community datasets (dataset_axiom_daily), latest complete day." queries: p50: dune_platform_volume_24h_usd{platform="axiom"} p90: dune_platform_volume_24h_usd{platform="axiom"} @@ -108,7 +108,7 @@ providers: - slug: fomo name: Fomo tag: "Solana trading platform" - formula: "24h Solana volume in USD from dune.adam_tehc_co.dataset_fomo_sol_daily, latest complete day." + formula: "24h Solana volume in USD from Dune community datasets (dataset_fomo_sol_daily), latest complete day." queries: p50: dune_platform_volume_24h_usd{platform="fomo"} p90: dune_platform_volume_24h_usd{platform="fomo"} @@ -121,7 +121,7 @@ providers: - slug: basedbot name: BasedBot tag: "Multi-chain trading bot" - formula: "24h cross-chain volume in USD (Robinhood node + BNB + Base + Solana + ETH + HyperEVM) from dune.adam_tehc_co.dataset_basedbot_daily, latest complete day." + formula: "24h cross-chain volume in USD (Robinhood node + BNB + Base + Solana + ETH + HyperEVM) from Dune community datasets (dataset_basedbot_daily), latest complete day." queries: p50: dune_platform_volume_24h_usd{platform="basedbot"} p90: dune_platform_volume_24h_usd{platform="basedbot"} @@ -147,7 +147,7 @@ providers: - slug: padre name: Terminal tag: "pump.fun's own trading app (formerly Padre, acquired Apr 2025)" - formula: "24h cross-chain volume in USD (Solana + Robinhood node + Base + BNB) from dune.adam_tehc_co.dataset_terminal_daily, latest complete day." + formula: "24h cross-chain volume in USD (Solana + Robinhood node + Base + BNB) from Dune community datasets (dataset_terminal_daily), latest complete day." queries: p50: dune_platform_volume_24h_usd{platform="padre"} p90: dune_platform_volume_24h_usd{platform="padre"} @@ -160,7 +160,7 @@ providers: - slug: trojan name: Trojan tag: "Telegram trading bot on Solana" - formula: "24h Solana volume in USD from dune.adam_tehc_co.dataset_trojan_daily, latest complete day." + formula: "24h Solana volume in USD from Dune community datasets (dataset_trojan_daily), latest complete day." queries: p50: dune_platform_volume_24h_usd{platform="trojan"} p90: dune_platform_volume_24h_usd{platform="trojan"} @@ -173,7 +173,7 @@ providers: - slug: photon name: Photon tag: "Solana trading terminal" - formula: "24h Solana volume in USD from dune.adam_tehc_co.dataset_photon_daily, latest complete day." + formula: "24h Solana volume in USD from Dune community datasets (dataset_photon_daily), latest complete day." queries: p50: dune_platform_volume_24h_usd{platform="photon"} p90: dune_platform_volume_24h_usd{platform="photon"} diff --git a/benchmarks/solana-unique-traders.yml b/benchmarks/solana-unique-traders.yml index bac5ac41..943af494 100644 --- a/benchmarks/solana-unique-traders.yml +++ b/benchmarks/solana-unique-traders.yml @@ -60,7 +60,7 @@ source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/solana- prometheus: window: 24h - freshness_metric: solana_platform_unique_traders_24h + freshness_metric: dune_platform_txns_24h faq: - q: "What does unique daily swap transactions measure?" @@ -79,81 +79,107 @@ faq: providers: - slug: pump-fun name: pump.fun - tag: "Solana meme launchpad" - formula: "Unique tx_ids from dex_solana.trades WHERE project IN ('pumpdotfun','pumpswap') in the last 24h (Dune Spellbook, hourly). Covers bonding-curve swaps and graduated PumpSwap AMM." + tag: "Solana meme launchpad + relay" + formula: "Daily swap tx count from Dune community datasets (dataset_pumpapp_sol_daily + dataset_pumpfun_relay_daily, req_class=swap), latest complete day." queries: - p50: solana_platform_unique_traders_24h{platform="pump-fun"} - p90: solana_platform_unique_traders_24h{platform="pump-fun"} - p99: solana_platform_unique_traders_24h{platform="pump-fun"} - mean: solana_platform_unique_traders_24h{platform="pump-fun"} - success: solana_platform_trader_health{platform="pump-fun"} - sample_size: solana_platform_unique_traders_24h{platform="pump-fun"} - series: solana_platform_unique_traders_24h{platform="pump-fun"} + p50: dune_platform_txns_24h{platform="pump-fun"} + p90: dune_platform_txns_24h{platform="pump-fun"} + p99: dune_platform_txns_24h{platform="pump-fun"} + mean: dune_platform_txns_24h{platform="pump-fun"} + success: dune_platform_volume_health{platform="pump-fun"} + sample_size: dune_platform_txns_24h{platform="pump-fun"} + series: dune_platform_txns_24h{platform="pump-fun"} - slug: gmgn name: GMGN - tag: "AI trading terminal on Solana" - formula: "Unique tx_ids where GMGN fee wallets received SOL or USDC/WSOL inflow in the last 24h (Dune: solana.account_activity, hourly refresh)." + tag: "AI trading terminal, multi-chain" + formula: "Daily swap tx count from Dune community datasets (dataset_gmgn_daily, cross-chain), latest complete day." queries: - p50: solana_platform_unique_traders_24h{platform="gmgn"} - p90: solana_platform_unique_traders_24h{platform="gmgn"} - p99: solana_platform_unique_traders_24h{platform="gmgn"} - mean: solana_platform_unique_traders_24h{platform="gmgn"} - success: solana_platform_trader_health{platform="gmgn"} - sample_size: solana_platform_unique_traders_24h{platform="gmgn"} - series: solana_platform_unique_traders_24h{platform="gmgn"} + p50: dune_platform_txns_24h{platform="gmgn"} + p90: dune_platform_txns_24h{platform="gmgn"} + p99: dune_platform_txns_24h{platform="gmgn"} + mean: dune_platform_txns_24h{platform="gmgn"} + success: dune_platform_volume_health{platform="gmgn"} + sample_size: dune_platform_txns_24h{platform="gmgn"} + series: dune_platform_txns_24h{platform="gmgn"} - slug: axiom name: Axiom - tag: "Web trading terminal on Solana" - formula: "Unique tx_ids where Axiom fee wallets received SOL inflow in the last 24h (Dune: solana.account_activity, hourly refresh)." + tag: "Web trading terminal, multi-chain" + formula: "Daily swap tx count from Dune community datasets (dataset_axiom_daily, cross-chain), latest complete day." queries: - p50: solana_platform_unique_traders_24h{platform="axiom"} - p90: solana_platform_unique_traders_24h{platform="axiom"} - p99: solana_platform_unique_traders_24h{platform="axiom"} - mean: solana_platform_unique_traders_24h{platform="axiom"} - success: solana_platform_trader_health{platform="axiom"} - sample_size: solana_platform_unique_traders_24h{platform="axiom"} - series: solana_platform_unique_traders_24h{platform="axiom"} + p50: dune_platform_txns_24h{platform="axiom"} + p90: dune_platform_txns_24h{platform="axiom"} + p99: dune_platform_txns_24h{platform="axiom"} + mean: dune_platform_txns_24h{platform="axiom"} + success: dune_platform_volume_health{platform="axiom"} + sample_size: dune_platform_txns_24h{platform="axiom"} + series: dune_platform_txns_24h{platform="axiom"} - slug: fomo name: Fomo - tag: "Solana mobile trading app" - formula: "Unique tx_ids where Fomo's fee wallet (token_balance_owner match) received USDC inflow in the last 24h (Dune: solana.account_activity, hourly). On-chain Jupiter referral fees only." + tag: "Solana trading platform" + formula: "Daily swap tx count from Dune community datasets (dataset_fomo_sol_daily, Solana), latest complete day." queries: - p50: solana_platform_unique_traders_24h{platform="fomo"} - p90: solana_platform_unique_traders_24h{platform="fomo"} - p99: solana_platform_unique_traders_24h{platform="fomo"} - mean: solana_platform_unique_traders_24h{platform="fomo"} - success: solana_platform_trader_health{platform="fomo"} - sample_size: solana_platform_unique_traders_24h{platform="fomo"} - series: solana_platform_unique_traders_24h{platform="fomo"} + p50: dune_platform_txns_24h{platform="fomo"} + p90: dune_platform_txns_24h{platform="fomo"} + p99: dune_platform_txns_24h{platform="fomo"} + mean: dune_platform_txns_24h{platform="fomo"} + success: dune_platform_volume_health{platform="fomo"} + sample_size: dune_platform_txns_24h{platform="fomo"} + series: dune_platform_txns_24h{platform="fomo"} - slug: trojan name: Trojan tag: "Telegram trading bot on Solana" - formula: "Unique tx_ids where Trojan fee wallets received SOL inflow in the last 24h (Dune: solana.account_activity, hourly refresh)." + formula: "Daily swap tx count from Dune community datasets (dataset_trojan_daily, Solana), latest complete day." queries: - p50: solana_platform_unique_traders_24h{platform="trojan"} - p90: solana_platform_unique_traders_24h{platform="trojan"} - p99: solana_platform_unique_traders_24h{platform="trojan"} - mean: solana_platform_unique_traders_24h{platform="trojan"} - success: solana_platform_trader_health{platform="trojan"} - sample_size: solana_platform_unique_traders_24h{platform="trojan"} - series: solana_platform_unique_traders_24h{platform="trojan"} + p50: dune_platform_txns_24h{platform="trojan"} + p90: dune_platform_txns_24h{platform="trojan"} + p99: dune_platform_txns_24h{platform="trojan"} + mean: dune_platform_txns_24h{platform="trojan"} + success: dune_platform_volume_health{platform="trojan"} + sample_size: dune_platform_txns_24h{platform="trojan"} + series: dune_platform_txns_24h{platform="trojan"} - slug: photon name: Photon tag: "Solana trading terminal" - formula: "Unique tx_ids where Photon fee wallet received SOL inflow in the last 24h (Dune: solana.account_activity, hourly refresh)." + formula: "Daily swap tx count from Dune community datasets (dataset_photon_daily, Solana), latest complete day." queries: - p50: solana_platform_unique_traders_24h{platform="photon"} - p90: solana_platform_unique_traders_24h{platform="photon"} - p99: solana_platform_unique_traders_24h{platform="photon"} - mean: solana_platform_unique_traders_24h{platform="photon"} - success: solana_platform_trader_health{platform="photon"} - sample_size: solana_platform_unique_traders_24h{platform="photon"} - series: solana_platform_unique_traders_24h{platform="photon"} + p50: dune_platform_txns_24h{platform="photon"} + p90: dune_platform_txns_24h{platform="photon"} + p99: dune_platform_txns_24h{platform="photon"} + mean: dune_platform_txns_24h{platform="photon"} + success: dune_platform_volume_health{platform="photon"} + sample_size: dune_platform_txns_24h{platform="photon"} + series: dune_platform_txns_24h{platform="photon"} + + - slug: padre + name: Terminal + tag: "pump.fun's own trading app (formerly Padre)" + formula: "Daily swap tx count from Dune community datasets (dataset_terminal_daily, cross-chain), latest complete day." + queries: + p50: dune_platform_txns_24h{platform="padre"} + p90: dune_platform_txns_24h{platform="padre"} + p99: dune_platform_txns_24h{platform="padre"} + mean: dune_platform_txns_24h{platform="padre"} + success: dune_platform_volume_health{platform="padre"} + sample_size: dune_platform_txns_24h{platform="padre"} + series: dune_platform_txns_24h{platform="padre"} + + - slug: basedbot + name: BasedBot + tag: "Multi-chain trading bot" + formula: "Daily swap tx count from Dune community datasets (dataset_basedbot_daily, cross-chain), latest complete day." + queries: + p50: dune_platform_txns_24h{platform="basedbot"} + p90: dune_platform_txns_24h{platform="basedbot"} + p99: dune_platform_txns_24h{platform="basedbot"} + mean: dune_platform_txns_24h{platform="basedbot"} + success: dune_platform_volume_health{platform="basedbot"} + sample_size: dune_platform_txns_24h{platform="basedbot"} + series: dune_platform_txns_24h{platform="basedbot"} - slug: maestro name: Maestro diff --git a/harnesses/dune-platform-volume/cmd/script/dune.go b/harnesses/dune-platform-volume/cmd/script/dune.go index a10a020c..7d26a77f 100644 --- a/harnesses/dune-platform-volume/cmd/script/dune.go +++ b/harnesses/dune-platform-volume/cmd/script/dune.go @@ -9,49 +9,47 @@ import ( "time" ) -// querySQL fetches yesterday's total cross-chain volume per platform from -// Sacha's community datasets (dune.adam_tehc_co.dataset_*). +// querySQL fetches the latest complete day's cross-chain metrics per platform +// from Dune community datasets. // -// Dataset schemas: -// dataset_{platform}_daily → day, blockchain, volume_usd, fees_usd, txns, wallets -// dataset_fomo_sol_daily → day, volume_usd, fees_usd, txns, wallets, wallets_dedup (no blockchain col) -// dataset_pumpapp_sol_daily → day, blockchain, volume_usd, fees_usd, txns, wallets, wallets_dedup -// dataset_pumpfun_relay_daily → day, fill_chain, req_class, volume_usd, app_fees_usd, txns, wallets -// -// pump.fun total = pumpapp Solana + relay swaps (req_class='swap'). -// All others: SUM(volume_usd) across all blockchains for latest available day. +// Returns per platform: volume_usd, txns, fees_usd, avg_trade_usd, fee_rate_pct. +// pump.fun = pumpapp Solana + relay swaps (req_class='swap'), fees=0 (fee cut Aug 2026). +// fomo = Solana only (dataset_fomo_sol_daily, no blockchain col). +// All others sum across all blockchains for latest available day. const querySQL = ` WITH latest AS ( - SELECT - 'gmgn' AS platform, SUM(volume_usd) AS volume_usd FROM dune.adam_tehc_co.dataset_gmgn_daily - WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_gmgn_daily) + SELECT 'gmgn' AS platform, SUM(volume_usd) AS volume_usd, SUM(CAST(txns AS BIGINT)) AS txns, SUM(CAST(fees_usd AS DOUBLE)) AS fees_usd + FROM dune.adam_tehc_co.dataset_gmgn_daily WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_gmgn_daily) UNION ALL - SELECT 'axiom', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_axiom_daily - WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_axiom_daily) + SELECT 'axiom', SUM(volume_usd), SUM(CAST(txns AS BIGINT)), SUM(CAST(fees_usd AS DOUBLE)) + FROM dune.adam_tehc_co.dataset_axiom_daily WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_axiom_daily) UNION ALL - SELECT 'trojan', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_trojan_daily - WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_trojan_daily) + SELECT 'trojan', SUM(volume_usd), SUM(CAST(txns AS BIGINT)), SUM(CAST(fees_usd AS DOUBLE)) + FROM dune.adam_tehc_co.dataset_trojan_daily WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_trojan_daily) UNION ALL - SELECT 'padre', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_terminal_daily - WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_terminal_daily) + SELECT 'padre', SUM(volume_usd), SUM(CAST(txns AS BIGINT)), SUM(CAST(fees_usd AS DOUBLE)) + FROM dune.adam_tehc_co.dataset_terminal_daily WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_terminal_daily) UNION ALL - SELECT 'photon', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_photon_daily - WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_photon_daily) + SELECT 'photon', SUM(volume_usd), SUM(CAST(txns AS BIGINT)), SUM(CAST(fees_usd AS DOUBLE)) + FROM dune.adam_tehc_co.dataset_photon_daily WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_photon_daily) UNION ALL - SELECT 'basedbot', SUM(volume_usd) FROM dune.adam_tehc_co.dataset_basedbot_daily - WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_basedbot_daily) + SELECT 'basedbot', SUM(volume_usd), SUM(CAST(txns AS BIGINT)), SUM(CAST(fees_usd AS DOUBLE)) + FROM dune.adam_tehc_co.dataset_basedbot_daily WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_basedbot_daily) UNION ALL - SELECT 'fomo', volume_usd FROM dune.adam_tehc_co.dataset_fomo_sol_daily - WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_fomo_sol_daily) + SELECT 'fomo', volume_usd, CAST(txns AS BIGINT), CAST(fees_usd AS DOUBLE) + FROM dune.adam_tehc_co.dataset_fomo_sol_daily WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_fomo_sol_daily) UNION ALL SELECT 'pump-fun', - COALESCE((SELECT SUM(volume_usd) FROM dune.adam_tehc_co.dataset_pumpapp_sol_daily - WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_pumpapp_sol_daily)), 0) - + COALESCE((SELECT SUM(volume_usd) FROM dune.adam_tehc_co.dataset_pumpfun_relay_daily - WHERE day = (SELECT MAX(day) FROM dune.adam_tehc_co.dataset_pumpfun_relay_daily) - AND req_class = 'swap'), 0) + COALESCE((SELECT SUM(volume_usd) FROM dune.adam_tehc_co.dataset_pumpapp_sol_daily WHERE day=(SELECT MAX(day) FROM dune.adam_tehc_co.dataset_pumpapp_sol_daily)),0) + + COALESCE((SELECT SUM(volume_usd) FROM dune.adam_tehc_co.dataset_pumpfun_relay_daily WHERE day=(SELECT MAX(day) FROM dune.adam_tehc_co.dataset_pumpfun_relay_daily) AND req_class='swap'),0), + COALESCE((SELECT SUM(CAST(txns AS BIGINT)) FROM dune.adam_tehc_co.dataset_pumpapp_sol_daily WHERE day=(SELECT MAX(day) FROM dune.adam_tehc_co.dataset_pumpapp_sol_daily)),0) + + COALESCE((SELECT SUM(CAST(txns AS BIGINT)) FROM dune.adam_tehc_co.dataset_pumpfun_relay_daily WHERE day=(SELECT MAX(day) FROM dune.adam_tehc_co.dataset_pumpfun_relay_daily) AND req_class='swap'),0), + CAST(0 AS DOUBLE) ) -SELECT platform, volume_usd FROM latest ORDER BY volume_usd DESC +SELECT platform, volume_usd, txns, fees_usd, + CASE WHEN txns > 0 THEN volume_usd / txns ELSE NULL END AS avg_trade_usd, + CASE WHEN volume_usd > 0 THEN fees_usd / volume_usd * 100 ELSE 0.0 END AS fee_rate_pct +FROM latest ORDER BY volume_usd DESC ` const duneBase = "https://api.dune.com/api/v1" @@ -62,8 +60,12 @@ type duneClient struct { } type duneRow struct { - Platform string `json:"platform"` - VolumeUSD float64 `json:"volume_usd"` + Platform string `json:"platform"` + VolumeUSD float64 `json:"volume_usd"` + Txns float64 `json:"txns"` + FeesUSD float64 `json:"fees_usd"` + AvgTradeUSD float64 `json:"avg_trade_usd"` + FeeRatePct float64 `json:"fee_rate_pct"` } func newDuneClient(apiKey string) *duneClient { @@ -95,7 +97,7 @@ func (d *duneClient) req(method, path string, body any) (*http.Response, error) func (d *duneClient) createQuery() (string, error) { payload := map[string]any{ - "name": "OCB: Cross-chain trading platform volume (Sacha datasets)", + "name": "OCB: Cross-chain trading platform metrics", "query_sql": querySQL, "is_private": false, "parameters": []any{}, diff --git a/harnesses/dune-platform-volume/cmd/script/main.go b/harnesses/dune-platform-volume/cmd/script/main.go index 84ce6664..5ee3e093 100644 --- a/harnesses/dune-platform-volume/cmd/script/main.go +++ b/harnesses/dune-platform-volume/cmd/script/main.go @@ -1,6 +1,6 @@ // dune-platform-volume -- Bench 201 (replaces Mobula lighthouse source) // -// Queries Sacha's community datasets on Dune (dune.adam_tehc_co.dataset_*_daily) +// Queries Dune community datasets (dataset_*_daily) // for cross-chain trading platform volume. Each dataset has columns: // day, blockchain, volume_usd, fees_usd, txns, wallets. // pump.fun uses dataset_pumpapp_sol_daily (Solana) + dataset_pumpfun_relay_daily (relay). @@ -29,7 +29,7 @@ const ( func main() { fmt.Println("=== dune-platform-volume harness ===") - fmt.Println("OpenChainBench Bench 201 -- Cross-chain trading platform volume via Sacha's Dune datasets.") + fmt.Println("OpenChainBench Bench 201 -- Cross-chain trading platform volume via Dune community datasets.") apiKey := os.Getenv("DUNE_API_KEY") if apiKey == "" { diff --git a/harnesses/dune-platform-volume/cmd/script/metrics.go b/harnesses/dune-platform-volume/cmd/script/metrics.go index b087b85a..fd7107c7 100644 --- a/harnesses/dune-platform-volume/cmd/script/metrics.go +++ b/harnesses/dune-platform-volume/cmd/script/metrics.go @@ -10,17 +10,44 @@ import ( var ( platformVolume = prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "dune_platform_volume_24h_usd", - Help: "24h trading volume in USD per platform, summed across all blockchains (Sacha's Dune community datasets).", + Help: "24h trading volume in USD per platform, summed across all blockchains (Dune community datasets).", + }, []string{"platform"}) + + platformTxns = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "dune_platform_txns_24h", + Help: "24h swap transaction count per platform, summed across all blockchains (Dune community datasets).", + }, []string{"platform"}) + + platformFeesUSD = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "dune_platform_fees_24h_usd", + Help: "24h protocol fee revenue in USD per platform, summed across all blockchains (Dune community datasets).", + }, []string{"platform"}) + + platformAvgTrade = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "dune_platform_avg_trade_usd", + Help: "Average swap size in USD per platform (volume_usd / txns, Dune community datasets).", + }, []string{"platform"}) + + platformFeeRate = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "dune_platform_fee_rate_pct", + Help: "Observed fee take rate in percent per platform (fees_usd / volume_usd * 100, Dune community datasets).", }, []string{"platform"}) platformHealth = prometheus.NewGaugeVec(prometheus.GaugeOpts{ Name: "dune_platform_volume_health", - Help: "1 if this platform returned volume data in the last Dune poll.", + Help: "1 if this platform returned data in the last Dune poll.", }, []string{"platform"}) ) func init() { - prometheus.MustRegister(platformVolume, platformHealth) + prometheus.MustRegister( + platformVolume, + platformTxns, + platformFeesUSD, + platformAvgTrade, + platformFeeRate, + platformHealth, + ) } func publishRows(rows []duneRow) { @@ -29,6 +56,12 @@ func publishRows(rows []duneRow) { continue } platformVolume.WithLabelValues(r.Platform).Set(r.VolumeUSD) + platformTxns.WithLabelValues(r.Platform).Set(r.Txns) + platformFeesUSD.WithLabelValues(r.Platform).Set(r.FeesUSD) + if r.AvgTradeUSD > 0 { + platformAvgTrade.WithLabelValues(r.Platform).Set(r.AvgTradeUSD) + } + platformFeeRate.WithLabelValues(r.Platform).Set(r.FeeRatePct) platformHealth.WithLabelValues(r.Platform).Set(1) } } diff --git a/src/app/trading-apps/page.tsx b/src/app/trading-apps/page.tsx index ed66e625..e05f158b 100644 --- a/src/app/trading-apps/page.tsx +++ b/src/app/trading-apps/page.tsx @@ -27,7 +27,7 @@ const BENCH_SLUGS = [ "app-store-ratings", ] as const; -// Volume source: Sacha's (adam_tehc) Dune community datasets (dataset_*_daily). +// Volume source: Dune community datasets (dataset_*_daily). // Each platform is a separate dataset with cross-chain breakdown (blockchain col). // pump.fun = pumpapp Solana + relay swaps, shown with proper attribution now. // Terminal (slug: padre) = pump.fun's own trading app (formerly Padre, acq Apr 2025). @@ -50,7 +50,7 @@ const COLUMNS = [ label: "24h Volume", bench: "solana-trading-platform-wars", fmt: fmtUSD, - tip: "Cross-chain 24h volume from Sacha's (adam_tehc) Dune community datasets. Includes Solana + BNB + Base + Robinhood node + HyperEVM + Monad etc. pump.fun = pumpapp frontend only (not all bonding-curve). Terminal = pump.fun's own trading app (formerly Padre, acq. Apr 2025).", + tip: "Cross-chain 24h volume from Dune community datasets. Includes Solana + BNB + Base + Robinhood node + HyperEVM + Monad etc. pump.fun = pumpapp frontend only (not all bonding-curve). Terminal = pump.fun's own trading app (formerly Padre, acq. Apr 2025).", higherBetter: true, }, { @@ -424,7 +424,7 @@ export default async function TradingAppsHubPage() { Methodology
- Volume from Sacha's (adam_tehc) Dune community datasets: cross-chain
+ Volume from Dune community datasets: cross-chain
totals per platform (Solana + BNB + Base + Robinhood node + HyperEVM
+ Monad). pump.fun = pumpapp frontend + relay swaps only, not all
bonding-curve activity. Terminal = pump.fun's own app (formerly Padre,
From 998eb899fa12cba6882957395f401f9a88e8b087 Mon Sep 17 00:00:00 2001
From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com>
Date: Fri, 21 Aug 2026 16:40:45 +0200
Subject: [PATCH 3/3] feat: add Dwellir SVG logo
---
public/logos/dwellir.svg | 101 +++++++++++++++++++++++++++++++++++++++
src/lib/logo-manifest.ts | 1 +
2 files changed, 102 insertions(+)
create mode 100644 public/logos/dwellir.svg
diff --git a/public/logos/dwellir.svg b/public/logos/dwellir.svg
new file mode 100644
index 00000000..b5a801f9
--- /dev/null
+++ b/public/logos/dwellir.svg
@@ -0,0 +1,101 @@
+
+
+
+
diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts
index 9adb8887..e82931bc 100644
--- a/src/lib/logo-manifest.ts
+++ b/src/lib/logo-manifest.ts
@@ -49,6 +49,7 @@ const RAW: Record