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
6 changes: 3 additions & 3 deletions benchmarks/terminal-fill-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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"}
Expand Down
2 changes: 1 addition & 1 deletion harnesses/terminal-fill-quality/cmd/script/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 8 additions & 0 deletions harnesses/terminal-fill-quality/cmd/script/xchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
2 changes: 1 addition & 1 deletion src/components/terminal-fill-section.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@
</table>
</div>
<p className="mb-6 flex flex-wrap gap-x-4 gap-y-1 text-[11px] text-ink-soft">
<span className="text-ink-faint">Split columns are medians of each cost in basis points of the trade (100 bps = 1 %), each chain's median weighted by its flow on a multi-chain product; they do not sum to the median loss, the per-swap sums do (audit table).</span>

Check failure on line 150 in src/components/terminal-fill-section.tsx

View workflow job for this annotation

GitHub Actions / check

`'` can be escaped with `&apos;`, `&lsquo;`, `&#39;`, `&rsquo;`
{PARTS.map((c) => (
<span key={c} className="inline-flex items-center gap-1.5">
<i className="inline-block h-2 w-2 rounded-sm" style={{ background: COLORS[c] }} />
Expand Down Expand Up @@ -217,7 +217,7 @@
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 {
Expand Down
4 changes: 2 additions & 2 deletions src/components/terminal-fill-swaps.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -307,7 +307,7 @@ const EXPLORERS: Record<string, string> = { 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/";
Expand Down
Loading