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 error | What it means | Network fee spent? | What to do |
|---|---|---|---|
| "nonce too low" | A transaction with this number already confirmed; wallet state is stale | No | Resync 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 bump | No | Bump more; Geth's default requires 10% |
| "max fee per gas less than block base fee" | Your max fee is under the current base fee | No | Raise the max fee |
| "insufficient funds for gas * price + value" | Native coin cannot cover amount plus maximum gas | No | Top up the native coin; see tokens but no gas token |
| "already known" | The same transaction is already in the mempool | No | Wait; it is harmless |
| "out of gas" | Execution passed its gas limit; changes undone | Yes | Retry 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##.
| Code | What it means | Network fee spent? |
|---|---|---|
| AA21 didn't pay prefund | No paymaster used, and the account's EntryPoint deposit cannot cover maximum gas | No |
| AA23 reverted | The account's validation code rejected the operation | No |
| AA33 reverted | The paymaster's validation rejected the operation | No |
| AA95 out of gas | The bundle's gas limit was too low for the operation or a sub-call | Normally 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 error | What it means | Network fee spent? | What to do |
|---|---|---|---|
| "Transaction simulation failed: Blockhash not found" | Blockhash too old, or the simulating node had not seen it yet | No | Retry for a fresh blockhash |
| "block height exceeded" (TransactionExpiredBlockheightExceededError) | It did not land before the blockhash expired | No, unless it landed just before expiry; check the signature | Check 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 slippage | No, when caught in simulation before sending; if a wallet or app skips simulation, the transaction can land as Failed and the fee is spent | Read 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 all | No | Fund it with SOL |
| "Transaction results in an account (0) with insufficient funds for rent" | Sending would leave an account below the rent-exempt minimum | No, when caught in simulation; if simulation is skipped it can land as Failed and cost the fee | Send slightly less; see Solana rent |
| Explorer shows "Failed" | It landed and the program returned an error | Yes | Read 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).
| Signal | What it means | Network fee spent? | What to do |
|---|---|---|---|
| Exit code 13 or -14 | Out of gas in the compute phase | Yes, for gas used | Attach more GRAM |
| Exit code 9 | Cell underflow: the contract tried to read more data than a cell holds, often because the payload does not match what the contract expects | Yes | Check the payload or comment suits that contract |
| Exit code 37 | Action phase: "Not enough GRAMs" to send the outgoing message | Yes | Attach more GRAM |
| Compute phase skipped | The message carried too little GRAM to pay for execution | No gas; the storage phase still runs | Send with more GRAM attached |
| Bounced message | Destination failed or does not exist | Yes, fees deducted | Value 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.

