# Ethereum error message decoder

> Paste an Ethereum error message from viem, a wallet or a JSON-RPC node and get the matching error page, where it stops and the fix.

Source: https://hashspan.dev/errors/decode

The decoder runs in the browser at https://hashspan.dev/errors/decode. It looks for each error page's messages (the node's wording, viem's message and viem's error class) anywhere in the pasted text, including inside JSON, after dropping hashes, numbers and punctuation. The longest message found wins.

## Example

viem's error from the nonce too low run (Anvil, viem 2.57.2):

```
TransactionExecutionError: Nonce provided for the transaction is lower than the current nonce of the account.
Try increasing the nonce or find the latest nonce with `getTransactionCount`.

Request Arguments:
  from:   0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
  to:     0x70997970C51812dc3A010C7d01b50e0d17dc79C8
  value:  0.001 ETH
  nonce:  0

Details: nonce too low
Version: viem@2.57.2
```

Decodes to [Nonce too low](https://hashspan.dev/errors/nonce-too-low.md).

## Errors it decodes

| Message | Also printed as | Where it stops | Fix | Page |
|---|---|---|---|---|
| `insufficient funds for gas * price + value` | `The total cost (gas * gas fee + value) of executing this transaction exceeds the balance of the account.`, `exceeds transaction sender account balance`, `InsufficientFundsError`, `insufficient funds`, `InsufficientFunds` | Rejected before the chain | Fund the account on that chain, send less, or lower the gas limit and fee cap you set. | [Insufficient funds for gas * price + value: cause and fix](https://hashspan.dev/errors/insufficient-funds.md) |
| `gas required exceeds allowance` | `Out of gas: gas required exceeds allowance: 0`, `Execution reverted with reason: Out of gas: gas required exceeds allowance: 30000000.`, `gas required exceeds allowance (0)`, `out of gas: gas required exceeds: 16777216`, `ExecutionRevertedError` | Rejected before the chain | Read the number: 0 means fund the account; a large one means the call never ends. | [Gas required exceeds allowance: cause and fix](https://hashspan.dev/errors/gas-required-exceeds-allowance.md) |
| `max fee per gas less than block base fee` | `The fee cap (maxFeePerGas = 0.999999999 gwei) cannot be lower than the block base fee.`, `FeeCapTooLowError`, `fee cap less than block base fee` | Rejected before the chain | Do not hardcode the fee: ask the client to estimate it, and leave room above the base fee. | [Max fee per gas less than block base fee: cause and fix](https://hashspan.dev/errors/max-fee-per-gas-less-than-block-base-fee.md) |
| `intrinsic gas too low` | `The amount of gas (1000) provided for the transaction is too low.`, `intrinsic gas too low: gas <your limit>, minimum needed <the minimum>`, `IntrinsicGasTooLowError` | Rejected before the chain | Do not set the limit by hand: let the client estimate it. | [Intrinsic gas too low: cause and fix](https://hashspan.dev/errors/intrinsic-gas-too-low.md) |
| `nonce too low` | `Nonce provided for the transaction is lower than the current nonce of the account.`, `NonceTooLowError`, `transaction already imported`, `already known`, `OldNonce`, `nonce has already been used`, `NONCE_EXPIRED` | Rejected before the chain | Let the client choose the next nonce instead of setting it yourself. | [Nonce too low in Ethereum: cause and fix](https://hashspan.dev/errors/nonce-too-low.md) |
| `nonce too high` | `Nonce too high. Expected nonce to be 0 but got 5. Note that transactions can't be queued when automining.`, `Nonce provided for the transaction (5) is higher than the next one expected.`, `NonceTooHighError` | Rejected before the chain | Let the client read the nonce from the node, or send the missing nonces first. | [Nonce too high: cause and fix](https://hashspan.dev/errors/nonce-too-high.md) |
| `replacement transaction underpriced` | `Transaction creation failed.`, `replacement fee too low`, `REPLACEMENT_UNDERPRICED`, `TransactionRejectedRpcError` | Rejected before the chain | Raise both fee fields by at least 10%, which is geth's default, or wait for the first transaction. | [Replacement transaction underpriced: cause and fix](https://hashspan.dev/errors/replacement-transaction-underpriced.md) |
| `WaitForTransactionReceiptTimeoutError` | `Timed out while waiting for transaction with hash`, `timeout` | Waiting in the pool | Send the missing nonce, or replace the stuck transaction with higher fees. | [Transaction stuck pending: causes and fix](https://hashspan.dev/errors/transaction-stuck-pending.md) |
| `Dropped & Replaced` |  | Replaced in the pool | Look up the replacing transaction: if you did not send it, find what did and resend what you still need. | [Transaction dropped and replaced: meaning and fix](https://hashspan.dev/errors/transaction-dropped-and-replaced.md) |
| `execution reverted` | `execution reverted: Withdrawals are paused`, `Execution reverted with reason: Withdrawals are paused.`, `The contract function "withdraw" reverted with the following reason: Withdrawals are paused`, `The contract function "withdrawAmount" reverted with the following signature: 0xb945e2d8`, `ExecutionRevertedError`, `ContractFunctionRevertedError`, `ContractFunctionExecutionError`, `reverted with the following reason`, `reverted with the following signature`, `reverted` | Failed on the chain | Read the reason, then fix the input or the state. | [Execution reverted: what it means and how to fix it](https://hashspan.dev/errors/execution-reverted.md) |
| `out of gas` | `status: reverted, with gas used equal to the gas limit`, `reverted` | Failed on the chain | Raise the limit, or find out why the code uses so much. | [Out of gas in Ethereum: cause and fix](https://hashspan.dev/errors/out-of-gas.md) |

## FAQ

### Does the error text leave my browser?

No. The matching runs in this page, and the text is not sent anywhere or stored. The site’s cookie-free analytics count only whether a page matched and which one, never the text.

### What do Ethereum JSON-RPC error codes like -32000 and -32003 mean?

They name a kind of failure, not its cause. EIP-1474 lists -32000 as "Invalid input" (missing or invalid parameters) and -32003 as "Transaction rejected" (transaction creation failed), the same words viem prints for a refusal it has no name for. The message next to the code says which rule failed, so paste the message too.

### Which error messages can it read?

The messages listed on each error page: the node’s wording (Anvil, and geth where the page quotes its source), viem’s own message and viem’s error class, such as NonceTooLowError. Text that wraps those words still matches, because the decoder looks for them anywhere in what you paste, including inside JSON.

### What if my error is not found?

Then there is no page for it yet. Try the part with the node’s own words, such as the line after "Details:" in a viem error. If that does not match either, open an idea on GitHub with the message and we will add a page.
