Skip to main content
This page documents every TransactionErrorCode returned in SubmitTransaction errors and how to handle each one. Error codes are grouped by their retryability and whether the transaction was sent to the network.

TransactionErrorCode

The code field of a TransactionError object. Determines whether retrying the same transaction is safe, and what remediation action to take.
Error codes are grouped into three categories:
  • Permanent failures — transaction was NOT sent; rebuild required before retrying
  • Temporary failures — transaction was NOT sent; same transaction can be retried
  • Indeterminate — unknown whether the transaction was sent; check structured_error.certainty

Permanent Failures

The transaction was NOT sent to the network. The error condition is not recoverable with the same transaction — rebuild and re-sign before retrying.
Error CodeDescriptionRetryableRemediation
TRANSACTION_ERROR_CODE_INVALID_TRANSACTIONMalformed transaction structure.NoRebuild the transaction from scratch with valid instructions.
TRANSACTION_ERROR_CODE_INVALID_SIGNATUREMissing or invalid signatures.NoVerify all required signers have called SignTransaction.
TRANSACTION_ERROR_CODE_SIGNATURE_VERIFICATION_FAILEDCryptographic signature verification failed.NoRe-sign the transaction with the correct private keys.
TRANSACTION_ERROR_CODE_ACCOUNT_NOT_FOUNDA required account does not exist on-chain.NoVerify all account addresses in the transaction’s instructions.
TRANSACTION_ERROR_CODE_INVALID_ACCOUNTAn account exists but is in an invalid state for this operation.NoInspect the account’s owner, executable flag, and data for the specific program’s requirements.
TRANSACTION_ERROR_CODE_PROGRAM_ERRORProgram execution failed.NoReview the instruction inputs and program requirements. Check meta_error_message from GetTransaction for details.
TRANSACTION_ERROR_CODE_INSTRUCTION_ERRORA specific instruction failed during execution.NoIdentify the failing instruction and correct the inputs. Check simulation logs for details.
TRANSACTION_ERROR_CODE_PRECOMPILE_VERIFICATION_FAILEDPrecompile (e.g., ed25519 or secp256k1) signature verification failed.NoRe-sign the transaction with the correct keys.
TRANSACTION_ERROR_CODE_INVALID_BLOCKHASH_FORMATThe transaction’s blockhash is not valid Base58.NoCall CompileTransaction again — the service will fetch a valid blockhash automatically.
TRANSACTION_ERROR_CODE_TRANSACTION_TOO_LARGETransaction exceeds Solana’s 1232-byte size limit.NoReduce the number of instructions or accounts per transaction. Split into multiple transactions if necessary.
TRANSACTION_ERROR_CODE_BLOCKHASH_NOT_FOUNDThe transaction’s blockhash has expired (~150 slots after compilation).NoCall CompileTransaction to recompile with a fresh blockhash, then re-sign.

Temporary Failures

The transaction was NOT sent to the network. The same signed transaction can be retried without rebuilding.
Error CodeDescriptionRetryableRemediation
TRANSACTION_ERROR_CODE_INSUFFICIENT_FUNDSThe fee payer account has insufficient SOL to pay transaction fees.YesFund the fee payer account, then retry the same transaction.
TRANSACTION_ERROR_CODE_ACCOUNT_IN_USEAn account required by the transaction is locked by another in-flight transaction.YesWait a few seconds for the conflicting transaction to process, then retry.
TRANSACTION_ERROR_CODE_WOULD_EXCEED_BLOCK_LIMITThe current block is at compute capacity.YesRetry on the next block (~400ms).
TRANSACTION_ERROR_CODE_TRANSIENT_SIMULATION_FAILURETemporary simulation error — not related to the transaction itself.YesRetry immediately.

Indeterminate

The service cannot determine with certainty whether the transaction was sent to the network. Use structured_error.certainty (a TransactionSubmissionCertainty value) to determine the recovery strategy.
TRANSACTION_ERROR_CODE_TIMEOUT is the most dangerous indeterminate error. The request timed out, but the transaction may have been broadcast before the timeout. Do not assume it was not sent. Always check certainty and wait for blockhash expiry before deciding to resubmit.
Error CodeDescriptionLikely Sent?Remediation
TRANSACTION_ERROR_CODE_NETWORK_ERRORNetwork error during submission — could have failed at any point.UnknownCheck certainty. Wait for blockhash expiry, then query on-chain.
TRANSACTION_ERROR_CODE_TIMEOUTRequest timed out — transaction may have been broadcast.PossiblyDo not resubmit immediately. Check certainty and blockhash_expiry_slot. Query on-chain after expiry.
TRANSACTION_ERROR_CODE_NODE_UNHEALTHYThe RPC node was unhealthy — may have received the transaction.PossiblyCheck certainty. Use a different RPC node and verify on-chain.
TRANSACTION_ERROR_CODE_RATE_LIMITEDRate limited — whether the transaction was sent depends on where limiting occurred.UnknownCheck certainty. Back off and verify on-chain before retrying.
TRANSACTION_ERROR_CODE_RPC_ERRORGeneric RPC failure.UnknownCheck certainty. Verify on-chain before retrying.
TRANSACTION_ERROR_CODE_CONNECTION_FAILEDConnection could not be established — transaction was likely NOT sent.Likely noCheck certainty. Safe to retry if certainty is NOT_SUBMITTED.
TRANSACTION_ERROR_CODE_REQUEST_FAILEDHTTP/transport layer request failed.UnknownCheck certainty. Verify on-chain before retrying.
TRANSACTION_ERROR_CODE_UNKNOWNUnclassified error.UnknownCheck certainty. Treat conservatively.

TransactionSubmissionCertainty

The certainty field on a TransactionError object. Use this to determine whether it is safe to resubmit a transaction after an indeterminate error.
CertaintyValueMeaningHandling
TRANSACTION_SUBMISSION_CERTAINTY_NOT_SUBMITTED1100% certain the transaction was NOT sent to the network.Safe to rebuild and resubmit immediately.
TRANSACTION_SUBMISSION_CERTAINTY_SUBMITTED2100% certain the transaction WAS sent to the network.Do not resubmit. Use MonitorTransaction to track the outcome.
TRANSACTION_SUBMISSION_CERTAINTY_UNKNOWN_RESOLVABLE3Uncertain, but resolvable by waiting.Wait until after blockhash_expiry_slot. Then query on-chain — if the transaction is not found, it is safe to recompile and resubmit.
TRANSACTION_SUBMISSION_CERTAINTY_UNKNOWN4Uncertain and not easily resolvable.Treat conservatively: wait for blockhash expiry, query on-chain, and only resubmit if the transaction is definitively absent.
TRANSACTION_SUBMISSION_CERTAINTY_UNSPECIFIED0Not set (default).Treat as UNKNOWN.
blockhash_expiry_slot on the TransactionError object indicates when the transaction’s blockhash expires (approximately 150 slots after compilation). Once the blockhash has expired, any transaction that was broadcast but not confirmed is guaranteed to be dead — it is then safe to recompile and resubmit.