WATS Wallet logoWATS Wallet
Technical8 min read

Crypto Wallet Error Messages Explained: Execution Reverted, Nonce Too Low, Blockhash Not Found (EVM, Solana, TON)

Look up "execution reverted", "nonce too low", "Blockhash not found", AA21 and TON exit code 37: what each EVM, Solana and TON error means, whether the attempt spent a network fee, and how to fix it.

By Alltoscan LLC, the company behind WATS Wallet Editorial policy

Published Updated

As of October 2026, most wallet errors fall into two groups. Errors raised before a transaction is included in a block, such as "nonce too low", "replacement transaction underpriced", "insufficient funds for gas * price + value" or Solana's "Transaction simulation failed: Blockhash not found", mean nothing was recorded on-chain and no network fee was spent. Failures after inclusion, such as an EVM transaction that reverted or ran out of gas, a Solana transaction that landed with an error, or a TON compute-phase failure, still consume the fee for the work done. Find your exact string in the tables below for its meaning and the fix.

Did a failed transaction cost you a fee? The one rule to check first

A failed transaction costs a network fee only if it was included in a block before it failed.

A transaction can fail at two moments:

  • Before inclusion: the wallet's simulation, the RPC node or the mempool rejects it. Nothing reaches a block, so no network fee is spent.
  • After inclusion: the transaction lands in a block, its code runs and fails. The fee for the work done is spent. Etherscan says gas is still deducted on failed transactions because of the computation used, and Solana's fee documentation says that if the transaction fails, the fee is still charged.

To tell which case you are in, search the transaction hash or signature on a block explorer. No record after a few minutes usually means it never landed and cost nothing; a Pending status means it has not been included yet. A record marked Failed or Reverted, or with a non-zero exit code, means it landed and the fee was spent.

Which EVM errors mean "nonce too low", "underpriced" or "out of gas"?

These are the exact strings from the go-ethereum client source, and most mean the transaction was refused before it reached a block.

Exact errorWhat it meansNetwork fee spent?What to do
"nonce too low"A transaction with this number already confirmed; wallet state is staleNoResync the wallet and check the explorer; resend only if the action you intended did not already happen
"replacement transaction underpriced"Speed-up or cancel used too small a fee bumpNoBump more; Geth's default requires 10%
"max fee per gas less than block base fee"Your max fee is under the current base feeNoRaise the max fee
"insufficient funds for gas * price + value"Native coin cannot cover amount plus maximum gasNoTop up the native coin; see tokens but no gas token
"already known"The same transaction is already in the mempoolNoWait; it is harmless
"out of gas"Execution passed its gas limit; changes undoneYesRetry with a higher gas limit

What does "execution reverted" mean?

"Execution reverted" means a smart contract refused the action and undid every change it made. It appears at two points, and the fee differs.

If it appears in the wallet's pre-send estimate, nothing was sent and no fee was spent. If the transaction landed, Etherscan shows it as Fail or Reverted, and per Alchemy the sender still pays for the gas used. The text after the colon is the real reason. Common ones:

  • "UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT": the price moved past your slippage limit between signing and inclusion.
  • "ERC20: insufficient allowance": the token approval is smaller than the amount being spent. Its sibling, "ERC20: transfer amount exceeds balance", means you hold less of the token than you tried to move.

The two ERC-20 strings come from OpenZeppelin v4 contracts; newer versions use custom errors with different names.

What do ERC-4337 AA codes and EIP-7702 errors mean?

Smart-contract accounts send a UserOperation through a bundler instead of a normal transaction, and the EIP-4337 specification says EntryPoint error messages start with a code in the form AA##.

CodeWhat it meansNetwork fee spent?
AA21 didn't pay prefundNo paymaster used, and the account's EntryPoint deposit cannot cover maximum gasNo
AA23 revertedThe account's validation code rejected the operationNo
AA33 revertedThe paymaster's validation rejected the operationNo
AA95 out of gasThe bundle's gas limit was too low for the operation or a sub-callNormally no; handleOps reverts

The EIP-4337 specification says a bundler must drop an operation whose simulation reverts, so validation failures (AA2x and AA3x) normally leave nothing on-chain. If an operation is included and its main call reverts, the gas is still paid on-chain by the account or by the paymaster that sponsored it. Alchemy notes AA95 usually means the gas limits were set too low; handleOps reverts, so retry with higher gas limits (a bundler or SDK setting).

