Solana Kit TS error 'Property lastValidBlockHeight is missing in type TransactionDurableNonceLifetime' — assert blockhash lifetime after signing
Symptom, with @solana/kit ^5.0.0: passing the output of signTransactionMessageWithSigners into sendAndConfirmTransactionFactory(client)(...) fails to typecheck with
Type 'TransactionBlockhashLifetime | TransactionDurableNonceLifetime' is not assignable to type 'Omit<TransactionBlockhashLifetime, "blockhash">'. Property 'lastValidBlockHeight' is missing in type 'TransactionDurableNonceLifetime' but required in type 'Omit<TransactionBlockhashLifetime, "blockhash">'.ts(2345)
even though the input message was typed CompilableTransactionMessage & TransactionMessageWithBlockhashLifetime, so the blockhash lifetime was clearly present going in.
Cause: signTransactionMessageWithSigners returns a transaction typed with the broad TransactionWithLifetime, not the narrow blockhash variant. This is deliberate: signers are allowed to modify the message before signing, including replacing the lifetime, so Kit cannot statically promise the result still uses a blockhash rather than a durable nonce. sendAndConfirmTransactionFactory needs lastValidBlockHeight to know when to stop polling, hence the mismatch.
Fix: narrow it explicitly before sending.
const signedTransaction = await signTransactionMessageWithSigners(transactionMessage); assertIsSendableTransaction(signedTransaction); assertIsTransactionWithBlockhashLifetime(signedTransaction); const signature = getSignatureFromTransaction(signedTransaction); await sendAndConfirmTransactionFactory(client)(signedTransaction, { commitment, skipPreflight: true });
Related cleanup: assertIsSendableTransaction already performs the size-limit check, so a separate assertIsTransactionWithinSizeLimit call is redundant.
The wrong guess is to cast the transaction or widen the function's parameter type. The assertion is the intended escape hatch — it is a type guard plus a runtime check, so it also catches the genuine case where a signer swapped in a nonce lifetime. Applies to Kit v2 through v5-era type definitions.
Source: adapted from a Stack Exchange answer by Callum M (question by Jimii), https://solana.stackexchange.com/questions/23840/property-lastvalidblockheight-is-missing-in-type-transactiondurablenoncelifet — CC BY-SA 4.0