Jito Bundle Failure Risk: Handling Reverts, Tips & Uncled Bundles
A practical jito bundle failure risk management guide: model tip bleed, bound uncled-bundle cost, and stop partial-fill exposure from silently draining a searcher bot.
A Jito bundle that lands one transaction and drops the other isn't a "failed" trade in your PnL export — it's a silent leak. Your tip left the wallet, your arb leg reverted, and the accounting ledger shows a clean zero while your SOL balance quietly bled. Most searcher bots I've reviewed track fill rate and ignore this class of loss entirely, which is exactly why it compounds.
Getting jito bundle failure risk management right means treating every bundle submission as a probabilistic spend, not a binary send. Here's the cost model that actually matters, and the guardrails that keep it bounded.
What actually happens when a bundle fails
Jito bundles are atomic within the bundle — either all transactions land in the same block, or none do. That's the guarantee people quote. What they forget is what happens around that guarantee:
- Uncled / dropped bundles. Your bundle was valid but a competing bundle with a higher tip won the auction, or the leader simply didn't include yours before the slot closed. The whole thing evaporates. You paid nothing on-chain, but you burned latency budget and possibly missed the opportunity window.
- Reverts inside a landed bundle. The bundle landed, but one of your own transactions reverted (slippage guard tripped, account state changed, compute limit hit). Because Jito enforces atomicity, a revert in a bundled tx normally kills the whole bundle — but only if you built it that way. If you didn't set the revert protection correctly, or you're mixing a tip tx that can't revert with a swap that can, you get partial exposure.
- Tip paid, edge gone. The subtle one. Your tip transaction is a real SOL transfer to a Jito tip account. Depending on how you structure it, the tip can land even when your strategy leg is a no-op or lands at a worse price than modeled.
The tip is the part people underweight. On a busy slot you might be tipping 0.001–0.01 SOL per attempt. Send 4,000 attempts a day chasing a 12% hit rate and the 3,520 misses are pure friction if your tip structure isn't defensive.
The cost model, written down
Model expected cost per opportunity, not per landed trade:
E[cost] = P(land) * (tip + fees + slippage_cost)
+ P(uncle) * latency_opportunity_cost
+ P(partial) * (tip + one_leg_exposure)
E[edge] = P(land_profitable) * gross_edge
You only submit when E[edge] > E[cost] with a margin, and — this is the part most bots skip — you cap the cumulative tip spend independent of any single decision. A per-trade EV check will happily approve 500 marginal-but-positive bundles in a row during a volatile stretch and drain your tip budget before variance mean-reverts.
The two knobs that keep this bounded are a tip ceiling and a rolling tip-bleed budget. I usually recommend structuring both the way you'd build any other kill-switch, similar to the depeg and oracle-staleness logic I walk through in the Solana circuit-breaker piece.
Structuring the tip so it can't strand you
The single highest-leverage fix: put the tip in the same transaction as the profitable action, or make the tip conditional on the action succeeding. Don't fire a standalone tip tx and hope the swap lands in the same bundle.
Concretely, for an atomic arb you want one transaction that:
- Executes the swap legs.
- Checks the realized output against a minimum-out you computed off-chain.
- Transfers the tip only after the profit assertion passes — same instruction sequence, same tx.
If the swap underperforms, the whole tx reverts, the bundle uncles, and you paid nothing. That's the behavior you want. The same minimum-out discipline applies to any DEX routing; I go deeper on computing those bounds in the Jupiter slippage and price-impact guardrails article.
A minimal on-chain profit gate looks like this:
// after swap legs execute, before tipping
let out = token_out.amount;
require!(out >= min_out, ArbError::BelowMinOut);
// tip is now guaranteed to co-execute with a profitable swap
let tip = out
.saturating_sub(cost_basis)
.saturating_mul(tip_bps)
/ 10_000;
transfer_to_jito_tip(ctx, tip)?;
Two things worth calling out. First, sizing the tip as a fraction of realized profit (tip_bps of the actual edge) rather than a flat amount means a thin fill tips small and a fat fill tips big — your tip scales with what you can afford. Second, saturating_sub matters: an unchecked subtraction underflows on a marginal fill and you'll either panic or, worse, compute a garbage tip.
Tracking the failure taxonomy properly
You can't bound what you don't measure. Tag every submission with an outcome, not just landed/failed:
landed_profitablelanded_break_even(landed, tip ate the edge)reverted_clean(reverted, no tip paid — this is fine, it's the guard working)uncled(never included)partial(should be near-zero; if it's not, your bundle isn't atomic)
The ratio that predicts trouble is reverted_clean climbing while uncled stays flat. That means your min-out is too tight for current volatility and you're paying latency cost to submit bundles that were never going to land — you're competing but self-sabotaging on the guard. Loosen the bound or size down, the same way you'd adjust exposure under a vol-target regime like the one in the Hyperliquid position-sizing writeup.
A partial count above roughly 0.1% is a red flag that your bundle construction has a non-atomic seam — usually a tip tx that isn't revert-linked to the strategy tx. That's a correctness bug, not a tuning problem, and it's the kind of thing a second set of eyes catches fast in a code review and audit pass.
Bounding tip bleed in the risk layer
Put a hard governor above the per-trade EV check:
- Rolling tip budget. Cap total tips per rolling hour. Hit the cap, stop submitting until it rolls off. This survives the "500 marginal trades in a row" failure that a per-decision check can't see.
- Uncle-rate circuit breaker. If your uncle rate over the last N submissions exceeds a threshold (say 85%), you're in a bidding war you're losing. Back off or raise the tip deliberately — don't grind. Sustained high uncle rate with tips still leaving means you're subsidizing the leader for nothing.
- Adaptive tip from the tip-floor stream. Jito exposes a tip-floor endpoint. Pull the 50th/75th percentile and set your tip relative to it instead of hardcoding. A stale hardcoded tip either overpays for months or silently stops landing after the floor drifts up.
None of this shows up in a naive dashboard that only plots realized PnL. You need per-outcome counters and the rolling budget surfaced live, which is why I treat tip-bleed and uncle-rate as first-class panels when building a trading dashboard rather than something you reconstruct from logs after a bad day.
One last gotcha from a system that ran fine in backtest and bled in prod: their tip account list was hardcoded to a single Jito tip address. Jito rotates through eight. Tipping a non-active account is a wasted transfer that lands nowhere useful — always pull the current set and pick randomly to spread load. Small bug, real leak, invisible until you audit the tip ledger against the active accounts.
If you're shipping a searcher bot and want the tip structure and outcome accounting pressure-tested before it's moving size, that's exactly the kind of thing our ongoing support and maintenance engagements are built to catch early.
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