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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions benchmarks/memecoin-platforms.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# OpenChainBench. Bench № 200

slug: memecoin-platforms
number: "200"
title: Cheapest platform to trade memecoins (Fomo vs pump.fun vs Photon)
seo_title: "Fomo vs pump.fun trading fees 2026"
seo_description: "Compare trading fees on Fomo, pump.fun, Photon and Axiom. Real fee data from Mobula on the top Solana memecoins by market cap."
subtitle: Average total fee per trade (platform + gas + MEV) as a percent of trade value, sampled across the top 10 pump.fun tokens every 5 minutes.
category: Apps
status: live
metric: Avg total fee
unit: pct

dimensions:
platform:
- { value: fomo, label: Fomo }
- { value: pump-fun, label: pump.fun }
- { value: photon, label: Photon }
- { value: axiom, label: Axiom }

seo_intro: |
Fomo and pump.fun both compete for Solana memecoin traders, but they charge
very differently. This benchmark measures the real all-in cost — platform fee
plus gas plus any MEV — on the top 10 pump.fun tokens by market cap, sampled
every 5 minutes via Mobula's enriched trades API. The headline number is total
fee as a percent of trade value, not the advertised fee rate. Aggregators like
Photon and Axiom route through the same pools but add their own markup; this
benchmark makes that visible.

abstract: |
The harness fetches the top 10 tokens by market cap from pump.fun every 5
minutes, then pulls the last 200 trades per token from Mobula's
`/api/2/token/trades-enriched` endpoint (`chainId=solana:solana`). Each trade
carries a `platform` tag (fomo, pump-fun, photon, axiom, …) and three fee
fields: `platformFeesUSD`, `gasFeesUSD`, `mevFeesUSD`. We group by platform,
compute the average total fee (sum of all three) as a percent of `amountUSD`,
and emit `memecoin_platform_fee_pct`. The leaderboard sorts by the median of
that gauge over 24 hours.

formula: avg(memecoin_platform_fee_pct) by (platform)

leaderboard:
- id: fee_pct_by_platform
title: Average total fee % by platform
description: Mean fee across all sampled tokens (lower is better)
query: avg(avg_over_time(memecoin_platform_fee_pct[24h])) by (platform)
unit: pct
lower_is_better: true

- id: platform_fee_usd
title: Average platform fee (USD)
description: Explicit protocol fee, excluding gas
query: avg(avg_over_time(memecoin_platform_fee_usd[24h])) by (platform)
unit: usd
lower_is_better: true

- id: gas_usd
title: Average gas fee (USD)
description: Solana transaction fee per trade
query: avg(avg_over_time(memecoin_platform_gas_usd[24h])) by (platform)
unit: usd
lower_is_better: true

- id: trade_volume
title: Trade samples (24h)
description: Number of trades analyzed per platform
query: sum(avg_over_time(memecoin_platform_trade_count[24h])) by (platform)
unit: count
lower_is_better: false
174 changes: 174 additions & 0 deletions benchmarks/solana-launchpad-wars.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
# OpenChainBench. Bench 200

slug: solana-launchpad-wars
number: "200"
title: "Solana meme launchpad leaderboard: PumpFun vs Flap vs Bankr, live 24h volume"
seo_title: "Solana meme launchpad comparison 2026: PumpFun, Flap, Bankr, LetsCash"
seo_description: "{{best_name}} leads Solana meme launchpads at ${{best_p50}} 24h volume. PumpFun vs Flap vs Bankr vs LetsCash vs Meteora DBC vs NOXA Fun ranked live from Mobula lighthouse data."
subtitle: Live 24-hour trading volume for each Solana meme coin launchpad. Polled every 15 minutes from Mobula lighthouse, which aggregates on-chain swap events across all bonding-curve programs on Solana.

category: Trading
status: live
metric: 24h volume
unit: USD
higher_is_better: true

disclaimer: |
Volume figures are sourced from Mobula's lighthouse aggregator, which indexes on-chain swap events. Data is refreshed every 15 minutes. A launchpad with zero volume may indicate no activity in the last 24 hours or a temporary data gap from Mobula. Fees shown are protocol-side fees detected on-chain; off-chain relay or referral fees are excluded.

seo_intro: |
Solana's meme coin launchpad market is dominated by PumpFun but is far from a
monopoly. Flap, Bankr, LetsCash, NOXA Fun and Meteora DBC all run active
bonding-curve programs on Solana competing for the same launch traffic. This
benchmark tracks the 24-hour trading volume, protocol fees and trade count for
each platform in real time. PumpFun consistently leads with over 100 million
USD in daily volume and more than 1 million USD in daily fees. Flap and Meteora
DBC occupy the challenger positions. The fee efficiency column (fees divided by
volume) reveals which launchpad extracts the most revenue per dollar traded.

