๐Ÿ›ก๏ธ Jito Bundles

Jito Bundles

Send flash loans as private, atomic bundles via Jito Block Engine. Your transaction bypasses the public mempool โ€” invisible to MEV bots.

Code Examples

const sig = await flash.executeLocal({
  token: 'SOL',
  amount: 5000,
  onFunds: async (ixs) => {
    ixs.push(myLiquidationIx);
    return ixs;
  },
}, {
  sendVia: 'jito',
  jito: {
    tip: 'competitive',    // auto-calculated tip
    region: 'amsterdam',   // nearest Block Engine
  },
});

Tip Strategies

StrategyTip AmountUse Case
min~1โ€“5K lamportsLow-value opportunities, testing
competitive~10โ€“50K lamportsRecommended for most bots โ€” good balance
aggressive100K+ lamportsHigh-value liquidations, time-critical arbs
numberExact lamportsFull manual control over tip amount

What Jito Gives You

  • โœ… Bundle privacy โ€” your TX is not visible in the public mempool
  • โœ… Frontrun protection โ€” MEV bots can't see your transaction before it lands
  • โœ… Auto-calculated tip โ€” based on Jito tip floor with your chosen strategy
  • โœ… Smart Retry compatible โ€” escalates tip amount on retry failure
  • โœ… Zero new dependencies โ€” uses pure fetch() to Block Engine API

Limitations

  • โŒ No landing guarantee โ€” tip is competitive, not a hard guarantee of inclusion
  • โŒ Not full MEV protection โ€” bundles are private, but not invulnerable to all MEV
โš ๏ธ Warning
Jito Block Engine is mainnet only. There is no devnet support. Bundle testing requires mainnet SOL.

Block Engine Regions

RegionURL
mainnetmainnet.block-engine.jito.wtf
amsterdamamsterdam.mainnet.block-engine.jito.wtf
frankfurtfrankfurt.mainnet.block-engine.jito.wtf
nyny.mainnet.block-engine.jito.wtf
tokyotokyo.mainnet.block-engine.jito.wtf
slcslc.mainnet.block-engine.jito.wtf

pollBundleStatus()

After sending a bundle, poll the Block Engine to verify it landed. The SDK does this automatically with sendVia: 'jito', but you can use it directly:

typescript
import { sendJitoBundle, pollBundleStatus, resolveBlockEngineUrl } from '@vaea/flash';

const url = resolveBlockEngineUrl('amsterdam');
const bundleId = await sendJitoBundle(url, [signedTx]);

// Poll every 500ms until confirmed (max 30s)
const signature = await pollBundleStatus(url, bundleId, 30_000);
console.log('Bundle landed:', signature);
โ„น๏ธ Note
Tip calculation: min = floor (~1K lamports), competitive = floor ร— 3 (~10-50K), aggressive = max(100K, floor ร— 5). The SDK fetches the current tip floor from the Block Engine.