← Back to Blog

Solana's Alpenglow Cuts Finality to 150ms — What That Changes for dApp UX

Alpenglow replaces TowerBFT with Votor and Rotor, dropping Solana finality from 12.8s to ~150ms. What changes for dApp UX, polling, and E2E tests.

Written by Chroma Team

Solana finality, today, takes about 12.8 seconds. That number quietly defines how every Solana dApp UI is built: spinners, "Confirming..." toasts, optimistic-then-rollback patterns, polling intervals tuned to slot time. On May 5, Anatoly Yakovenko told CoinDesk that Alpenglow — the largest consensus rewrite in Solana's history — could reach mainnet next quarter. Once it does, that 12.8 seconds collapses to roughly 100–150 milliseconds. The intermediate UI states most dApps are built around stop having a reason to exist.

This post walks through what Alpenglow actually replaces, where the new finality numbers come from, and what the change means for Solana dApp interaction design and E2E tests.

Why Solana Finality Has Been 12 Seconds

Solana's current consensus is two stacked systems. Proof of History (PoH) gives every transaction a verifiable timestamp. Tower BFT runs a 32-step confirmation pipeline on top of it. Validators don't gossip votes — they post them as on-chain transactions, which means votes consume block space and pay the same fees as user activity. Around 75% of every Solana block is currently filled with these vote transactions.

The 12.8-second figure is the time it takes for a block to traverse all 32 confirmation steps with high enough stake-weighted backing to be considered final. Optimistic confirmation arrives in ~1–2 seconds, which is what most wallets actually display, but full economic finality — the point where reorg risk is effectively zero — sits at the end of that pipeline. Services that wait for true finality (CEX deposits, bridge contracts, settlement layers) live with the 12-second number every day.

What Votor and Rotor Actually Change

SIMD-0326, the on-chain proposal community-approved with 98.27% of voting stake, replaces both PoH and Tower BFT. Two new components do the work.

Votor collapses the 32-step pipeline into one or two voting rounds. The fast path finalizes in ~100ms when a block receives more than 80% stake-weighted approval in round one. The slow path finalizes in ~150ms when 60–80% approve in round one and a second round confirms with at least 60%. Votes are aggregated using BLS signatures: thousands of individual validator signatures collapse into a single ~1,000-byte certificate per slot, replacing roughly 500KB of on-chain vote data per slot today.

Rotor replaces Turbine as the block propagation layer. It uses stake-weighted relays and erasure coding to push new blocks across the network in around 18ms in simulation, eliminating the duplicate packet retransmission that Turbine paid for.

The 20+20 resilience model is the other notable shift. The protocol stays live with up to 20% Byzantine validators and 20% offline validators simultaneously — a stronger guarantee than Tower BFT's standard 33% threshold. Validators submit a single Validator Admission Ticket per cycle instead of paying for every vote, which materially lowers the cost of running a validator and frees the block space currently consumed by vote traffic.

What 150ms Finality Means for dApp UX

The current Solana dApp UX vocabulary — "Pending..." spinners, hover hints explaining that confirmations take a few seconds, optimistic state with a 2–10 second window for rollback — was designed around block timing that no longer matches the underlying chain once Alpenglow ships.

Three concrete shifts to plan for:

  • The "submitted vs. confirmed" gap closes. With sub-200ms finality, the gap between transaction submission and irreversible state is shorter than the round-trip to your own RPC. UIs that flash an intermediate "submitted" state will display it for a single frame, if at all. Designs need to either skip the intermediate state or deliberately delay the success state for human readability.
  • Optimistic UI has less to optimize. The whole point of optimistic updates is to hide latency that's about to disappear anyway. Optimism-then-rollback flows now risk showing a rollback faster than the user can perceive the original write — a worse experience than rendering the confirmed state directly.
  • Polling-based receipt patterns become wasteful. A confirmTransaction loop polling every 400ms spends most of its time waiting after the transaction is already final. Websocket subscriptions on slot or signature notifications fit better once block propagation is shorter than the typical poll interval.

These are not just visual concerns. Solana's transaction model is instruction-based and stateless — programs do not store state inside themselves, and accounts are explicit inputs to every instruction. That means UI logic frequently re-fetches account state after a transaction lands to render the new balance or position. Today, that re-fetch can hide behind the 1–2 second optimistic confirmation. After Alpenglow, the chain side completes faster than most state-fetching layers, and your account-subscription wiring becomes the new bottleneck.

For end-to-end tests, the change cuts both ways. Real-wallet tests against a local validator or devnet — the kind that drive a Solana wallet through the full submit-and-confirm flow — get faster: less waiting on BlockheightExceeded failures, less flake from slot-timing assumptions baked into selectors. But assertions that depend on intermediate UI states ("expect a spinner, then a success toast") will break unless the dApp explicitly preserves those states. If you maintain Solana wallet E2E coverage with a tool like @avalix/chroma — which is expanding from Polkadot and EVM into SVM — this is worth auditing now: many existing assertions encode an implicit assumption that confirmation takes seconds, not a single animation frame.

What to Do Before Mainnet

Alpenglow's mainnet target is late 2026, with Agave 4.1 in Q3 and a community testnet cluster running today. The practical homework for dApp teams: identify every place in your codebase where slot time, finality time, or "pending" duration is hardcoded — config values, animation timings, retry budgets, test assertion timeouts. Replace fixed delays with subscription-driven state updates where you can, and make any remaining timeouts configurable per environment. The chain is about to move two orders of magnitude faster. Code that hardcodes 12 seconds will not age well.