abstract: |
The harness polls the Mobula lighthouse endpoint (api.mobula.io/api/2/market/lighthouse)
every 15 minutes. Mobula aggregates all on-chain swap events into rolling windows
(15 min, 1 h, 6 h, 24 h) per launchpad and per trading platform. The harness
exposes three gauges per launchpad: solana_launchpad_volume_24h_usd,
solana_launchpad_fees_24h_usd and solana_launchpad_trades_24h. All launchpads
returned by the API are tracked automatically. The benchmark YAML selects the
eight highest-volume Solana-native launchpads as providers.

methodology:
- "Source: Mobula lighthouse (api.mobula.io/api/2/market/lighthouse), byLaunchpad field. Mobula indexes all Solana bonding-curve programs and aggregates swap events into 24h rolling windows updated approximately every minute on Mobula's side."
- "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 routed through this launchpad's program. Higher = more active market."
- "Fees: on-chain protocol fees collected by the launchpad program within the last 24 hours. Off-chain relay fees and referral fees are not included."
- "Trades: count of individual swap events within the last 24 hours."
- "Launchpad scope: this bench covers bonding-curve launchpads (PumpFun, Flap, Bankr, LetsCash, NOXA Fun, Meteora DBC, Raydium Launchlab). Trading frontends that route through multiple launchpads (GMGN, Axiom, Fomo, Trojan) are a separate bench."
- "PumpFun note: PumpFun volume here is bonding-curve activity only. Tokens that graduate from the bonding curve to PumpSwap AMM are counted separately under PumpSwap in the DEX view and are not included here."

findings:
- "{{best_name}} leads Solana meme launchpads at ${{best_p50}} 24h volume."
- "PumpFun commands the market with over $100 million in daily bonding-curve volume and over $1 million in daily protocol fees, roughly 70 percent of total tracked launchpad volume."
- "Flap and Meteora DBC are the closest challengers, each processing tens of millions in daily volume. Flap has the highest fee-to-volume ratio among active launchpads."
- "Bankr, LetsCash and NOXA Fun each run active programs with single-digit millions in daily volume and tens of thousands in daily fees."

source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/solana-launchpad-wars

prometheus:
window: 24h
freshness_metric: solana_launchpad_volume_24h_usd

faq:
- q: "Which Solana meme launchpad has the most volume?"
a: "PumpFun leads with over $100 million in 24h bonding-curve volume, roughly 70 percent of total tracked launchpad volume. Flap and Meteora DBC are the closest challengers. The leaderboard updates every 15 minutes from live Mobula lighthouse data."
- q: "What counts as launchpad volume here?"
a: "On-chain swap events routed through the launchpad's bonding-curve program, aggregated over a rolling 24-hour window by Mobula. For PumpFun this is the bonding-curve phase only; tokens that have graduated to the PumpSwap AMM are not included in this figure."
- q: "How does PumpFun compare to Flap on fees?"
a: "PumpFun collects over $1 million in daily protocol fees on $100M+ volume, an effective rate near 1 percent. Flap has a higher fee-to-volume ratio, extracting roughly 1.2 percent of volume as fees. The solana_launchpad_fees_24h_usd gauge tracks this live."
- q: "What is Meteora DBC?"
a: "Meteora Dynamic Bonding Curve is Meteora's launchpad product on Solana, competing directly with PumpFun. It uses a configurable bonding curve and routes graduated tokens into Meteora's DLMM liquidity pools."
- q: "Are trading bots like GMGN and Axiom included?"
a: "No. GMGN, Axiom, Fomo and Trojan are trading frontends that route orders through multiple launchpads and DEXes. Their volume is attributable to the underlying programs, not to a single launchpad. A separate bench tracks the trading platform leaderboard."

providers:
- slug: pumpfun
name: PumpFun
tag: "Solana launchpad, #1 by volume"
formula: "24h bonding-curve swap volume in USD. Source: Mobula lighthouse byLaunchpad[name=PumpFun].volumeUSD.24h, updated every 15 min."
queries:
p50: solana_launchpad_volume_24h_usd{launchpad="pumpfun"}
p90: solana_launchpad_volume_24h_usd{launchpad="pumpfun"}
p99: solana_launchpad_volume_24h_usd{launchpad="pumpfun"}
mean: solana_launchpad_volume_24h_usd{launchpad="pumpfun"}
success: solana_launchpad_health{launchpad="pumpfun"}
sample_size: solana_launchpad_trades_24h{launchpad="pumpfun"}
series: solana_launchpad_volume_24h_usd{launchpad="pumpfun"}

