Solana Arbitrage — Feasibility + Passive Measurement (leaning NO-GO)
The 5th strategy explored for slv1. Desk research returned a CONDITIONAL GO to a MEASUREMENT phase only; a passive zero-capital harness (arb-measure/) then measured real cross-venue spreads and is reversing that to a leaning NO-GO — persistent spreads persist precisely because they are not profitably capturable once your own trade’s slippage is priced in.
For Agents
Arbitrage earned a look for one reason the other four strategies never could: it is the first PRINCIPAL-SAFE strategy in the whole slv1 arc. An atomic Jito bundle reverts if the spread is gone by the time it lands → you lose fees, not inventory; flash-loan sourcing pushes at-risk capital → 0. That safety is why it got desk research despite the space being crowded.
- Desk research (
~/coding/slv1/docs/arbitrage-feasibility.md): CONDITIONAL GO to measurement only. Mainstream Solana arb is a solved colocated machine (~90M arbs/yr, 1,800–3,800/mo colo). The only plausible solo lane is thin/long-tail fresh pump.fun→PumpSwap × Meteora-DLMM pairs the giants under-index — but those are latency-INSENSITIVE, so the banked Jito ShredStream is table-stakes for the 3rd time (copy, sniper, arb).- Measurement (
arb-measure/, Python, brancharb-measure-harness): passive, read-only, zero-capital. Discovers long-tail both-venue tokens via DexScreener, WSS-subscribes to pool accounts (slot-stamped), decodes reserves→price, logs cross-venue spread + slot-persistence + depth/slippage-adjusted realizable profit.- Load-bearing finding: the naive mid-price “captured-before-us” metric is a FALSE GO (spreads persist → looks like free money). The depth-adjusted metric reverses it — on $25–100k pools your own arb trade’s slippage eats the 2–3% gap. Leaning NO-GO; a decision-grade 180-min run is collecting now to confirm on a real sample.
- This is measurement, not a build. No keypairs, no bundles, no capital. Do not confuse it with an execution rig.
Why arbitrage was worth a look — PRINCIPAL-SAFE
Every prior slv1 strategy put inventory at risk on a probabilistic edge. Arbitrage is structurally different:
- Atomic execution = no adverse-selection loss. The buy-cheap / sell-dear round trip is submitted as a single atomic Jito bundle. If the spread has closed by the time the bundle lands, the transaction reverts — you forfeit the tip + priority fee, not the position. There is no “bought the top and now hold a bag” failure mode.
- Flash loans push at-risk capital → 0. Source the buy leg from a flash loan repaid inside the same atomic tx and the strategy needs almost no standing inventory. Downside is bounded to fees.
That principal-safety is the single reason arbitrage cleared the bar for desk research when the copy / sniper / co-buy angles had already resolved to NO-GO.
Desk research verdict — CONDITIONAL GO to measurement only
Source of truth: ~/coding/slv1/docs/arbitrage-feasibility.md.
Mainstream arb is a solved, colocated machine — not a solo lane
The liquid DEX-DEX / backrun arena is fully industrialized:
- ~90M arbs/yr on Solana at a $1.58 median capture — a high-volume, razor-thin business.
- ~96% of attempts revert — you are paying tips to lose the race the vast majority of the time.
- Tips eat 50–60% of gross spread — the Jito tip-auction transfers most of the edge to validators.
- Colo runs $1,800–3,800/mo — the incumbents are physically co-located; a remote solo entrant is structurally behind on every liquid pair.
Competing here head-on is a capital- and infra-race against professionals. Rejected.
The one plausible solo lane: thin / long-tail fresh pump.fun→PumpSwap × Meteora-DLMM pools that the giants under-index (too small to bother, too numerous to cover). This is the only niche where a solo operator could find un-arbed spreads.
The recurring trap — even the solo lane is latency-INSENSITIVE
The long-tail niche exists precisely because it is too thin and slow-moving for the colocated machines to care about. That means the edge is not speed — it is finding a real, capturable divergence. The banked Jito ShredStream is therefore table-stakes again, for the 3rd strategy in a row (copy-trading, launch-sniper, now arb). Speed is necessary-not-sufficient; it never becomes the edge.
Target ranking (from the desk research)
| Rank | Target | Verdict | Why |
|---|---|---|---|
| Best (if any) | Atomic long-tail DEX-DEX (PumpSwap × Meteora-DLMM) | Measure first | Only lane the giants under-index; principal-safe via atomic bundle. Latency-insensitive → measurement decides it, not speed. |
| Secondary | Small-protocol liquidations | Possible | Atomic, less crowded than DEX-DEX, but sporadic and protocol-specific. |
| Rejected | Mainstream DEX-DEX / backrun | NO | Solved colocated machine (see warning above). |
| Rejected | CEX-DEX | NO | Capital-heavy (inventory on both sides) and non-atomic — loses the one property that made arb attractive. |
The measurement harness — arb-measure/
Passive, zero-capital, read-only. Python, branch arb-measure-harness. It answers one kill-gate question: when a profitable cross-venue spread appears on a long-tail token, is it still open (and still profitable after slippage) 1–3 slots later, or already gone / never capturable?
Pipeline
- Discover long-tail both-venue tokens via DexScreener (
dex.py) — WSOL-quoted PumpSwap × Meteora-DLMM pairs inside a liquidity band; ~15–30 tokens land intokens.json. - Subscribe (
monitor.py) — WSSaccountSubscribeto each token’s PumpSwap vaults + MeteoraLbPair, plusslotSubscribeas a clock that drives the +1/+2/+3-slot rechecks even when a pool is quiet. Falls back togetMultipleAccountspolling (~450 ms). Auto-reconnects on any WSS drop (the original 28-minConnectionResetcrash no longer ends a run). - Decode reserves → price (
decode.py) straight from on-chain account bytes (offsets confirmed against each program’s IDL). - Detect + slot-stamp cross-venue spreads, then recheck at +1/+2/+3 slots.
- Depth-adjust (
depth.py) — simulate the full arb round trip on the decoded reserves and report realizable profit, not the mid-price gap. - Log to
spreads.jsonl;report.pyre-summarises at any time.
Decoder reconciliation (the correctness gate)
Prices are decoded from raw account bytes, then reconciled against live DexScreener priceNative (3% tolerance):
- PumpSwap (CPMM): price = quote-vault balance / base-vault balance (no reserve field in the struct — the SPL vault balances are the source of truth). Reconciles cleanly — ~16/16 tokens within 3%, median ~0.5%. Effectively exact.
- Meteora DLMM: price from the active bin —
raw = (1 + bin_step/10000)^active_id, decimal-adjusted, inverted when WSOL istoken_x(Meteora does not sort mints). Reconciles for the majority — ~11–12/16 within 3%, median ~2%. The residual is indexer lag on thin pools + bin quantization, not a decode error.
Key finding — the mid-price metric is a FALSE GO; depth reverses it
Persistent spreads persist BECAUSE they are not profitably capturable
The naive mid-price “captured-before-us” metric read as a GO: only ~17% of spreads were captured by +1..+3 slots, so gaps visibly persist → looks like standing opportunity.
Adding the depth / slippage-adjusted realizable-profit metric REVERSED the verdict. Those spreads persist precisely because they are not profitably capturable: on $25–100k pools, your own arb trade’s slippage eats the entire 2–3% spread before you clear a meaningful size. A mid-price gap is not money — it is a gap that would evaporate the instant anyone (including you) tried to take it.
Credible events actually observed
| Token | Mid-price spread | Best realizable | Turns negative at |
|---|---|---|---|
| MENSA | 2.64% | +$1.58 @ 5 SOL | ≥ 10 SOL |
| ANSUM | 2.15% | +$0.37 @ 1 SOL | ≥ 2 SOL |
| median (credible subset) | — | ~$0.33 best-realizable | — |
The realizable profit peaks at a tiny size and goes negative almost immediately above it — there is no size at which this pays for the tip + priority-fee + operational overhead of running the strategy.
And this is an OPTIMISTIC upper bound
The Meteora leg is modelled as a constant-product pool at the active-bin price using the whole pool TVL as tradeable depth. Because DLMM concentrates liquidity, treating full TVL as tradeable at mid overstates depth → understates slippage → overstates profit. Real DLMM depth around the active bin is ~6× thinner, so the true realizable profit is worse than the numbers above. The negative verdict is robust: where even the exact PumpSwap leg alone eats the gap, no Meteora modelling can rescue it.
The one positive-persistent event was a commoditized latency race
Exactly one event showed positive realizable profit that persisted across slots — and it was not a structural inefficiency. It was a pure latency race: the Meteora binned price was lagging PumpSwap by ~3 slots (bin quantization means DLMM price is a step function that only updates on bin crossings). Capturing it is a speed contest against everyone else watching the same feed — commoditized, exactly the arena the desk research said to avoid. This reinforces the meta-pattern: the only “opportunity” the harness found was a speed race, and speed is table-stakes, not edge.
Verdict — leaning NO-GO, decision-grade run confirming
- Desk research: CONDITIONAL GO to measurement only — mainstream arb is a solved colocated machine; the sole solo lane is latency-insensitive long-tail DEX-DEX.
- Measurement so far: leaning NO-GO — realizable profit is ~$0.33 median and peaks at trivial size; the mid-price “opportunity” is an artifact of un-capturability, not of standing edge; the one persistent-positive event was a commoditized latency race; and the model is an optimistic upper bound (truth is worse).
- In progress: a decision-grade 180-minute WSS run is collecting a real sample now (
spreads.jsonl) to confirm the call on statistically meaningful data before the final NO-GO is stamped.
Source of truth
- Desk-research feasibility report:
~/coding/slv1/docs/arbitrage-feasibility.md - Measurement harness:
~/coding/slv1/arb-measure/(brancharb-measure-harness) —monitor.py(resolve→reconcile→subscribe→detect→depth→+k recheck),decode.py(PumpSwap + Meteora decoders),depth.py(round-trip slippage sim),report.py(summary),dex.py(DexScreener discovery),tokens.json,spreads.jsonl - Reconciliation proof:
python monitor.py --reconcile-only; depth demo:python depth.py
Related
- slv1-strategy-candidates-2026-07-04 — the strategy scorecard this NO-GO closes out; arbitrage is the 5th strategy explored
- solv1-alpha-first-verdict-no-go-2026-07-04 — the copy-trading NO-GO that opened the post-copy decision space
- slv1-copy-trading-feasibility-2026-07-03 — where the “latency is table-stakes, not edge” lesson was first established
- solv1-rig-increment-1-build-2026-07-03 — the shelved dual-feed latency rig (the other place ShredStream sat idle)
- slv1 — project overview / strategy pipeline
- LOG · TOPICS