How to Beat Snipers and Land Transactions First on Solana

Practical strategies for outpacing competing bots on Solana — from leader proximity routing to TPU direct submission and real-time leader hints.

  • March 5, 2026
  • Infrastructure
  • AllenHark Team
A quiet stack of pagesAn abstract drawing of light on the page's dark ground. A neat stack of thin, solid pages, the top one lit, with faint streams of light drifting toward it from the left.A quiet stack of pagesAn abstract drawing of light on the page's dark ground. A neat stack of thin, solid pages, the top one lit, with faint streams of light drifting toward it from the left.

You see the opportunity. You sign the transaction. You submit it. And someone else's transaction lands first.

If you're running any kind of latency-sensitive strategy on Solana — sniping new token launches, arbitraging DEX price discrepancies, or liquidating undercollateralized positions — you're in a speed competition. The difference between landing first and landing second is often a sliver of a slot.

Here's how to win that race.

Why You're Losing

Before optimizing, understand where time is being spent:

1. Your Sender Is Far from the Leader

This is the #1 reason traders lose races. Solana's leader validator changes every 4 slots (~1.6 seconds). If you're sending through a fixed endpoint and the current leader is in a different continent, your packet has to cross an ocean before the leader sees it. Your competitor, submitting from a closer location, wins every time.

2. Gossip Network Propagation

If your transaction goes through sendTransaction on a standard RPC, it enters the gossip network — a mesh of nodes that propagate transactions gradually. That is a long detour compared to direct delivery.

3. Single Sender Lock-In

Using one sender (say, Jito) means you're fast when Jito has a good path to the leader, and slow when it doesn't. The leader changes constantly — no single sender has the best path for every slot.

4. No Real-Time Intelligence

If you don't know the current leader's location, you can't optimize your submission path. You're submitting blind and hoping for the best.

Strategy 1: Get Close to the Leader

The single biggest speed improvement comes from geographic proximity to the current leader. Light travels at a fixed speed — a transaction sent from the leader's own city arrives almost at once; the same transaction sent from another continent spends most of its time in transit.

What to do: Run infrastructure in multiple regions, or use a relay service with multi-region workers.

Slipstream maintains workers in 4 regions:

  • US East
  • EU West
  • EU Central
  • Asia Pacific (Singapore)

When you submit through Slipstream, it automatically routes to the worker closest to the current leader. No configuration needed.

Strategy 2: Use the Right Protocol

Not all protocols are equal:

ProtocolOverheadBest For
QUIC (port 4433)LowestPrimary — stream multiplexing, 0-RTT reconnect
gRPC (port 10000)LowStructured data, bidirectional streaming
WebSocket (port 9000)MediumPersistent connections, browser clients
HTTP (port 9091)HighestFallback, simplest integration

QUIC carries the least overhead because it combines connection establishment and data transfer. With 0-RTT reconnection, subsequent submissions skip the handshake entirely.

Slipstream's SDK tries QUIC first and falls back automatically through gRPC → WebSocket → HTTP if needed.

Strategy 3: Submit to the TPU Directly

For the shortest path, bypass everything and send your serialized transaction directly to the leader's TPU via UDP.

TypeScript
import { SlipstreamClient, configBuilder } from "@allenhark/slipstream";

const config = configBuilder().apiKey("sk_live_...").build();
const client = await SlipstreamClient.connect(config);

// Fire-and-forget — straight to leader TPU
await client.submitTransactionWithOptions(txBytes, {
    tpuSubmission: true,
});

TPU submission costs 2 tokens per transaction. There's no confirmation receipt — you'll need your own monitoring pipeline (gRPC subscription, WebSocket signatureSubscribe, or polling).

When to use: Arbitrage opportunities where you're sending many transactions and only need one to land. The shorter path outweighs the lack of confirmation.

Strategy 4: Use Leader Hints for Timing

Don't submit blindly. Subscribe to real-time leader hints to know when conditions are optimal:

TypeScript
await client.subscribeLeaderHints();

client.on("leaderHint", async (hint) => {
    // hint.confidence tells you how close a worker is to the upcoming leader
    if (hint.confidence >= 80) {
        // Now is a good time to submit — a nearby worker will handle it
        await client.submitTransactionWithOptions(txBytes, {
            tpuSubmission: true,
        });
    }
});

Leader hints tell you:

  • Which region has the lowest RTT to the next leader
  • Confidence level for the prediction
  • Estimated slot timing

This lets you time your submissions for when Slipstream has the best path, rather than submitting on every slot and wasting tokens.

Strategy 5: Use Sender-Agnostic Routing

Instead of picking one sender and sticking with it, let the network conditions decide:

TypeScript
// Slipstream automatically picks the best sender per transaction
const result = await client.submitTransaction(txBytes);
// Could be routed via Nozomi, Helius, or a custom sender — whichever has the best path right now

Different senders have different advantages:

  • Some have better peering with certain validator operators
  • Some have shorter paths to specific data centers
  • Some perform better under congestion

Slipstream evaluates these factors in real-time and picks the optimal sender for each transaction. You get the best path any of them has, per transaction.

Strategy 6: Reduce Your Own Latency

Infrastructure matters on your end too:

  1. Co-locate with Slipstream workers — If your bot runs in the same region as a Slipstream worker, the hop from your SDK to the worker is short
  2. Pre-sign transactions — Have transactions ready to submit the moment you detect an opportunity
  3. Use persistent connections — QUIC and WebSocket maintain open connections, avoiding reconnection overhead
  4. Parallelize detection and submission — Don't wait for detection to complete before preparing the transaction

Strategy 7: Use Bundles for Atomic Execution

When you need multiple transactions to execute together (e.g., a swap followed by a transfer), use atomic bundles:

TypeScript
const result = await client.submitBundle([tx1Bytes, tx2Bytes, tx3Bytes]);
// All 3 execute atomically, or none do

Bundles cost 5 tokens for 2–5 transactions. They prevent partial execution that could leave you in an unfavorable state.

Putting It All Together

The winning stack in 2026:

  1. Detect opportunity via shreds or gRPC stream (state updates as the block is built)
  2. Pre-sign transaction while detecting (parallel processing)
  3. Check leader hint — is a nearby Slipstream worker close to the leader?
  4. Submit via TPU direct for the shortest path, or standard for confirmed delivery
  5. Monitor confirmation via separate gRPC subscription
TypeScript
import { SlipstreamClient, configBuilder } from "@allenhark/slipstream";

const config = configBuilder().apiKey("sk_live_...").build();
const client = await SlipstreamClient.connect(config);

// Subscribe to leader hints
await client.subscribeLeaderHints();

client.on("leaderHint", async (hint) => {
    if (hint.confidence >= 80 && hasOpportunity()) {
        const tx = buildTransaction(); // Pre-built, ready to go

        // Fire via TPU, the shortest path
        await client.submitTransactionWithOptions(tx, {
            tpuSubmission: true,
        });

        // Also submit via standard for reliability
        await client.submitTransaction(tx);
    }
});

The Paths Compared

ApproachYour path to the leaderCompetitor (Public RPC)
Slipstream TPU directNearest worker, straight to the TPURPC node, then gossip
Slipstream StandardNearest worker, through the best senderRPC node, then gossip

Whichever continent the leader is on, your transaction leaves from the worker nearest to it, while a public-RPC competitor waits on gossip.

Get Started

Terminal
# Install
npm install @allenhark/slipstream

# Or Rust
cargo add allenhark-slipstream

# Or Python
pip install AllenHarkSlipstream

Start with the free daily token allowance to test, then top up with SOL deposits. See Slipstream billing.