You click confirm. The wallet shows pending. Sixty seconds later: "transaction expired," "blockhash not found," or "block height exceeded." No swap, possibly no fee, definitely no clear explanation from the UI. This is a protocol-level behavior worth understanding properly before you hit retry.
How Solana Encodes a Deadline Into Every Transaction
When an application constructs a transaction, it embeds a recent blockhash into the message. That hash acts as a pointer to a specific recent block and doubles as an expiry marker. Validators will only process a transaction if its blockhash falls within the last 150 blocks, which translates to roughly one to one-and-a-half minutes under normal slot times.
Once that window closes, every validator on the network independently rejects the transaction. That is what "blockhash not found" and "block height exceeded" both mean: the signed payload arrived after its deadline.
The design is intentional. Without an expiry, a signed transaction could be replayed minutes or hours later at a completely different price, which would be a serious problem for any swap.
Why Transactions Miss the Window
Several things can push a transaction past its 150-block limit:
- Network congestion. Validators rank transactions by fee when blocks fill up. High-volume periods mean more competition for the same block space.
- Missing or low priority fee. A priority fee is an optional compute-unit price that makes a transaction more competitive. Without one during busy periods, a transaction can sit unprocessed until it expires.
- RPC propagation failures. The transaction travels from your app through an RPC node to the leader validator. Some packets get dropped, and the app must resend before the blockhash window closes.
- Slow signing. The blockhash is attached when the app builds the transaction, not when you approve it. If the wallet popup sits open for 45 seconds before you click confirm, the remaining validity window is already narrow.
Whether You Were Charged
An expired transaction never touched a block. No state changed on-chain, which means no tokens moved and no base fee was deducted.
This is a meaningful distinction from a failed transaction. A failed transaction did land in a block: the runtime attempted execution, hit an error (usually a slippage limit breach), and rolled back the token transfer. Because validators did the computational work, the base network fee is still charged on a failed transaction. An expired transaction skips that entirely.
Confirm Before You Retry
The real risk here is not the expiry itself. It is retrying a swap that actually landed. Some wallets display "pending" or "expired" even when the transaction settled, particularly if the RPC node had a delayed response.
Before submitting a second swap:
- Check your token balances. If the destination token appeared, the swap executed.
- Search your wallet address on a block explorer like Solscan or Solana Explorer. A settled swap shows a transaction signature with a Success or Failed status.
- Only retry after confirming nothing landed. The new transaction will carry a fresh blockhash and a fresh quote from the aggregator.
Practical Steps to Improve Landing Rates
- Approve the wallet popup quickly. You have roughly a minute from when the transaction was built.
- Enable or increase the priority fee in your swap app's settings. During busy slots, even a small compute-unit bump moves a transaction ahead of fee-less ones. Many apps set an automatic fee; bump it manually during high-traffic periods.
- Re-check the quote on retry. Prices shift during the expiry window, so the second attempt may show a different output amount.
- Keep enough SOL for fees. A transaction rejected for insufficient funds looks similar to an expiry but has a different fix.
Three Error Types That Look Identical in a Wallet UI
Expired, failed, and slippage errors all surface as "transaction failed" in many UIs. The underlying causes are different:
- Expired: never included in a block, no fee charged, no state change.
- Failed: included in a block, execution stopped, base fee charged, tokens not swapped.
- Slippage exceeded: a subtype of failed, where the price moved past your configured limit before execution completed.
If your swaps are failing consistently rather than expiring, the slippage setting is usually the cause. The guide to slippage, price impact and minimum received covers how that limit interacts with execution.
swap.io, a Solana swap aggregator, compares quotes from multiple routing providers (Jupiter among them) and shows the minimum received amount before you confirm, so you can see exactly what you're committing to.
If you want to avoid retrying manual swaps after expirations, limit orders on swap.io let you set a target price and have the order execute when conditions are met, without watching the screen.
Key Takeaways
- Solana transactions carry an embedded blockhash that expires after roughly 150 blocks, about one to one-and-a-half minutes.
- "Blockhash not found" means the transaction was rejected because that window closed before inclusion.
- Expired transactions charge no fee and move no tokens.
- Failed transactions did land and still pay the base network fee.
- Always check a block explorer or your balances before retrying to avoid executing the same swap twice.
Frequently Asked Questions
Can an expired transaction still go through later?
No. The blockhash expiry is enforced by every validator independently. Once the window closes, the transaction is permanently invalid and must be rebuilt from scratch.
Why does my wallet keep showing "pending" after a minute?
Some wallets poll slowly or cache state. If more than two minutes have passed, the pending display is almost certainly stale. Check a block explorer directly for the authoritative status.
Does paying a higher priority fee guarantee the swap lands?
Not guaranteed, but it meaningfully improves the odds during congested slots. Priority fees do not protect against price movement; your slippage setting handles that separately.
Is anything at risk when a transaction expires?
No. An expired transaction is discarded by the network. Your private keys, tokens, and wallet state are unaffected.
