Trading terminal fill quality 2026: what a swap costs on Axiom, GMGN, FOMO, Photon, Trojan, measured on-chain
Value lost per swap on each trading terminal, wallet app or Telegram bot (Solana and five EVM chains), from real user transactions read on-chain and valued at the pool's own state before the trade. Split into what the terminal takes, what the network takes, what pump.fun and the pool take, plus the share of swap attempts that fail. Rolling 24 hours, refreshed every few minutes.
TL;DR. As of , FOMO posts the lowest cost per swap at 338 bps (p50, 24h) across 8 ranked providers. Source: OpenChainBench, https://openchainbench.com/benchmarks/terminal-fill-quality. Every swap behind these medians is listed below, one row per transaction with its explorer link.
Read this carefully
Random sample (150 a day per row, Solana and EVM alike) of the swaps each terminal routed, every attempt counted for the fail rate. Reference = the pool's state before the swap (its reserves, or the previous trade within 60 s); swaps without one keep their split, no loss figure. Published from 50 priced swaps pooled over the product's chains at 25 or more (a single-chain product from 25), ranked from 100; the median's 95 % interval is in the JSON. Compare medians, not single swaps.
Every trading terminal advertises a fee. What a swap actually costs is the fee plus the priority fee and the inclusion tip the app attaches, plus what pump.fun or the pool keep on the way, plus the price impact of the swap itself against the pool's state just before it landed, plus the swaps that fail and still burn the priority fee. None of that is in the fee schedule, all of it is in the transaction. This benchmark reads real user swaps on Solana and on the EVM chains they trade on for Axiom, GMGN, FOMO, Phantom, Photon, Trojan, Bloom, Maestro, Pepeboost, BONKbot, Banana Gun, Binance Wallet, Terminal, BasedBot and pump.fun's own app, values the tokens received at the pool's state before the swap (its reserves, or the previous trade on it seconds earlier) and publishes the median shortfall in basis points with its split: terminal, network, pool, other. A terminal fee of 1 % is 100 bps; the median swap on most terminals loses three to five times that.
Methodology
Each terminal takes its fee through known wallets. A live WebSocket feed of every transaction mentioning those wallets, with its program logs, says which ones attempted a swap and whether they failed; the harness counts them all (fail rate) and reads 150 successful ones per row per day, drawn at random. From the pre/post balances of every account in the transaction it derives, in quote units (SOL or a $1 stable), what left the user, what the pool received, what reached the terminal's fee wallets (on the EVM rows: the router's residual after the pool and the gas), the tx fee and the inclusion tips, and the rest (pump.fun protocol and creator fees, referral payouts). The pool is the vault pair of the swap instruction, by pubkey, so a hop through another pool of the same program is never mistaken for pool impact. The token leg is valued at the pool's mid before the swap: exactly from the pool's pre-trade balances in the transaction on PumpSwap (with the virtual quote reserve its migrated pools store) and Raydium, else at the effective price of the previous trade on the same pool, at most 60 seconds earlier. Loss = 1 − value received / value given, in basis points of the trade; terminal, network and other are exact and independent of the reference, pool is the remainder. Rolling 24 hour window, medians with a bootstrap interval, p90, trade size and venue mix per terminal; published from 50 priced swaps, ranked from 100.
Results: 13 providers measured, 8 ranked by Cost per swap (p50, 24h)
| № | Providers | p50 | Terminal fee | Network | Pool | Success | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | FOMO | 338 bps | 150 bps | 25.8 bps | 109 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 2 | GMGN | 345 bps | 100 bps | 22.7 bps | 66.5 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 3 | Axiom | 397 bps | 86.9 bps | 12.8 bps | 138 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 4 | BONKbot | 417 bps | 98.8 bps | 50.0 bps | 65.6 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 5 | Trojan | 440 bps | 97.6 bps | 75.9 bps | 68.9 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 6 | Terminal | 444 bps | 98.5 bps | 27.5 bps | 59.2 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 7 | Pepeboost | 484 bps | 97.7 bps | 36.8 bps | 78.0 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 8 | Maestro | 489 bps | 98.1 bps | 83.7 bps | 116 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Measured, not ranked: sample below the ranking floor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not ranked | Binance Wallet | 208 bps | 49.6 bps | 12.8 bps | 122 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not ranked | pump.fun app | 239 bps | 0 bps | 3.86 bps | 52.9 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not ranked | Phantom | 258 bps | 84.7 bps | 8.83 bps | 104 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not ranked | Photon | 414 bps | 98.1 bps | 54.3 bps | 47.2 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| not ranked | Bloom | 476 bps | 98.9 bps | 92.8 bps | 61.2 bps | 100.00% | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Every transaction behind these numbers
The most recent transactions of each row (3000 in all, 2660priced), so every published figure has its own evidence here. These are a sample, not the statistic: the medians above are computed over the full rolling window, which is far more swaps than a row shows here, so a row's handful of transactions will not reproduce its median. Click a hash to open it on Solscan and check every figure against the transaction's balances: Loss = 1 − value received / value given; Fee + Net + Protocol + Pool (+ Relay on the cross-chain rows) = Loss. Ref says what the tokens were valued at (reserves: the pool's exact mid before the swap; pool: the previous trade on the same pool, age in seconds). A ! marks a row outside the plausible bounds, kept out of the statistics.
method v5 · as of Sun, 11 Oct 2026 19:40:17 UTC
| When | Terminal | Transaction | Side · route | Trade | In $ | Out $ | Loss | Where it goes | App fee | Net | Protocol | Pool | Rent | Reference | Sandwich |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10-11 19:39:09 | RpttkP…Md7z | buyraydium-cpmm1via X | $31 | $31 | $27 | 1342 | 89 | 1119 | 0 | 134 | $0.17 | exact mid | — | ||
| 10-11 19:39:09 | 5eMMQ6…gvT6 | buypumpswap1 | $50 | $50 | $48 | 348 | 179 | 11 | 7 | 151 | — | exact mid | clean | ||
| 10-11 19:39:04 | 4rWRFz…vEEE | sellpump-curve | $88 | $88 | $84 | 543 | 104 | 152 | 123 | 164 | — | exact mid | clean | ||
| 10-11 19:38:30 | 0xb813…48ca | buyuniswap-v3from Solana | $3.49 | $3.49 | $3.40 | 255 | 50 | 139 | 0 | 30 | — | exact mid | — | ||
| 10-11 19:38:17 | 0x8967…bfa1 | buyuniswap-v2from BNB | $76 | $76 | $74 | 202 | 99 | 35 | 0 | 68 | — | exact mid | — | ||
| 10-11 19:38:06 | rdtZKf…eo6L | buypumpswap | $39 | $39 | $38 | 304 | 99 | 71 | 97 | 36 | $0.17 | exact mid | clean | ||
| 10-11 19:38:03 | 1Ldihd…x6X2 | buyraydium-cpmm2via X | $23 | $23 | $22 | 480 | 98 | 123 | 62 | 198 | $0.17 | exact mid | clean | ||
| 10-11 19:36:33 | 5FL8ss…nuBZ | buypump-curve1via X | $70 | $70 | $67 | 464 | 103 | 80 | 46 | 235 | $0.34 | previous trade0s | clean | ||
| 10-11 19:36:30 | 52WAKz…CRFf | buypumpswap1via X | $6.18 | $6.18 | $5.54 | 1034 | 90 | 902 | 9 | 33 | — | exact mid | clean | ||
| 10-11 19:36:13 | 0xcb1b…e754 | buyuniswap-v4from Solana | $100 | $100 | $97 | 323 | 50 | 4 | 0 | 268 | — | exact mid | — | ||
| 10-11 19:36:04 | 4qpKG8…BBAY | buypumpswap | $12 | $12 | $11 | 545 | 97 | 243 | 182 | 23 | $0.17 | exact mid | clean | ||
| 10-11 19:35:16 | 0xdc57…6218 | buyuniswap-v41from Ethereum | $21 | $21 | $20 | 466 | 194 | 263 | 0 | 9 | — | exact mid | — | ||
| 10-11 19:35:16 | 0xc101…98c0 | buyuniswap-v2from Ethereum | $127 | $127 | $121 | 483 | 98 | 150 | 0 | 236 | — | exact mid | — | ||
| 10-11 19:35:16 | 0xf10b…3120 | buyuniswap-v4from Ethereum | $351 | $351 | $327 | 676 | 59 | 3 | 0 | 613 | — | exact mid | — | ||
| 10-11 19:35:16 | 0x5b2b…741e | buylaunchpad-curvefrom Robinhood | $25 | $25 | $24 | 453 | 100 | 5 | 297 | 52 | — | exact mid | — | ||
| 10-11 19:35:16 | 0x7806…cb37 | buyuniswap-v4from Robinhood | $506 | $506 | $489 | 345! | 99 | 0 | 0 | 246 | — | exact mid | — | ||
| 10-11 19:34:09 | 39uqiL…bbPV | sellpump-curve1via X | $5.09 | $5.09 | $4.48 | 1210 | 99 | 987 | 125 | -1 | $0.17 | previous trade0s | clean | ||
| 10-11 19:34:07 | 0x5457…a462 | buyuniswap-v41from Solana | $100 | $100 | $97 | 312 | 50 | 17 | 0 | 245 | — | exact mid | — | ||
| 10-11 19:33:28 | 4E3QX4…t98b | buypumpswap | $5.93 | $5.93 | $5.49 | 739 | 94 | 327 | 290 | 28 | $0.17 | exact mid | clean | ||
| 10-11 19:33:01 | 3taxfC…UFzc | buypumpswap4 | $100 | $100 | — | — | 0 | 36 | — | — | $0.34 | unpriced | clean | ||
| 10-11 19:32:19 | 0x6449…0250 | selluniswap-v4from Robinhood | $39 | $39 | $38 | 319 | 98 | 3 | 0 | 217 | — | exact mid | — | ||
| 10-11 19:32:19 | 0x708d…ce20 | buyuniswap-v21from BNB | $76 | $76 | $72 | 561 | 99 | 122 | 0 | 340 | — | exact mid | — | ||
| 10-11 19:32:19 | 0x20f6…e98d | buyuniswap-v3from Base | $888 | $888 | $878 | 118 | 49 | 0 | 0 | 69 | — | exact mid | — | ||
| 10-11 19:32:19 | 0x8a26…89c5 | buyuniswap-v4from Robinhood | $114 | $114 | $107 | 651 | 98 | 225 | 0 | 328 | — | exact mid | — | ||
| 10-11 19:31:56 | 0x6ee2…f030 | buyuniswap-v4from Solana | $4.52 | $4.52 | $4.42 | 217 | 45 | 71 | 0 | 99 | — | exact mid | — | ||
| 10-11 19:29:46 | 4xFtzc…Q2ss | buypump-curve2via X | $11 | $11 | $11 | 509 | 85 | 20 | 128 | 276 | — | previous trade0s | clean | ||
| 10-11 19:29:26 | E6gsA5…Vcck | buymeteora-dlmm3 | $196 | $196 | $190 | 289 | 50 | 0 | 4 | 235 | — | exact mid | — | ||
| 10-11 19:29:24 | 0xdcce…acea | buyuniswap-v3from Solana | $100 | $100 | $99 | 110 | 50 | 26 | 0 | 33 | — | exact mid | — | ||
| 10-11 19:29:17 | 0xbc32…75b8 | buyuniswap-v32from Base | $98 | $98 | $96 | 251 | 100 | 2 | 0 | 148 | — | exact mid | — | ||
| 10-11 19:28:55 | 3NcCkd…TmuW | sellpump-curve1via X | $6.18 | $6.18 | $5.88 | 492 | 98 | 19 | 304 | 71 | — | previous trade0s | clean | ||
| 10-11 19:28:37 | 0xb727…6842 | buyuniswap-v3from Solana | $500 | $500 | $490 | 209 | 5 | 3 | 0 | 179 | — | exact mid | — | ||
| 10-11 19:28:24 | 3cM5ML…ZTRn | sellmeteora-dlmm | $100 | $100 | $98 | 185 | 84 | 1 | 0 | 100 | — | exact mid | clean | ||
| 10-11 19:26:16 | 0xbe25…5ce5 | selluniswap-v3from HyperEVM | $242 | $242 | $239 | 142 | 99 | 6 | 0 | 37 | — | exact mid | — | ||
| 10-11 19:24:07 | 4rE5jA…bE6K | buypumpswap3via X | $14 | $14 | $14 | 282 | 0 | 243 | 0 | 39 | $0.34 | exact mid | clean | ||
| 10-11 19:24:03 | 0x3ae5…ec38 | selluniswap-v31from Base | $22 | $22 | $22 | 166 | 50 | 3 | 0 | 113 | — | exact mid | — | ||
| 10-11 19:24:03 | 0x75eb…b551 | buyfour-memefrom BNB | $5.03 | $5.03 | $4.92 | 209 | 50 | 57 | 98 | 4 | — | exact mid | — | ||
| 10-11 19:24:03 | 0x2baa…5b85 | buyuniswap-v4from Robinhood | $118 | $118 | $113 | 440 | 100 | 3 | 0 | 336 | — | exact mid | — | ||
| 10-11 19:22:30 | 3MQ4KE…qS5Q | sellpumpswap | $27 | $27 | $27 | 27 | 0 | 2 | 124 | -100 | — | exact mid | clean | ||
| 10-11 19:22:04 | 2p5dv8…NRvL | sellpump-curve | $14 | $14 | $13 | 333 | 99 | 90 | 125 | 20 | — | exact mid | — | ||
| 10-11 19:20:21 | 4C8VDa…qJUg | sellpump-curve2 | $11 | $11 | $11 | 339 | 160 | 40 | 52 | 87 | — | exact mid | clean | ||
| 10-11 19:20:14 | 0xa46f…fa8b | selluniswap-v4from Base | $179 | $179 | $170 | 497! | 192 | 4 | 0 | 301 | — | exact mid | — | ||
| 10-11 19:20:07 | 5WCy2d…CKfp | buypump-curve | $4.74 | $4.74 | $4.35 | 831 | 94 | 380 | 349 | 8 | $0.17 | exact mid | clean | ||
| 10-11 19:19:53 | 2Qah2Y…oJTd | sellpump-curve2via X | $28 | $28 | $27 | 401 | 97 | 1 | 117 | 187 | — | previous trade0s | clean | ||
| 10-11 19:19:23 | 0xee89…efbe | buyuniswap-v21from Solana | $2.00 | $2.00 | $1.89 | 529 | 45 | 435 | 0 | 24 | — | exact mid | — | ||
| 10-11 19:19:06 | 4n6ySv…HfPS | sellpumpswap | $4.72 | $4.72 | $4.66 | 138 | 85 | 19 | 102 | -68 | — | exact mid | clean | ||
| 10-11 19:17:49 | 33e44U…1EKm | buypumpswap | $131 | $131 | $122 | 688 | 100 | 9 | 93 | 487 | — | exact mid | clean | ||
| 10-11 19:17:12 | 0x4b05…a987 | buyuniswap-v2from BNB | $15 | $15 | $13 | 1632 | 98 | 149 | 0 | 1385 | — | exact mid | — | ||
| 10-11 19:17:12 | 0x8673…5938 | buyuniswap-v4from Robinhood | $5.08 | $5.08 | $5.02 | 126 | 99 | 25 | 0 | 2 | — | exact mid | — | ||
| 10-11 19:16:44 | 3UxvSj…39iz | buypumpswap1via X | $4.50 | $4.50 | $4.40 | 227 | 99 | 4 | 105 | 20 | — | exact mid | clean | ||
| 10-11 19:16:39 | 0x621b…f96c | buyuniswap-v2from Solana | $25 | $25 | $25 | 134 | 50 | 16 | 0 | 63 | — | exact mid | — |
Frequently asked
What is the reference price and why does it matter?
The token side of a swap has no price of its own; it has to be valued at something. This bench values it at the pool's mid price just before the swap: exactly, from the pool's own pre-trade balances in the transaction, on PumpSwap (with the virtual quote reserve its migrated pools store), Raydium, Launchpad, Meteora DLMM, four.meme and the EVM pools; and, where the pool's formula is not known or the route crosses several pools, at the effective price of the previous trade on the same pool, at most 60 seconds earlier and usually under one. That is the arrival price a TCA desk would use. Valuing at the price after the swap would hide the trade's own impact. When neither is available the swap keeps its exact cost split but no loss figure; no off-chain token price is used for the token side; on the EVM rows the gas-coin leg is valued at the route's own stable-to-gas hop pre-trade mid (the executed rate as fallback), and origin gas at Coinbase spot.
Why is the loss much larger than the terminal's 1 % fee?
Because the fee is one of five costs. On a pump.fun curve or PumpSwap trade the protocol and creator fees add roughly 1 to 1.4 %, the pool keeps its LP fee and the price impact of the trade, the app attaches a priority fee and often an inclusion tip, and the pool's price may already have moved between the arrival trade and ours. The split is published per terminal so the terminal-attributable part is visible on its own.
Is this comparable across terminals?
The explicit components (terminal, network) are exact and terminal-attributable. The pool component depends on what users trade and how much, which differs per app (Photon's and FOMO's median swaps are about $20), so read the total loss together with the trade size column and the size buckets. A terminal is marked ranked from 100 priced swaps; read the 95 % interval next to each median, adjacent ranks often overlap; single swaps are not comparable.
Are sandwiches counted?
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.
How is a swap attributed to a terminal?
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 code github.com/ChainBench/OpenChainBench/tree/main/harnesses/terminal-fill-quality