Sanctum and LST Arbitrage: Trading Solana Liquid Staking Tokens
Build a Solana LST arbitrage bot around Sanctum: capture jitoSOL, mSOL and INF peg deviations against SOL via Infinity pool routes and unstake tickets.
jitoSOL trades at a floating premium to SOL that drifts up every epoch as staking rewards accrue, then snaps down the moment someone withdraws liquidity from a pool that priced it lazily. That gap between a liquid staking token's redeemable value and its market price is the whole game here. It is small, usually 5 to 40 basis points, occasionally 100+ when a large deposit or a validator commission change moves the fair value faster than AMMs reprice. Sanctum sits in the middle of most of this flow, and if you understand its two settlement paths — the Infinity multi-LST pool and the unstake/withdraw-stake routes — you can build a bot that harvests those deviations with tighter risk than a generic DEX arb.
Why LSTs are not just another SPL token
An LST like jitoSOL, mSOL, or bSOL has a known fair value at any slot. It is the pool's total SOL under management divided by the token supply, exposed on-chain by the stake pool program. This is the number that matters and the one most naive arb bots ignore. A Jupiter route quoting jitoSOL/SOL tells you the market price. The stake pool account tells you the redeemable price. Arbitrage on LSTs is the trade between those two numbers, not between two DEX quotes.
Concretely, for a Solana stake pool (Marinade, Jito, SolBlaze all use variants) you read:
fair_value = total_lamports / pool_token_supply
total_lamports includes active stake plus the reserve, minus fees. Refresh it every epoch boundary at minimum, and re-derive it whenever you see a large DepositStake/WithdrawStake on the pool. jitoSOL was roughly 1.19 SOL in mid-2026; the exact figure changes each epoch, so hardcoding it is how you lose money the first time a commission changes.
Once you have fair value, an opportunity exists when:
- Market price of the LST on some venue < fair_value − (fees + slippage) → buy LST cheap, redeem for SOL.
- Market price > fair_value + (mint cost + fees) → mint fresh LST by staking SOL, sell into the market.
The second leg is where Sanctum's Infinity pool changes the economics.
Sanctum Infinity: a shared reserve for LSTs
INF is the LP token of Sanctum's Infinity pool, a single reserve that holds many LSTs and prices swaps between them using each token's on-chain fair value plus a fee that scales with how far the pool's composition drifts from target. Practically, Infinity lets you swap jitoSOL → mSOL, or any LST → SOL, in one instruction at a price anchored to fair value rather than to a thin constant-product curve. That anchoring is the point. On a normal AMM, a 500 SOL sell of mSOL eats the curve and you get a terrible fill. Through Infinity, the same size settles near fair value as long as the pool holds enough of the counter-asset.
INF itself is arbitrageable. Its NAV is the sum of the pool's LST holdings valued at fair value, divided by INF supply. When INF's market price on Orca or Raydium drifts below NAV, you buy INF and redeem it against the pool; when it trades above, you mint. Same fair-value-versus-market pattern, one layer up.
The routing decision your bot makes on every opportunity is: settle through Infinity, or settle through the LST's own stake pool unstake path? Two things drive it.
Instant unstake vs. delayed withdraw
Every stake pool offers a delayed WithdrawStake that gives you a native stake account you can deactivate — you get full fair value but wait until the next epoch (up to ~2 days) for the SOL to be liquid. Sanctum also runs an instant unstake that fills you now from a liquidity reserve for a fee, typically 0.1 to 1.0 percent depending on reserve depth. Your bot has to price both:
- If the market discount you captured is 45 bps and instant unstake costs 30 bps, you net 15 bps today — take it.
- If instant unstake costs 90 bps, hold the LST and route through delayed withdraw, accepting epoch risk on the SOL price.
That epoch delay is real inventory risk. SOL can move 5 percent while your stake account deactivates, so a "risk-free" 40 bps arb becomes a directional bet unless you hedge the SOL leg with a perp short. Most desks running this at size do exactly that. If you're building the execution layer for it, the same latency and account-preflight discipline we cover in our Solana MEV and arbitrage bot work applies directly.
A worked example
Suppose jitoSOL fair value is 1.1900 SOL and Jupiter quotes jitoSOL at 1.1840 SOL on a 200-jitoSOL clip. That's a 50 bps discount. Plan:
- Buy 200 jitoSOL for ~236.8 SOL on the market leg.
- Settle through Sanctum instant unstake at 25 bps → receive 200 × 1.1900 × 0.9975 ≈ 237.4 SOL.
- Gross ≈ 0.6 SOL, before priority fees and Jito tips.
The margin is thin enough that transaction landing dominates your P&L. Miss the block and the discount is gone or the market leg re-quotes against you. This is why the bots that actually clear this trade run stake-weighted QoS connections and shred-level feeds rather than public RPC. Our breakdown of stake-weighted QoS and transaction priority explains why a swQoS peer changes your inclusion odds on a busy slot, and the piece on QUIC connection throttling and dropped transactions covers the failure mode where your arb tx simply never reaches the leader.
Gotchas that cost real SOL
Stale fair value. The single biggest bug. If you cache total_lamports and the pool socialized a slashing event or changed commission, your "profit" is a loss. Re-read the pool account inside the same transaction path when possible, or gate on account slot freshness.
Infinity fee curve. The swap fee rises as you push the pool away from its target weights. A big jitoSOL → SOL settle when the pool is already jitoSOL-heavy pays more than the quoted base fee. Simulate the actual instruction, don't assume the base rate.
Two-legged atomicity. Your market buy and your Sanctum settle are usually separate venues, so you can't always jam them into one atomic transaction. If leg one fills and leg two fails, you're holding LST inventory. Either bundle both into one Jito bundle so they land together or fail together, or accept inventory and hedge. Getting fresh, low-latency pool state to make that call is an infra problem more than a trading one — it's the kind of thing our data and infrastructure builds are meant for, and the Jito ShredStream feed is what lets you see the deposit that moves fair value before the AMM reprices.
Reserve exhaustion. Instant unstake can quote 25 bps and then only fill half your size because the reserve is drained. Always read reserve depth before committing the market leg, or you'll capture a discount you can't actually realize.
LST arb rewards teams that treat fair value as ground truth and market price as the noisy signal, then win the landing race consistently. If you want that execution layer built and tuned around Sanctum's routes, take a look at how we approach Solana MEV and arbitrage systems.
Need a bot like this built?
We design, build and run trading bots on Solana, Hyperliquid and Polymarket.
Start a projectMore from the blog
Public vs Paid RPC: How to Run a Fair Benchmark
A fair comparison of public and paid RPC endpoints must account for quotas, workload, freshness and support guarantees.
Read articleRPC Benchmark Percentiles Explained: p50, p95 and p99
Why averages hide the latency spikes that break trading bots, wallets and production blockchain applications.
Read articleHyperliquid REST vs WebSocket Benchmark: What to Measure
A benchmark plan for Hyperliquid market data that separates request latency from streaming freshness and recovery.
Read article