- slug: flap
name: Flap
tag: "Solana launchpad, top fee rate"
formula: "24h bonding-curve swap volume in USD. Source: Mobula lighthouse byLaunchpad[name=Flap].volumeUSD.24h, updated every 15 min."
queries:
p50: solana_launchpad_volume_24h_usd{launchpad="flap"}
p90: solana_launchpad_volume_24h_usd{launchpad="flap"}
p99: solana_launchpad_volume_24h_usd{launchpad="flap"}
mean: solana_launchpad_volume_24h_usd{launchpad="flap"}
success: solana_launchpad_health{launchpad="flap"}
sample_size: solana_launchpad_trades_24h{launchpad="flap"}
series: solana_launchpad_volume_24h_usd{launchpad="flap"}

- slug: meteora-dbc
name: Meteora DBC
tag: "Meteora DBC, Solana launchpad"
formula: "24h bonding-curve swap volume in USD. Source: Mobula lighthouse byLaunchpad[name=Meteora DBC].volumeUSD.24h, updated every 15 min."
queries:
p50: solana_launchpad_volume_24h_usd{launchpad="meteora-dbc"}
p90: solana_launchpad_volume_24h_usd{launchpad="meteora-dbc"}
p99: solana_launchpad_volume_24h_usd{launchpad="meteora-dbc"}
mean: solana_launchpad_volume_24h_usd{launchpad="meteora-dbc"}
success: solana_launchpad_health{launchpad="meteora-dbc"}
sample_size: solana_launchpad_trades_24h{launchpad="meteora-dbc"}
series: solana_launchpad_volume_24h_usd{launchpad="meteora-dbc"}

- slug: noxa-fun
name: NOXA Fun
tag: "Solana meme launchpad"
formula: "24h bonding-curve swap volume in USD. Source: Mobula lighthouse byLaunchpad[name=NOXA Fun].volumeUSD.24h, updated every 15 min."
queries:
p50: solana_launchpad_volume_24h_usd{launchpad="noxa-fun"}
p90: solana_launchpad_volume_24h_usd{launchpad="noxa-fun"}
p99: solana_launchpad_volume_24h_usd{launchpad="noxa-fun"}
mean: solana_launchpad_volume_24h_usd{launchpad="noxa-fun"}
success: solana_launchpad_health{launchpad="noxa-fun"}
sample_size: solana_launchpad_trades_24h{launchpad="noxa-fun"}
series: solana_launchpad_volume_24h_usd{launchpad="noxa-fun"}

- slug: bankr
name: Bankr
tag: "Solana meme launchpad"
formula: "24h bonding-curve swap volume in USD. Source: Mobula lighthouse byLaunchpad[name=Bankr].volumeUSD.24h, updated every 15 min."
queries:
p50: solana_launchpad_volume_24h_usd{launchpad="bankr"}
p90: solana_launchpad_volume_24h_usd{launchpad="bankr"}
p99: solana_launchpad_volume_24h_usd{launchpad="bankr"}
mean: solana_launchpad_volume_24h_usd{launchpad="bankr"}
success: solana_launchpad_health{launchpad="bankr"}
sample_size: solana_launchpad_trades_24h{launchpad="bankr"}
series: solana_launchpad_volume_24h_usd{launchpad="bankr"}

- slug: letscash
name: LetsCash
tag: "Solana meme launchpad"
formula: "24h bonding-curve swap volume in USD. Source: Mobula lighthouse byLaunchpad[name=LetsCash].volumeUSD.24h, updated every 15 min."
queries:
p50: solana_launchpad_volume_24h_usd{launchpad="letscash"}
p90: solana_launchpad_volume_24h_usd{launchpad="letscash"}
p99: solana_launchpad_volume_24h_usd{launchpad="letscash"}
mean: solana_launchpad_volume_24h_usd{launchpad="letscash"}
success: solana_launchpad_health{launchpad="letscash"}
sample_size: solana_launchpad_trades_24h{launchpad="letscash"}
series: solana_launchpad_volume_24h_usd{launchpad="letscash"}

- slug: dontblink
name: dontblink
tag: "Solana meme launchpad"
formula: "24h bonding-curve swap volume in USD. Source: Mobula lighthouse byLaunchpad[name=dontblink].volumeUSD.24h, updated every 15 min."
queries:
p50: solana_launchpad_volume_24h_usd{launchpad="dontblink"}
p90: solana_launchpad_volume_24h_usd{launchpad="dontblink"}
p99: solana_launchpad_volume_24h_usd{launchpad="dontblink"}
mean: solana_launchpad_volume_24h_usd{launchpad="dontblink"}
success: solana_launchpad_health{launchpad="dontblink"}
sample_size: solana_launchpad_trades_24h{launchpad="dontblink"}
series: solana_launchpad_volume_24h_usd{launchpad="dontblink"}

