If you're building anything that touches token launches, swaps, or liquidity on Solana, you've been front-run. Maybe you didn't notice — a few cents here, a few dollars there. But at scale, MEV (Maximal Extractable Value) bots are siphoning value from every unprotected transaction.
In 2024, Jito bundles became the standard defense. In 2026, the landscape is more complex. Here's what actually works, what doesn't, and how to choose between Jito, Astralane, and Quicknode Lil-JIT.
The Problem: Why Standard Transactions Get Eaten
When you submit a transaction to Solana's mempool, it's visible to everyone before it lands in a block. MEV bots monitor pending transactions and:
- Front-run — see your buy, buy before you, sell after your price impact
- Sandwich — buy before you AND sell after you, profiting from the spread
- Back-run — execute immediately after your large trade to capture arbitrage
On Ethereum, MEV is a ~$200M/year problem. On Solana, it's growing fast because Solana's speed means bots can react in milliseconds.
Your transaction → Mempool → Bot sees it → Bot front-runs → You get worse price
Solution 1: Jito Bundles (The Standard)
Jito Labs built the dominant MEV protection layer for Solana. The core concept: instead of submitting transactions to the public mempool, you submit a bundle directly to Jito-powered validators.
A bundle is an ordered sequence of transactions that execute atomically:
import { SearcherClient } from 'jito-ts/dist/sdk/block-engine/searcher';
async function submitProtectedSwap(transactions: Transaction[]) {
const searcher = SearcherClient.connect(JITO_BLOCK_ENGINE_URL);
// Add tip to incentivize validator inclusion
const tipIx = SystemProgram.transfer({
fromPubkey: payer.publicKey,
toPubkey: getRandomTipAccount(), // Jito rotates tip accounts
lamports: 0.005 * LAMPORTS_PER_SOL,
});
// Attach tip to last transaction
transactions[transactions.length - 1].add(tipIx);
// Sign all
transactions.forEach(tx => tx.sign(/* signers */));
// Submit atomically
const bundleId = await searcher.sendBundle(transactions);
return bundleId;
}
Pros:
- Mature ecosystem, widely adopted
- Atomic execution (all-or-nothing)
- ~70% of Solana validators run Jito
- Good TypeScript SDK
Cons:
- Tip economics are opaque (how much is enough?)
- Bundle landing rate drops during congestion
- Other bundlers can see your bundle if they're also Jito validators
Tip sweet spot: 0.003-0.01 SOL for standard operations. For high-value launches, 0.01-0.05 SOL.
Solution 2: Astralane
Astralane takes a different approach. Instead of bundling at the validator level, it uses a private relay network. Your transactions travel through encrypted channels and only become visible at the execution moment.
The advantage: your intent is hidden not just from the mempool, but from the validators themselves until the last possible moment.
// Astralane integration (simplified)
const astralane = new AstralaneClient({
endpoint: ASTRALANE_RELAY_URL,
apiKey: ASTRALANE_KEY,
});
const result = await astralane.sendProtected({
transactions: signedTxs,
maxSlippage: 0.5, // 0.5% max acceptable slippage
priority: 'high',
});
Pros:
- Stronger privacy guarantees
- Good for high-value operations where bundle inspection is a risk
- Slippage protection built in
Cons:
- Smaller validator coverage than Jito
- Higher latency (extra relay hop)
- Newer, less battle-tested
Solution 3: Quicknode Lil-JIT
Quicknode's Lil-JIT is the newest entrant. It leverages Quicknode's existing RPC infrastructure to provide MEV protection as an RPC add-on. You don't change your transaction submission code — you just point to a different RPC endpoint.
// Almost zero code changes
const connection = new Connection(
'https://your-quicknode-endpoint.com/lil-jit',
'confirmed'
);
// Submit normally — Lil-JIT handles protection
const sig = await connection.sendTransaction(signedTx);
Pros:
- Minimal integration effort
- Works with existing code
- Quicknode's infrastructure reliability
Cons:
- Less granular control than Jito bundles
- Can't guarantee atomic multi-tx execution
- Limited to Quicknode users
When to Use What
| Scenario | Best Option | Why |
|---|---|---|
| Token launch (multi-tx atomic) | Jito Bundles | Need atomic execution of create + buy |
| High-value single swap | Astralane | Maximum privacy, slippage protection |
| Standard DeFi operations | Lil-JIT | Minimal code change, good enough protection |
| Bundle of 10+ wallets buying | Jito Bundles | Only Jito handles large atomic bundles |
| Privacy-critical arbitrage | Astralane | Intent hiding from validators |
Real-World Architecture: Multi-Strategy Approach
The best approach isn't picking one — it's building an abstraction layer that can use all three. We did this when building AURON, a Solana trading terminal at Gerus-lab. The system manages hundreds of wallets and needs different strategies for different operations.
The pattern: a Platform Factory that abstracts submission strategy:
interface SubmissionStrategy {
name: 'jito' | 'astralane' | 'liljit' | 'raw';
submit(txs: Transaction[]): Promise<string>;
estimateCost(txCount: number): number;
}
class TransactionRouter {
private strategies: Map<string, SubmissionStrategy>;
async submit(txs: Transaction[], opts: SubmitOptions): Promise<string> {
// Choose strategy based on operation type
if (opts.atomic && txs.length > 1) {
return this.strategies.get('jito')!.submit(txs);
}
if (opts.highPrivacy) {
return this.strategies.get('astralane')!.submit(txs);
}
// Default: lowest cost option
return this.strategies.get('liljit')!.submit(txs);
}
}
This also gives you automatic failover. If Jito is congested and bundles aren't landing, fall back to Astralane. If both are slow, try Lil-JIT or even raw submission with high priority fees.
The Data Layer: gRPC for Speed
Regardless of which submission strategy you use, detection speed matters. If you're building a sniper, a bundler, or any MEV-adjacent tool, you need faster-than-WebSocket data.
@triton-one/yellowstone-grpc gives you millisecond-level on-chain updates via gRPC streaming. This is what powers most serious Solana trading infrastructure in 2026:
import { Client } from '@triton-one/yellowstone-grpc';
const client = new Client(GRPC_ENDPOINT, GRPC_TOKEN);
const stream = await client.subscribe();
// Filter for specific program interactions
stream.on('data', (update) => {
// React to pool creation, swap execution, etc.
// Latency: 1-5ms vs 50-200ms for WebSockets
});
The latency difference between gRPC and WebSockets (1-5ms vs 50-200ms) is the difference between profitable and unprofitable in competitive DeFi.
Mistakes We Made
Starting with raw transactions. Our first token launch tests used standard RPC submission. Front-running was immediate. We lost 2 SOL before switching to Jito. Lesson: never submit unprotected transactions for anything involving liquidity.
Fixed tip amounts. We hardcoded 0.005 SOL tips. During congestion, bundles stopped landing. Now we use dynamic tipping based on recent block stats.
Not simulating before submit. Bundles that fail on-chain waste your tip. Always simulate:
for (const tx of bundle) {
const sim = await connection.simulateTransaction(tx);
if (sim.value.err) throw new Error(`Would fail: ${JSON.stringify(sim.value.err)}`);
}
Trusting RPC latency. Public RPCs add 200-800ms. For MEV-sensitive operations, dedicated infrastructure is non-negotiable.
What's Next
The MEV landscape on Solana evolves quarterly. Trends to watch:
- Intent-based protocols — submit what you want to achieve, let solvers figure out how
- Encrypted mempools — threshold encryption prevents anyone from reading pending txs
- Cross-chain MEV — arbitrage across Solana - Ethereum bridges
The protection tooling will keep evolving, but the architecture pattern stays the same: abstract your submission layer, support multiple strategies, and always simulate before you send.
We built MEV-protected systems at Gerus-lab, including AURON — a high-performance Solana trading terminal. If you're building DeFi infrastructure and need this kind of architecture — reach out.
Top comments (0)