EIP-7702 adds one error you may see from a node: "in-flight transaction limit reached for delegated accounts" (Geth's pool accepts only one pending executable transaction for such an account, so wait for it). An authorization with the wrong chain ID or nonce is skipped silently, so the transaction can succeed without the delegation being applied. If you did not knowingly delegate your account, check and revoke the delegation: an unexpected one is a drainer signal.

What do Solana "Blockhash not found" and "block height exceeded" mean?

"Block height exceeded" means the blockhash expired, and "Blockhash not found" means the node did not recognise the blockhash (usually expired, sometimes a lagging node). In both cases the transaction was normally not processed. A blockhash stays valid for about 151 blocks, roughly 60 to 90 seconds, according to Solana's confirmation guide, and an expired transaction can no longer be processed.

Exact errorWhat it meansNetwork fee spent?What to do
"Transaction simulation failed: Blockhash not found"Blockhash too old, or the simulating node had not seen it yetNoRetry for a fresh blockhash
"block height exceeded" (TransactionExpiredBlockheightExceededError)It did not land before the blockhash expiredNo, unless it landed just before expiry; check the signatureCheck the signature on an explorer, then retry
"Transaction simulation failed: Error processing Instruction N: custom program error: 0x..."The program predicted a failure, such as swap slippageNo, when caught in simulation before sending; if a wallet or app skips simulation, the transaction can land as Failed and the fee is spentRead the reason; adjust slippage or amount
"Attempt to debit an account but found no record of a prior credit."The paying account holds no SOL at allNoFund it with SOL
"Transaction results in an account (0) with insufficient funds for rent"Sending would leave an account below the rent-exempt minimumNo, when caught in simulation; if simulation is skipped it can land as Failed and cost the feeSend slightly less; see Solana rent
Explorer shows "Failed"It landed and the program returned an errorYesRead the explorer log, fix, resend

Solana fees are always paid in SOL, so "Insufficient funds for fee" and "insufficient funds for rent" mean you need SOL. A bare "insufficient funds" or "custom program error: 0x1" from a token transfer means you hold less of that token than you tried to send.

Should you raise the priority fee on Solana?

Raise the priority fee only when a transaction keeps expiring during congestion, not when a simulation error appears.

Per solana.com's fee documentation, a Solana fee is a base fee of 5,000 lamports per signature (50% burned, 50% to the validator) plus an optional priority fee: the compute-unit price (in micro-lamports) times the compute-unit limit, divided by 1,000,000 and rounded up to whole lamports, all going to the validator. A higher priority fee improves the odds that a busy leader schedules your transaction. It does not fix slippage, rent or missing-SOL errors, and it is still charged if the transaction lands and fails. If a simulation error appears, fix the cause instead.

What do TON exit codes and bounced messages mean?

A TON transaction runs in phases (storage, credit, compute, action, bounce), and per docs.ton.org exit codes 0 and 1 mean success while anything else means failure. If compute fails, the action phase is skipped and, for a bounceable inbound message, a bounce message is formed; fees are deducted phase by phase, so earlier fees stay spent. Fees are paid in GRAM (formerly Toncoin; see what changed in the rename).

SignalWhat it meansNetwork fee spent?What to do
Exit code 13 or -14Out of gas in the compute phaseYes, for gas usedAttach more GRAM
Exit code 9Cell underflow: the contract tried to read more data than a cell holds, often because the payload does not match what the contract expectsYesCheck the payload or comment suits that contract
Exit code 37Action phase: "Not enough GRAMs" to send the outgoing messageYesAttach more GRAM
Compute phase skippedThe message carried too little GRAM to pay for executionNo gas; the storage phase still runsSend with more GRAM attached
Bounced messageDestination failed or does not existYes, fees deductedValue returns minus message and gas fees

How WATS Wallet relates to these errors

WATS Wallet, by Alltoscan LLC, is a non-custodial wallet (Chrome extension and iOS/Android app) for EVM networks, Solana and TON, where you hold your own keys and recovery phrase. The messages in this guide are network-level errors defined by those chains, not WATS-specific codes.

On Solana, network fees are paid in SOL, so the Solana "insufficient funds" row applies directly: keeping a small SOL balance avoids it. The TON rows describe protocol-level errors; in WATS Wallet, fees on TON are paid in ATS. On EVM networks, WATS Wallet charges network fees in ATS through an ERC-4337 paymaster, from one ATS balance on BNB Chain; how the ATS fee works is explained separately.

Frequently asked questions

Do I lose money when a crypto transaction fails?

It depends on when it failed. If it was rejected before inclusion (simulation, node or mempool errors such as "nonce too low", "replacement transaction underpriced" or "Blockhash not found"), nothing landed and no network fee was spent. If it landed and failed (an EVM revert or out of gas, a Solana explorer "Failed", a TON non-zero exit code), the fee for the work done was spent, but the amount you tried to send stays in your account, and TON bounces return the value minus fees. Check the hash or signature on an explorer to see which case applies.

Why does my wallet say "nonce too low" when I have no pending transaction?

The nonce is the account's transaction counter, and "nonce too low" means a transaction with that number has already confirmed. Common causes are using the same account from another wallet app or device, a "stuck" transaction that actually confirmed, or stale cached wallet state. Check on an explorer whether the payment or action you intended already went through; if it did, do not resend; if it did not, resync the wallet and send again. The rejected attempt itself spent no fee. If a transaction really is pending, see <a href="/blog/speed-up-or-cancel-stuck-transaction">how to speed up or cancel a pending transaction</a>.

Is it safe to retry after "block height exceeded" or "Blockhash not found" on Solana?

Generally yes. "Block height exceeded" means the blockhash expired (about 151 blocks, roughly 60 to 90 seconds), and "Blockhash not found" means the node did not recognise it, usually because it expired. An expired transaction can no longer be processed, so it cannot land later and duplicate the new one; still, look up the signature on a Solana explorer first, then retry with a fresh blockhash. The expired attempt was not charged a fee unless it landed before expiry, which the explorer lookup shows, and a modestly higher priority fee can help if it keeps expiring during congestion.