- slug: raydium-launchlab
name: Raydium Launchlab
tag: "Raydium launchpad on Solana"
formula: "24h bonding-curve swap volume in USD. Source: Mobula lighthouse byLaunchpad[name=Raydium Launchlab].volumeUSD.24h, updated every 15 min."
queries:
p50: solana_launchpad_volume_24h_usd{launchpad="raydium-launchlab"}
p90: solana_launchpad_volume_24h_usd{launchpad="raydium-launchlab"}
p99: solana_launchpad_volume_24h_usd{launchpad="raydium-launchlab"}
mean: solana_launchpad_volume_24h_usd{launchpad="raydium-launchlab"}
success: solana_launchpad_health{launchpad="raydium-launchlab"}
sample_size: solana_launchpad_trades_24h{launchpad="raydium-launchlab"}
series: solana_launchpad_volume_24h_usd{launchpad="raydium-launchlab"}
22 changes: 22 additions & 0 deletions harnesses/memecoin-platforms/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM golang:1.24-alpine AS builder

WORKDIR /build

COPY go.mod go.sum ./
RUN go mod download

COPY . .

RUN CGO_ENABLED=0 GOOS=linux go build -o /memecoin-platforms ./cmd/monitor

FROM alpine:latest

RUN apk --no-cache add ca-certificates

WORKDIR /app

COPY --from=builder /memecoin-platforms .

EXPOSE 9090

CMD ["./memecoin-platforms"]
120 changes: 120 additions & 0 deletions harnesses/memecoin-platforms/cmd/monitor/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package main

import (
"log"
"net/http"
"os"
"time"

"github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
log.Println("memecoin-platforms monitor starting...")

apiKey := os.Getenv("MOBULA_API_KEY")
if apiKey == "" {
log.Fatal("MOBULA_API_KEY is required")
}

interval := 5 * time.Minute
client := &http.Client{Timeout: 30 * time.Second}

// First poll immediately, then tick.
runPoll(client, apiKey)

go func() {
ticker := time.NewTicker(interval)
defer ticker.Stop()
for range ticker.C {
runPoll(client, apiKey)
}
}()

http.Handle("/metrics", promhttp.Handler())
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
})
log.Println("serving metrics on :9090")
log.Fatal(http.ListenAndServe(":9090", nil))
}

type platformStats struct {
platformFeeSum float64
gasSum float64
totalFeeSum float64
tradeValueSum float64
n int
}

func runPoll(client *http.Client, apiKey string) {
tokens, err := fetchTopTokens(client, 10)
if err != nil {
log.Printf("[pump.fun] %v", err)
pollErrors.WithLabelValues("pumpfun").Inc()
return
}
log.Printf("[pump.fun] %d tokens", len(tokens))

for _, tok := range tokens {
if tok.Mint == "" {
continue
}

trades, err := fetchTrades(client, apiKey, tok.Mint)
if err != nil {
log.Printf("[mobula][%s] %v", tok.Symbol, err)
pollErrors.WithLabelValues("mobula").Inc()
// pace between tokens even on error
time.Sleep(500 * time.Millisecond)
continue
}

byPlatform := make(map[string]*platformStats)
for _, t := range trades {
p := t.Platform
if p == "" {
p = "unknown"
}
s := byPlatform[p]
if s == nil {
s = &platformStats{}
byPlatform[p] = s
}
s.platformFeeSum += t.PlatformFeesUSD
s.gasSum += t.GasFeesUSD
s.totalFeeSum += t.TotalFeesUSD
s.tradeValueSum += t.AmountUSD
s.n++
}

sym := tok.Symbol
if sym == "" {
sym = tok.Mint[:8]
}

for p, s := range byPlatform {
n := float64(s.n)
avgPlatformFee := s.platformFeeSum / n
avgGas := s.gasSum / n
avgTotal := s.totalFeeSum / n
avgVal := s.tradeValueSum / n

feePct := 0.0
if avgVal > 0 {
feePct = (avgTotal / avgVal) * 100
}

platformFeePct.WithLabelValues(p, sym, tok.Mint).Set(feePct)
platformFeeUSD.WithLabelValues(p, sym, tok.Mint).Set(avgPlatformFee)
platformGasUSD.WithLabelValues(p, sym, tok.Mint).Set(avgGas)
platformTotalFeeUSD.WithLabelValues(p, sym, tok.Mint).Set(avgTotal)
platformTradeCount.WithLabelValues(p, sym, tok.Mint).Set(n)
}

log.Printf("[mobula][%s] %d trades across %d platforms", sym, len(trades), len(byPlatform))
time.Sleep(500 * time.Millisecond)
}

lastPollTime.SetToCurrentTime()
}
Loading
Loading