From 0037791fae56396169c473aba6fe8f518889755e Mon Sep 17 00:00:00 2001 From: Flotapponnier Date: Mon, 21 Sep 2026 00:47:41 +0200 Subject: [PATCH] =?UTF-8?q?terminal-fill:=20pump.fun=20app's=20EVM=20trade?= =?UTF-8?q?s=20through=20Relay=20(fee=20recipient=200xdab3f5fc=E2=80=A6,?= =?UTF-8?q?=2015=20bps,=20gas=20sponsored;=20Robinhood=20Chain,=20BNB,=20H?= =?UTF-8?q?yperEVM,=20Arc),=20rows=20pump-fun-=20pooled=20with=20it?= =?UTF-8?q?s=20Solana=20row?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01L4rjxemTvgRwrCG6D2iK5D --- benchmarks/terminal-fill-quality.yml | 6 +++--- harnesses/terminal-fill-quality/cmd/script/main.go | 2 +- harnesses/terminal-fill-quality/cmd/script/xchain.go | 8 ++++++++ src/components/terminal-fill-section.tsx | 2 +- src/components/terminal-fill-swaps.tsx | 4 ++-- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/benchmarks/terminal-fill-quality.yml b/benchmarks/terminal-fill-quality.yml index 687aeef4..608ac719 100644 --- a/benchmarks/terminal-fill-quality.yml +++ b/benchmarks/terminal-fill-quality.yml @@ -96,7 +96,7 @@ faq: - q: "Are sandwiches counted?" a: "Screened, not ranked. A sandwich's two legs both touch the pool, so they are the user's neighbours in the pool's own transaction sequence: another signer trading the same direction just before, and back just after, in the same slot or the next. Every hit is in the JSON with the attacker and both signatures. It is not a column because the share of swaps that can be screened depends on how busy the pool is, which differs per terminal. The victim's extra cost is not a separate line either: the front-run precedes the user's swap, so the arrival price already carries it inside the pool component." - q: "How is a swap attributed to a terminal?" - a: "By the fee it pays: every terminal transfers its fee to known wallets in the same transaction, and those wallet lists are the ones DeFiLlama's adapters use for volume, so attribution matches benches 201 and 267. Where the fee wallet is not enough: pump.fun's app and Banana Gun by their programs, Phantom by its fee token account, FOMO by the vanity account every FOMO transaction carries (its gas sponsor signs and is excluded as user), the EVM rows by the router the transaction was sent to (Binance Wallet from blocks read in full), the cross-chain rows by Relay's referrer or fee recipient." + a: "By the fee it pays: every terminal transfers its fee to known wallets in the same transaction, and those wallet lists are the ones DeFiLlama's adapters use for volume, so attribution matches benches 201 and 267. Where the fee wallet is not enough: pump.fun's app and Banana Gun by their programs, Phantom by its fee token account, FOMO by the vanity account every FOMO transaction carries (its gas sponsor signs and is excluded as user), the EVM rows by the router the transaction was sent to (Binance Wallet from blocks read in full), the cross-chain rows by Relay's referrer or fee recipient (FOMO 0x9fc4…, pump.fun app 0xdab3…, verified by the Solana users behind them)." source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/terminal-fill-quality @@ -381,8 +381,8 @@ providers: - slug: pump-fun name: pump.fun app - tag: "Terminal, Solana, pump.fun's own app" - formula: "Random sample of the swaps of pump.fun's own app (by its app program; no app fee, the fixed 0.001 SOL it forwards is network), valued at the pool's state before the trade; loss in bps, median over the rolling 24 h." + tag: "Terminal, Solana + Robinhood Chain + BNB + Arc (+ HyperEVM), gas sponsored on EVM" + formula: "Solana: random sample of the app's swaps (by its program; no app fee). Other chains: its trades through Relay (SOL in, tokens delivered there, 15 bps app fee). Valued at the pool's state before the trade; loss in bps, median over 24 h." queries: p50: tfq_loss_bps{terminal="pump-fun",chain="all",stat="median"} p90: tfq_loss_bps{terminal="pump-fun",chain="all",stat="p90"} diff --git a/harnesses/terminal-fill-quality/cmd/script/main.go b/harnesses/terminal-fill-quality/cmd/script/main.go index 5553a102..c7a4fd45 100644 --- a/harnesses/terminal-fill-quality/cmd/script/main.go +++ b/harnesses/terminal-fill-quality/cmd/script/main.go @@ -1329,7 +1329,7 @@ func productOf(slug string) (string, string) { return slug, "solana" } -var productNames = map[string]string{"fomo": "FOMO", "gmgn": "GMGN", "axiom": "Axiom", "banana-gun": "Banana Gun", "binance": "Binance", "basedbot": "BasedBot"} +var productNames = map[string]string{"fomo": "FOMO", "gmgn": "GMGN", "axiom": "Axiom", "banana-gun": "Banana Gun", "binance": "Binance", "basedbot": "BasedBot", "pump-fun": "pump.fun app"} // productAlias: the product a row belongs to when the bench names it // differently from the row prefix (Binance Wallet's rows are the Binance diff --git a/harnesses/terminal-fill-quality/cmd/script/xchain.go b/harnesses/terminal-fill-quality/cmd/script/xchain.go index 56b3f16b..0496cf40 100644 --- a/harnesses/terminal-fill-quality/cmd/script/xchain.go +++ b/harnesses/terminal-fill-quality/cmd/script/xchain.go @@ -55,6 +55,14 @@ var xchainApps = []xchainApp{ // natively on Solana (join on Mobula's FOMO-attributed trades, 133 of // 2,000 settlements on 2026-09-18); FOMO's referrer is private (403). {Slug: "fomo", Name: "FOMO", FeeRecipients: []string{"0x9fc4e320a181e88644a302d11f1f158ef0699e37"}}, + // pump.fun app's multichain trading (since 2026-05-26: pay in SOL, gas + // sponsored): its Relay app fee, 15 bps, to one recipient, every request + // subsidized; the Solana users behind it trade through the app's + // program 6Vo3245e… (29 of 96 recent transactions of 12 users, none of + // the users behind the other recipients do). 313 of 6,000 Solana-origin + // requests to EVM tokens on 2026-09-21: Robinhood Chain 225, BNB 52, + // HyperEVM 10, Arc 10. + {Slug: "pump-fun", Name: "pump.fun app", FeeRecipients: []string{"0xdab3f5fcd43211345f1789bf734b5fc5aef1adf7"}}, // BasedBot's requests fund its users' wallets on Robinhood Chain, BNB, Base // and Ethereum (SOL in, the gas coin out, no app fee); its trades are the // funded wallets' swaps on Robinhood Chain's router (native.go). diff --git a/src/components/terminal-fill-section.tsx b/src/components/terminal-fill-section.tsx index bb68288a..15f766ad 100644 --- a/src/components/terminal-fill-section.tsx +++ b/src/components/terminal-fill-section.tsx @@ -217,7 +217,7 @@ function xchainLabel(slug: string): string { const m = slug.match(XCHAIN_SUFFIX); if (!m) return ""; if (m[1] === "funding") return "funding leg"; - const viaRelay = slug.startsWith("fomo-"); // BasedBot's chain rows are native swaps on its router + const viaRelay = slug.startsWith("fomo-") || slug.startsWith("pump-fun-"); // BasedBot's chain rows are native swaps on its router return `on ${CHAIN_NAMES[m[1]] ?? m[1]}${viaRelay ? " via Relay" : ""}`; } function chainText(t: TerminalFillStats): string { diff --git a/src/components/terminal-fill-swaps.tsx b/src/components/terminal-fill-swaps.tsx index 8052f169..2c0e3ff8 100644 --- a/src/components/terminal-fill-swaps.tsx +++ b/src/components/terminal-fill-swaps.tsx @@ -65,7 +65,7 @@ export function TerminalFillSwaps({ swaps, terminals, focus }: { swaps: FillSamp if (!m) return null; if (m[1] === "funding") return { text: "funding leg", title: "A bridge leg through Relay, not a swap: what the user sent on one chain against what was delivered on the other (FOMO: a deposit into its Solana wallet to trade there; BasedBot: its in-app bridge between the user's Solana and Robinhood Chain, BNB, Base or Ethereum wallets, either direction). In the JSON, out of the product's published figure." }; const chain = CHAIN_NAMES[m[1]] ?? m[1]; - if (slug.startsWith("fomo-")) return { text: `on ${chain} via Relay`, title: `A FOMO trade delivered on ${chain} by a Relay solver: the user paid from the FOMO wallet on Solana` }; + if (slug.startsWith("fomo-") || slug.startsWith("pump-fun-")) return { text: `on ${chain} via Relay`, title: `A trade delivered on ${chain} by a Relay solver: the user paid from the app's wallet on Solana` }; return { text: chain, title: `A swap of this product on ${chain}, read from its router there` }; }; const filtered = terminal !== (focus ?? "") || side || venue || ref; @@ -307,7 +307,7 @@ const EXPLORERS: Record = { bnb: "https://bscscan.com/tx/", robi function txExplorer(s: FillSample): string { if (s.chain && s.chain !== "solana" && s.terminal.endsWith("-" + s.chain)) { // A Relay sale settles on Solana (sig is the Solana signature); everything else on that chain is native or a Relay buy - if (s.side === "sell" && (s.terminal.startsWith("fomo-") || s.terminal.startsWith("basedbot-"))) return "https://solscan.io/tx/"; + if (s.side === "sell" && (s.terminal.startsWith("fomo-") || s.terminal.startsWith("pump-fun-") || s.terminal.startsWith("basedbot-"))) return "https://solscan.io/tx/"; return EXPLORERS[s.chain]; } return "https://solscan.io/tx/";