Firedancer's Impact on Solana Bots: What Changes for Searchers
How Firedancer and Frankendancer change TPU ingestion, scheduling, and latency for Solana trading bots — and what searchers must retune to keep landing.
Frankendancer has been running as a validator client on Solana mainnet since late 2024, and if your bot was tuned against Agave's TPU behavior, some of your timing assumptions are now wrong on a meaningful fraction of the leader slots you care about. That fraction grows every quarter. Understanding what Firedancer actually changed — and what it only looks like it changed — is the difference between a sniper that lands and one that gets its transactions silently dropped during exactly the slots where landing matters most.
This is a practical breakdown for searchers and bot operators, not a validator-ops post. I'll focus on TPU ingestion, the scheduler, and the latency numbers your fill-rate model depends on.
Frankendancer vs. Firedancer: know which one you're hitting
There are two things people call "Firedancer," and conflating them will cost you.
Frankendancer is the hybrid that shipped first: Firedancer's networking and block-production path (the C/QUIC front end, the pack/scheduler stage) bolted onto Agave's runtime and consensus. This is what's live on mainnet today for a growing share of stake.
Full Firedancer replaces the runtime too. It's still rolling out and behaves differently again on the execution side.
For a searcher, the part that matters right now is the front end, and that's already Frankendancer. When a Frankendancer leader is up, your transaction hits a completely different ingestion and scheduling pipeline than when an Agave leader is up — same slot cadence, different physics. You cannot tune one strategy and assume it's optimal across both.
The first engineering task is knowing which client the current or upcoming leader runs. Map the leader schedule to validator identities, then map identities to client versions (gossip advertises version; several public datasets track client-by-stake). If you're not already tagging your fill data by leader client, start — your win-rate spread between the two is real signal, and it tells you where to spend effort. Wiring that mapping into your hot path is exactly the kind of thing our Solana infrastructure and data work exists to handle.
TPU ingestion: QUIC, but stricter
Agave and Frankendancer both ingest transactions over QUIC on the TPU port, so at the API level nothing changed — you still open a QUIC connection and send transaction packets. Underneath, Firedancer's QUIC stack (fd_quic) is its own implementation, and it is less forgiving.
Two concrete consequences:
- Connection setup and stake-weighting are enforced tightly. Firedancer honors stake-weighted QoS the way the spec intends, and it does the per-peer accounting in a tight C loop. If you were getting away with sending from an unstaked or lightly-staked identity because Agave's throttling was lenient under load, expect that slack to disappear. The gap between a staked and unstaked sender widens under Frankendancer leaders. If you haven't already routed through staked connections, this is the moment — see our breakdown of how stake-weighted QoS reorders who actually gets in.
- Stream and connection limits bite differently. Firedancer's handling of concurrent streams and its backpressure behavior don't match Agave's timing. Bots that opened a burst of streams and relied on a specific drop/retry pattern will see a different drop pattern. The failure mode most people hit is connection churn — hammering new connections instead of reusing one — which Firedancer punishes harder. I've written separately about QUIC throttling and why your transactions vanish without an error; everything there gets sharper under Frankendancer.
Practical rule: one warm, staked QUIC connection per leader, reused, with conservative stream concurrency. Don't open-and-forget.
The scheduler is the real change
This is the part that breaks mental models. Agave's banking stage historically used a multi-threaded scheduler where transactions were distributed across worker threads with locking on account access, and there was real non-determinism in which competing transaction won a contended account.
Firedancer's pack stage takes a different approach: a dedicated scheduling design that reasons about account conflicts up front and feeds non-conflicting transactions to execution lanes. The intent is higher throughput and more predictable ordering by priority fee within the constraints of account contention.
What this means for you:
- Priority fee behaves more like a real auction. Under a well-behaved scheduler, raising your compute-unit price has a cleaner relationship to landing ahead of a competitor touching the same account (the pool you're sniping, the market you're arbing). Fuzzy fee-bumping heuristics tuned against Agave's noisier ordering may be leaving money on the table or overpaying. Re-fit your fee model per leader client.
- Account contention is scheduled, not raced. If two of your own transactions touch the same account in the same slot, don't assume the "faster" one wins by arrival. It's evaluated by the pack logic. Spray-and-pray across many transactions to the same pool is even less effective here.
- Latency variance shifts. Frankendancer's front end can shave real microseconds off ingestion-to-pack, but the distribution changes shape, not just its mean. Your p99, the number that actually governs whether you land in a contested slot, may move in a direction your Agave-era model didn't predict.
For contention-heavy strategies — MEV and atomic arbitrage especially — this is where the client difference shows up in P&L. A sniper bot racing a token launch cares most about the ingestion and pack path on the specific leader holding the launch slot.
A quick worked example
Say you're sniping a launch and you know the leader for the target slot. Instead of a fixed fee, condition it:
def priority_fee(leader_client, base_lamports, contention):
# contention: your estimate of competitors on the same account
if leader_client == "frankendancer":
# cleaner auction: fee maps closely to rank, don't overpay wildly
return int(base_lamports * (1.0 + 0.6 * contention))
else:
# noisier ordering: pay a wider margin to beat variance
return int(base_lamports * (1.0 + 1.1 * contention))
The numbers are illustrative — the point is that a single flat fee curve is now wrong. You want at least two curves, fit from your own tagged fill data.
Where the low-latency edge moved
Because ingestion timing shifted, the value of getting your transaction to the leader before the pack stage closes went up, not down. Anything that tightens your view of block production and shred propagation matters more. Feeds like Jito ShredStream for early shred visibility let you react to state changes a beat earlier, which partly offsets the stricter ingestion.
A few things to audit in your stack right now:
- Tag every fill and drop with the leader's client and version. Without this you're flying blind on the exact effect that matters.
- Reuse staked QUIC connections; cap stream concurrency; stop churning connections.
- Split your priority-fee model by leader client and re-fit from live data.
- Re-measure p99 ingestion latency per client, not just the average.
Copytrading and wallet-following strategies are less exposed to the scheduler change but still inherit the QUIC strictness, so if you run a copytrading bot or a wallet tracker, the connection-hygiene points still apply.
None of this is a reason to fear the transition. Frankendancer's scheduler is, on balance, friendlier to a well-built bot that plays the fee auction honestly and keeps clean connections. The bots that suffer are the ones that were quietly relying on Agave's looseness.
If you want your ingestion path, fee model, and latency budget re-tuned for a mixed Frankendancer/Agave leader set, that's the core of what we build into a Solana MEV and arbitrage bot.
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