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, branch arb-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)

RankTargetVerdictWhy
Best (if any)Atomic long-tail DEX-DEX (PumpSwap × Meteora-DLMM)Measure firstOnly lane the giants under-index; principal-safe via atomic bundle. Latency-insensitive → measurement decides it, not speed.
SecondarySmall-protocol liquidationsPossibleAtomic, less crowded than DEX-DEX, but sporadic and protocol-specific.
RejectedMainstream DEX-DEX / backrunNOSolved colocated machine (see warning above).
RejectedCEX-DEXNOCapital-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

  1. Discover long-tail both-venue tokens via DexScreener (dex.py) — WSOL-quoted PumpSwap × Meteora-DLMM pairs inside a liquidity band; ~15–30 tokens land in tokens.json.
  2. Subscribe (monitor.py) — WSS accountSubscribe to each token’s PumpSwap vaults + Meteora LbPair, plus slotSubscribe as a clock that drives the +1/+2/+3-slot rechecks even when a pool is quiet. Falls back to getMultipleAccounts polling (~450 ms). Auto-reconnects on any WSS drop (the original 28-min ConnectionReset crash no longer ends a run).
  3. Decode reserves → price (decode.py) straight from on-chain account bytes (offsets confirmed against each program’s IDL).
  4. Detect + slot-stamp cross-venue spreads, then recheck at +1/+2/+3 slots.
  5. Depth-adjust (depth.py) — simulate the full arb round trip on the decoded reserves and report realizable profit, not the mid-price gap.
  6. Log to spreads.jsonl; report.py re-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 binraw = (1 + bin_step/10000)^active_id, decimal-adjusted, inverted when WSOL is token_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

TokenMid-price spreadBest realizableTurns negative at
MENSA2.64%+$1.58 @ 5 SOL≥ 10 SOL
ANSUM2.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/ (branch arb-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