Solana arbitrage bot setup: a practical guide

Written by:

Maksym Bogdan

9

min read

Date:

March 12, 2026

Updated on:

March 11, 2026

Arbitrage on Solana is mechanical: the same token trades at different prices across Raydium, Orca, Meteora, and Phoenix at any given moment. A bot that spots the gap and closes it faster than everyone else captures the spread. The chain handles the rest—transactions are atomic, so if either leg of the trade fails, the whole thing reverts. No partial fills, no stuck positions.

In 2025, arbitrage accounted for roughly 50% of Solana's average DEX volume. Over 90 million successful arbitrage transactions were recorded through Jito's detection system—generating $142.8 million in combined profits.

Most bots don't capture any of it. Not because the strategy is wrong, but because the setup is. A bot reading prices from a public RPC is already 200ms behind the bots co-located next to validators. A bot using WebSocket subscriptions instead of Geyser gRPC misses price updates that arrive between polling intervals. A bot submitting through standard RPC instead of Jito bundles loses to bots that guarantee execution order.

The logic is secondary. Infrastructure is the entry ticket.

What a Solana arbitrage bot actually does

The core loop has five steps:

Step What happens
1. State monitoring Bot maintains a live copy of DEX pool accounts locally. Subscribes via Geyser gRPC (Yellowstone)—account state arrives directly from validator memory, not RPC polling.
2. Route discovery Path-finding logic scans for price gaps across target DEX pools exceeding a configured profit threshold after fees and slippage.
3. Tx construction When a gap is found, both swap instructions (buy on DEX A, sell on DEX B) are bundled into a single atomic transaction.
4. Submission Sent via Jito bundle with a SOL tip, guaranteeing execution order within the block. Standard RPC used as fallback.
5. Settlement Bundle lands (profit captured) or reverts. If reverted, only the compute budget fee is lost—not the principal.

Setup guide

Step 1: Choose your stack

Most production arbitrage bots on Solana run in Rust or TypeScript. The choice has real performance implications:

Rust TypeScript
Latency Lower—compiled, no GC pauses Higher—runtime overhead
Dev speed Slower Faster to start
Key libraries solana-sdk, anchor-client, jito-searcher-client @solana/web3.js, jito-ts, @jito-foundation/mev-sdk
Best for HFT, sub-50ms latency targets Prototyping, mid-frequency strategies

For a first production bot, TypeScript is a reasonable starting point. For anything competing in the sub-slot latency tier, Rust is not optional.

Step 2: DEX coverage

Minimum viable coverage in 2026:

  • Raydium (CPMM and CLMM pools)—largest DEX by volume on Solana
  • Orca Whirlpool—concentrated liquidity, high volume on major pairs
  • Meteora DLMM—dynamic liquidity, strong memecoin flow
  • Phoenix—on-chain order book, useful for CEX-DEX arb

Jupiter as a routing layer helps with quote discovery. Their self-hosted jupiter-swap-api binary can be queried locally at millisecond latency, aggregating quotes across 30+ DEXs without hitting public endpoints.

Start with 2–3 DEX pairs on high-liquidity tokens (SOL/USDC, SOL/USDT). Prove the logic works, then expand.

Step 3: Configure your RPC and data feed

This is where most setups fail. A working .env configuration:

RPC_ENDPOINT=https://your-dedicated-rpc-endpoint
RPC_WEBSOCKET=wss://your-dedicated-rpc-endpoint
GEYSER_RPC=grpc://your-geyser-endpoint:10000
JITO_BLOCK_ENGINE=ny.mainnet.block-engine.jito.wtf
COMMITMENT=processed

Key decisions:

  • Use processed commitment, not confirmed or finalized—you need the freshest possible state, and arbitrage reverts safely if the slot reorganizes
  • Never use a public RPC in production—rate limits kick in during congestion, and you're competing against bots with dedicated endpoints
  • Geyser gRPC over WebSocket—Yellowstone streams push account updates directly from validator memory, sub-50ms latency vs 100–300ms for standard WebSocket

Subscribe to specific pool accounts, not all transactions. Filter at the server level:

const subscribeRequest = {
  accounts: {
    raydium_sol_usdc: {
      account: ['POOL_ACCOUNT_ADDRESS'],
      filters: []
    }
  },
  commitment: CommitmentLevel.PROCESSED
};

Step 4: Jito bundle configuration

Standard RPC submission enters the gossip network and competes randomly for block inclusion. Jito bundles guarantee atomic execution in order—if the bundle doesn't land, none of the transactions execute.

JITO_MODE=true
JITO_FEE=0.0003           # base tip in SOL
FEE_LEVEL=5               # priority fee multiplier
MAX_JITO_TIP_LAMPORTS=5000000
Arbitrage bots on Solana typically pay 50–60% of expected profit in Jito tips to outbid competing searchers. Too low: bundle gets skipped. Too high: strategy turns unprofitable.

Tip calibration: start at 50% of estimated profit, monitor bundle acceptance rate, adjust from there. Send to multiple block engine endpoints in parallel—US East, EU, Tokyo—to improve inclusion across different slot leaders.

Step 5: Slippage and risk controls

SLIPPAGE=10              # max slippage in basis points (0.1%)
PROFIT_LEVEL=10          # minimum profit threshold in BPS
MIN_PROFIT_ONCHAIN=5     # on-chain profit check—reverts if below
MAX_ACCOUNTS=25          # Solana tx limit = 60 accounts; 25 per side + slack

Always run simulateTransaction before bundle submission on high-value opportunities. Simulation catches routes that look profitable off-chain but fail on-chain due to pool state changes between detection and execution. A failed simulation costs zero. A failed bundle with a large Jito tip does not.

Step 6: Test before mainnet

Run the bot on devnet with simulated transactions. Monitor these metrics before going live:

Metric What to look for
Route detection latency Time from state update to opportunity identified—target under 50ms
Tx construction time Should be sub-10ms for competitive strategies
Bundle acceptance rate Track per block engine; low rate = tip too low or late arrival
Revert rate Above 30% signals latency issue, slippage misconfiguration, or route discovery bug

The infrastructure ceiling

A working arbitrage bot can be assembled in a weekend. A profitable one is a different problem—and it is almost entirely an infrastructure problem.

The bots at the top of the stack run on bare-metal EPYC servers colocated in the same data centers as high-stake validators. They receive Geyser updates before most RPC nodes even see the slot. They submit bundles to Jito and bloXroute in parallel, with dynamic tip calibration. They have 24/7 monitoring and automated failover.

"The logic is usually fine. What kills most bots is the RPC. They're reading stale state, submitting too late, and losing to searchers who built their setup around the validator, not around a cloud endpoint. When we tune a bot's infrastructure—dedicated bare-metal, Geyser feeds, parallel relay submission—the latency profile changes completely. That's where the edge actually comes from."

— RPC Fast / Dysnix team, based on tuning 100+ Solana trading bots in production

If your bot logic is solid and you're still losing consistently, the bottleneck is almost certainly your data feed or submission path—not the strategy. RPC Fast's dedicated infrastructure for Solana arbitrage bots includes bare-metal compute, Yellowstone gRPC, native Jito and bloXroute integration, and SWQoS-enabled transaction forwarding.

Table of Content

Need help with Web3 infrastructure?

Drop a line
More articles

Market insights

All

Written by:

Olha Diachuk

Date:

11 Mar 26

8

min read

Guide

All

Written by:

Maksym Bogdan

Date:

10 Mar 26

9

min read