Error reference

Every transaction error, explained

The exact messages wallets and block explorers show when a transaction fails, in plain English: what each one means, and how to fix it. 43 errors and counting.

Have a failed transaction right now? Skip the list: paste the hash and get the decoded reason.

Decode a transaction

Gas and fees

The transaction never really ran, or ran out of the computation you authorised.

intrinsic gas too low

The gas limit set on the transaction is below the minimum the network requires just to accept it, before any contract logic runs. Every transaction has a base cost (21,000 gas for a simple transfer, more when data is attached), and this limit did not cover it.

out of gas

The transaction ran, consumed its entire gas limit partway through execution, and reverted. This is about the gas limit you authorised, not your coin balance: you can hold plenty of ETH and still run out of gas. You pay for the computation used up to the point it stopped.

gas required exceeds allowance

The node's own estimate of the gas needed came out higher than the cap you allowed, and in most cases that is because the transaction would revert if it actually ran. The estimate blows up because the simulated execution fails.

insufficient funds for gas * price + value

The wallet does not hold enough of the chain's native coin (ETH, BNB, POL, and so on) to cover the amount being sent plus the maximum possible gas fee. The check uses the maximum fee, not the likely fee, so it can trigger even when the eventual fee would have been affordable.

max fee per gas less than block base fee

The maximum fee you offered per unit of gas is below the network's current base fee, so no block can include the transaction. Base fee moves with congestion, and a fee that was fine an hour ago can be under the floor now.

transaction underpriced

The gas price on the transaction is below what the node's mempool will currently accept, so it refused to queue it at all. This is the node protecting itself from transactions that would sit forever.

max priority fee per gas higher than max fee per gas

The transaction's tip (priority fee) is set higher than its overall fee ceiling (max fee), which is contradictory: the tip is paid out of the ceiling. This comes from manually editing one field without the other.

exceeds block gas limit

The gas limit on the transaction is larger than the maximum a whole block can hold, so no block could ever include it. This is almost always a manually entered limit with too many zeros.

Mempool and nonce

The network would not accept or include the transaction, usually an ordering or pricing problem.

Contract reverts

The transaction ran and the smart contract rejected it, with a reason.

execution reverted

The transaction ran and the smart contract rejected it: a require() condition failed, an assertion tripped, or the contract explicitly reverted. Every state change was rolled back as if it never happened, but the gas used up to that point is spent. On its own this message does not say WHY, the specific reason is in the revert data.

ERC20: transfer amount exceeds balance

The transaction tried to move more of a token than the sending address holds. This also appears when a contract tries to move tokens on your behalf and the balance changed since you signed, or when token decimals made the amount larger than intended.

ERC20: transfer amount exceeds allowance

A contract (a router, a staking contract, a bridge) tried to pull your tokens, but you have not approved it to move that much. Token transfers by third parties require an explicit approval first, and the approval is per token, per spender.

insufficient allowance

The same failure as an ERC20 allowance revert, in its shorter modern form: the contract you called is not approved to move enough of your token. Newer token contracts emit this compact message instead of the long ERC20 prefix.

STF

A Uniswap V3 safe-transfer-from failure. The router tried to pull tokens from your wallet and the transfer returned false, which in practice means a missing or insufficient token approval, or a token with unusual transfer behaviour (fee-on-transfer, blocklists).

TRANSFER_FROM_FAILED

A low-level transferFrom call returned false instead of succeeding. Routers wrap token pulls in this check, so it fires when the approval is missing, the balance is short, or the token contract itself refused the transfer (paused, blocklisted, or non-standard).

TRANSFER_FAILED

A token transfer OUT of the contract failed: the pool or vault tried to send you tokens and the token contract refused. Common with tokens that have transfer restrictions, fees on transfer, or paused states.

INSUFFICIENT_OUTPUT_AMOUNT

Slippage protection fired. Between signing the swap and it being mined, the price moved, and the trade would have delivered less than the minimum you agreed to receive. The contract refused to fill at the worse price, which is the protection working, not a malfunction.

INSUFFICIENT_INPUT_AMOUNT

The swap reached the pool with a zero or too-small input amount. Usually a dapp bug or a stale quote rather than something you set: the route was built for an amount that no longer matches what the transaction carries.

INSUFFICIENT_LIQUIDITY

The pool does not hold enough of the tokens to fill the trade, mint the position, or cover the withdrawal at the size requested. Common on small or new pools, and on forgotten pools where liquidity has drained away.

EXPIRED

The swap carried a deadline and did not get mined before it passed. Deadlines protect you from a transaction sitting in the mempool for an hour and executing at a stale price. A too-low fee is the usual reason it missed the window.

UniswapV2: K

The pool's invariant check failed: after the swap, the pool would hold less value than before, which the contract forbids. In practice this almost always involves a token that takes a fee on transfer or otherwise misreports amounts, breaking the pool's arithmetic.

Ownable: caller is not the owner

The function you called is restricted to the contract's owner, and your address is not it. Regular users hitting this are almost always on the wrong function, the wrong contract, or following instructions meant for the protocol team.

Pausable: paused

The protocol has paused this part of the contract, usually during an incident, a migration, or maintenance. The revert is the pause doing its job: nothing about your wallet or transaction is wrong, and nothing moved.

ReentrancyGuard: reentrant call

The contract blocked a call that re-entered it before a previous call finished, which is the classic shape of an exploit attempt, but can also fire on legitimate complex interactions between contracts.

SafeMath: subtraction overflow

An older contract tried to subtract a larger number from a smaller one, which SafeMath blocks. In practice this is how pre-0.8 Solidity contracts say insufficient balance or insufficient allowance: the subtraction that failed was balance minus amount.

SafeERC20: low-level call failed

A contract used OpenZeppelin's safe wrapper to call a token, and the token call itself failed or returned nonsense. Fires with non-standard tokens, tokens that are not actually deployed at the address used, and tokens with transfer restrictions.

Solidity panics

Automatic safety checks the compiler inserts. A panic means the contract reached a state it did not expect.

panic code 0x11

An arithmetic operation went above the maximum or below zero for its number type. Since Solidity 0.8 this check is automatic. For a user, the practical meaning is usually an amount that does not fit: subtracting more than a balance, or a calculation the contract did not expect.

panic code 0x12

The contract divided by zero. A user cannot normally cause this with inputs: it usually means the contract read a zero where it expected a value, an empty pool, a price feed returning zero, an uninitialised parameter.

panic code 0x32

The contract read past the end of an array: asking for item 5 of a list with 3 entries. From a user's seat this often means referencing something that does not exist, a position, a tier, an index from a stale interface.

panic code 0x01

An assert() check failed. Assertions guard conditions the developers believed could never be false, so a failing one signals a genuine bug or an extraordinary state, not a user mistake.

panic code 0x21

A value was converted into an enum (a fixed list of options) that does not contain it, like passing option 7 where only options 0 to 3 exist. Usually a dapp passing a bad parameter.

panic code 0x31

The contract tried to remove an item from an empty list. Like other panics, it points at contract state the developers did not expect rather than at your inputs.

panic code 0x41

The contract tried to allocate too much memory or build an oversized array, typically triggered by a parameter that is far larger than intended.

panic code 0x51

The contract called an internal function variable that was never set. This is purely a contract bug: no user input causes it.

Wallet and RPC errors

Warnings and failures from the wallet or the node, often before anything is signed.

Seeing a raw hex code like 0x118cdaa7 instead of a message? That is a custom-error selector: look it up in the selector reference. For the full walkthrough of why transactions fail, read the error guide.