diff --git a/benchmarks/memecoin-platforms.yml b/benchmarks/memecoin-platforms.yml index 8cd8c9c5..89333f6c 100644 --- a/benchmarks/memecoin-platforms.yml +++ b/benchmarks/memecoin-platforms.yml @@ -39,7 +39,7 @@ methodology: - "Trades: last 50 trades per token from Mobula token/trades-enriched (chainId=solana:solana), filtered to amountUSD >= $5." - "Fee source: Solana public RPC getTransaction (jsonParsed) for each trade hash. No third-party fee API." - "Gas: meta.fee (lamports) converted to USD at the current SOL/USD price fetched from CoinGecko every 5 min." - - "Platform fees: explicit SOL or USDC/WSOL transfers to known fee wallet owners (confirmed on-chain). Unknown small recipients are captured via heuristics: SOL recipients receiving less than 5% of the user net flow, USDC/WSOL recipients receiving less than 5% of the largest pool receipt." + - "Platform fees: explicit SOL or USDC/WSOL transfers to known fee wallet owners (confirmed on-chain). Unknown small recipients are captured via heuristics: SOL recipients receiving less than 5% of the user net flow, USDC/WSOL recipients receiving less than 5% of the largest pool receipt. Trading bots that use pre-funded escrow accounts (Trojan, Maestro) collect fees through a separate settlement mechanism not visible in the swap transaction; their displayed fee represents gas only." - "AMM LP fees excluded: the 0.20% PumpSwap fee and 0.25% Raydium fee stay inside pool accounts and are not counted because they apply equally to all frontends routing through the same pool." - "Grouping: trades are split by the platform field returned by Mobula. Trades with no platform tag are assigned to pump-fun." - "Cadence: full sweep every 5 minutes; tx results are cached to avoid re-parsing the same hash." @@ -53,9 +53,11 @@ faq: - q: "Are AMM LP fees included?" a: "No. The 0.20% PumpSwap fee and 0.25% Raydium fee stay inside pool accounts and are not transferred anywhere. Since they apply equally to every frontend routing through the same pool, including them would not differentiate platforms. This benchmark measures only explicit transfers out of the user's wallet to platform or protocol fee recipients." - q: "What fees do memecoin trading platforms charge?" - a: "Native clients (pump.fun) collect a small protocol fee on each swap. Aggregator frontends (Photon, Axiom, Phantom) add a referral tip on top. Trading bots (Trojan, GMGN) charge a fixed percentage per trade sent to their fee wallet. Gas is a separate Solana transaction fee. This benchmark combines all of these into a single explicit all-in percent." + a: "Native clients (pump.fun) collect a small protocol fee on each swap. Aggregator frontends (Phantom) add a referral tip on top, visible as a small SOL or USDC transfer in the swap transaction. Trading bots using pre-funded escrow (Trojan, Maestro) charge a fixed percentage but collect it via a separate settlement mechanism outside the swap transaction. Gas is a separate Solana transaction fee paid per signature." - q: "How are fee wallets identified?" - a: "For known platforms like Fomo, the fee wallet owner address is confirmed by inspecting tagged trades on-chain. For platforms without a confirmed wallet, the harness uses a heuristic: any non-system, non-pool account receiving less than 5% of the user's net SOL flow, or less than 5% of the largest token pool receipt, is counted as a fee recipient. This captures bot tips and referral fees without needing to hardcode every wallet." + a: "For confirmed platforms like Fomo, the fee wallet owner address is verified by inspecting multiple tagged trades on-chain. For platforms without a confirmed wallet, the harness uses a heuristic: any non-system, non-pool account receiving less than 5% of the user's net SOL flow, or less than 5% of the largest token pool receipt, is counted as a fee recipient. This captures Phantom-style referral tips without hardcoding every address." + - q: "Why does Trojan show near-zero fee?" + a: "Trojan and similar escrow-based bots (Maestro) pre-fund a shared wallet, execute trades from it, then settle with users in a separate transaction. The swap transaction itself shows a fair-price trade with no fee deduction. Their advertised ~0.9% fee is collected in the settlement step, which is not a swap and not captured by this benchmark. Trojan's displayed value reflects gas only." - q: "Why is pump.fun near zero?" a: "pump.fun's protocol fee goes to a program-owned pool account, not to an identifiable external wallet. Without a price oracle for the memecoin itself, the fee taken in the output token cannot be converted to USD. The benchmark measures explicit USD-denominated or SOL-denominated transfers; pump.fun's LP-style fee is currently outside that scope." @@ -122,7 +124,7 @@ providers: - slug: trojan name: Trojan tag: Trading bot - formula: "Explicit on-chain fee percent for trades tagged trojan by Mobula, 24h median." + formula: "Gas-only on-chain cost for trades tagged trojan by Mobula, 24h median. Trojan collects its ~0.9% fee via pre-funded escrow settled outside the swap transaction; the swap itself shows no fee deduction." queries: p50: quantile_over_time(0.50, avg(memecoin_platform_fee_pct{platform="trojan"})[24h:5m]) p90: quantile_over_time(0.90, avg(memecoin_platform_fee_pct{platform="trojan"})[24h:5m]) @@ -140,3 +142,14 @@ providers: p99: quantile_over_time(0.99, avg(memecoin_platform_fee_pct{platform="gmgn"})[24h:5m]) mean: avg_over_time(avg(memecoin_platform_fee_pct{platform="gmgn"})[24h:5m]) sample_size: sum(avg_over_time(memecoin_platform_trade_count{platform="gmgn"}[24h])) + + - slug: maestro + name: Maestro + tag: Trading bot + formula: "Gas-only on-chain cost for trades tagged maestro by Mobula, 24h median. Maestro uses pre-funded escrow similar to Trojan; actual fee not visible in swap transaction." + queries: + p50: quantile_over_time(0.50, avg(memecoin_platform_fee_pct{platform="maestro"})[24h:5m]) + p90: quantile_over_time(0.90, avg(memecoin_platform_fee_pct{platform="maestro"})[24h:5m]) + p99: quantile_over_time(0.99, avg(memecoin_platform_fee_pct{platform="maestro"})[24h:5m]) + mean: avg_over_time(avg(memecoin_platform_fee_pct{platform="maestro"})[24h:5m]) + sample_size: sum(avg_over_time(memecoin_platform_trade_count{platform="maestro"}[24h])) diff --git a/harnesses/memecoin-platforms/cmd/monitor/solana.go b/harnesses/memecoin-platforms/cmd/monitor/solana.go index 6dab2851..bbe5c3d8 100644 --- a/harnesses/memecoin-platforms/cmd/monitor/solana.go +++ b/harnesses/memecoin-platforms/cmd/monitor/solana.go @@ -40,6 +40,11 @@ var skipAccounts = map[string]bool{ "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK": true, "CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C": true, "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8": true, + // Trojan (Scorched) program accounts — escrow-based, fees collected separately + "SCoRcH8c2dpjvcJD6FiPbCSQyQgu3PcUAWj2Xxx3mqn": true, + "ojh19ojaKduoJZuaJADhcVGp4xt1TcdAvZmpVsCorch": true, + // Jupiter aggregator + "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4": true, } type cacheEntry struct {