Error reference
Every transaction error, explained
The exact messages wallets and block explorers show when a transaction fails, and what each one means. 258 errors and counting.
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.
nonce too low
The transaction's nonce (its sequence number) has already been used: either an earlier transaction with that nonce was mined, or one is already pending. Very often the action you are retrying actually went through the first time.
nonce too high
There is a gap in the sequence: an earlier transaction from this address has not been mined yet, so this one cannot be processed. Transactions from one address must confirm in nonce order.
already known
The exact same signed transaction is already sitting in the node's mempool. Nothing failed: the node is telling you it has seen this one before, usually because a wallet or dapp resubmitted it.
replacement transaction underpriced
You tried to replace a pending transaction (a speed-up or a cancel reuses its nonce), but the replacement's fee is not enough of an increase. Nodes require roughly a 10% bump or more before they will swap one pending transaction for another.
transaction dropped and replaced
The network discarded the transaction, usually because another transaction with the same nonce confirmed first (a speed-up, a cancel, or simply a competing transaction), or because it sat unmined so long the mempool evicted it. A dropped transaction costs nothing: it never executed.
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.
cannot estimate gas; transaction may fail or may require manual gas limit
Before asking you to sign, the wallet simulated the transaction against current chain state, and the simulation reverted, so no gas estimate exists. This is a preview of a failure, shown before you pay for it.
this transaction is likely to fail
The same pre-signing simulation, in friendlier words: the wallet ran the transaction and it did not succeed. The failure it saw is real, based on the chain as it is right now.
user rejected the request
The wallet reported back to the dapp that the signing prompt was declined. If you pressed reject, that is the whole story. If you never saw a prompt, the popup was blocked, opened behind the window, or timed out.
internal JSON-RPC error
A catch-all from the wallet's connection to the network node: the node returned an error the wallet could not translate. Sometimes it wraps a real revert, sometimes the node itself is unhealthy or rate limiting.
header not found
The RPC node was asked about a block it does not have yet, a sign the node is lagging behind the chain or load-balancing between out-of-sync servers. Your transaction and wallet are fine.
Non-EVM chains
Result codes from chains that do not use the EVM, where the failure arrives as a named constant or a bare number rather than a revert string.
Aptos
Decibel · 28
EINVALID_STOP_PRICE
The stop/trigger price on this order is invalid for the current market price, for example a stop that would trigger immediately or on the wrong side. Check the trigger side and price against the market and retry.
EINVALID_TP_SL_FOR_REDUCE_ONLY
A take-profit/stop-loss cannot be attached to a reduce-only order. Place the reduce-only order without TP/SL, or set the TP/SL on the position itself.
EINVALID_TP_SL_WITH_TRIGGER_CONDITION
A take-profit/stop-loss cannot be combined with a stop/trigger price on the same order. Place the triggered order first, then set TP/SL on the resulting position.
EBUILDER_NOT_REGISTERED
The builder code attached to this order is not registered with Decibel. This is an integration issue with the app that routed your order, not your account; report it to that app's team or trade from the official interface.
EINVALID_AMOUNT
The builder fee on this order is zero or negative, which is not valid. This comes from the app that routed your order; retry from the official interface or report it to that app's team.
EINVALID_MAX_FEE
The builder fee on this order exceeds the maximum fee you approved for that app. Review the app's fee settings, or approve a higher maximum builder fee if you trust it.
EPRICE_CROSSING
The bulk order was rejected because its buy and sell prices cross each other: at least one bid was priced at or above one of the asks in the same submission, which would have the order trade against itself. Nothing was placed and only gas was spent. Adjust the ladder so every bid sits strictly below every ask, then resubmit. If you are using automatic repricing, the quotes most likely moved between building the order and submitting it, so rebuild from a fresh mid price.
EINVALID_PRICE_IS_ZERO
The order price worked out to zero, which is not a valid price. Check the price and retry.
EINVALID_SIZE_IS_ZERO
The order or settlement size worked out to zero, so there was nothing to execute. Check the size and retry.
ENOT_REDUCE_ONLY
The order was marked reduce-only but would have increased your position instead of reducing it. A reduce-only order can only close or shrink an open position: check the order's side and size against your current position.
ESELF_TRADE_NOT_ALLOWED
The order would have matched against your own resting order on the other side of the book, which Decibel does not allow. Cancel the opposing order first, or adjust the price so it does not cross your own quote.
ENOT_SUBACCOUNT_OWNER_OR_LACKS_PERP_TRADING_PERMISSIONS
The signing wallet does not own this subaccount and has not been granted trading permission on it. Switch to the wallet that owns the subaccount, or have the owner grant this wallet trading permissions, then retry.
ESUBACCOUNT_IS_NOT_ACTIVE
This subaccount is not active, so it cannot place or cancel orders. In the app, check which subaccount you are trading from and switch to an active one.
EINVALID_MATCH_COUNT
The order failed an internal match-count check in the matching engine. This is a protocol-side condition rather than something you did wrong. Retry the order; if it keeps failing, report it to the team.
E_INVALID_REDUCE_ONLY_ORDER
The reduce-only order is invalid against your current position, usually because the position is already closed or smaller than the order size. Refresh the position and adjust the order.
E_MARKET_NOT_FOUND
The cancel request referenced a market where this subaccount has no pending orders. The order may have already filled or been cancelled: refresh your open orders before retrying.
EINVALID_TP_SL_SIZE
The take-profit/stop-loss size is invalid for the position (zero, or larger than the position). Adjust the TP/SL size to at most the open position size.
EMAX_FIXED_SIZED_PENDING_REQS_HIT
This subaccount already has the maximum number of pending requests, so new ones are rejected until some settle or are cancelled. Cancel pending orders you no longer need, or wait a moment for the queue to clear.
EMARKET_HALTED
This market is currently halted, so orders cannot be placed or cancelled right now. This is an exchange-side pause, not a problem with your account or funds. Wait for trading to resume and retry.
EINVALID_PRICE
The order price is zero or invalid for this market. Enter a valid price and retry.
EORDER_SIZE_TOO_LARGE
The order's notional value (price multiplied by size) is larger than this market allows. Reduce the order size and retry.
EPRICE_NOT_RESPECTING_TICKER_SIZE
The limit price is not a multiple of this market's tick size, so the order was rejected. Round the price to the nearest valid tick and retry.
EPRICE_SIZES_LENGTH_MISMATCH
The bulk order's price list and size list have different lengths. This is an integration bug in the client that built the order, not a user mistake; report it to the team behind that client.
ESIZE_NOT_RESPECTING_MIN_SIZE
The order size is below this market's minimum order size. Increase the size to at least the market minimum and retry.
EINVALID_TP_SL_ORDER_ID
The take-profit/stop-loss order id in this request does not match any live TP/SL order on the position. The order was most likely already triggered or cancelled, or it belongs to a different position. Refresh the position in the app and check its active TP/SL orders; if the order is gone from the list, there is nothing left to cancel.
EORDER_NOT_FOUND
The order in this request was no longer on the market's order book when it reached the chain, so there was nothing to change or cancel. This is common in fast markets. The transaction stopped there, so no position or balance was affected and only gas was spent. This error does not say whether the original order filled or was cancelled, so check that before placing it again: re-placing an order that already filled would trade a second time.
EINSUFFICIENT_PFS_FUNDS
This spot order was rejected because the wallet's available balance is short on one side of the pair: either not enough of the asset being sold, or not enough of the quote asset to buy with. The check runs before anything is placed, so nothing was traded and only gas was spent. Top up the wallet, or reduce the order size, and retry.
EINVALID_TP_SL_PARAMETERS
The take-profit/stop-loss parameters are invalid, usually a TP or SL price on the wrong side of the current price. For a long, take-profit must be above and stop-loss below the price (reversed for a short). Fix the prices and retry.
PancakeSwap · 18
E_INPUT_MORE_THAN_MAX
The swap stopped because it would have needed more input tokens than the maximum your slippage setting allows. The price moved against you between quoting and signing. Nothing was swapped. Retry, and raise your slippage tolerance slightly if it keeps happening.
E_INSUFFICIENT_X_AMOUNT
Adding liquidity failed because the amount of the first token in the pair would have fallen below the minimum you set. The pool's ratio shifted since the quote. Retry the deposit, or loosen the minimum amounts slightly.
E_INSUFFICIENT_Y_AMOUNT
Adding liquidity failed because the amount of the second token in the pair would have fallen below the minimum you set. The pool's ratio shifted since the quote. Retry the deposit, or loosen the minimum amounts slightly.
E_OUTPUT_LESS_THAN_MIN
The swap stopped because the amount you would have received fell below the minimum your slippage setting allows. The price moved between quoting and signing. Nothing was swapped and only gas was spent. Retry the swap; if it keeps happening, raise your slippage tolerance slightly or trade a smaller amount.
E_PAIR_NOT_CREATED
No liquidity pool exists for this token pair on PancakeSwap, so the trade has no route. Double-check both tokens are the ones you meant. If the pair genuinely has no pool, it cannot be swapped here.
ERROR_INSUFFICIENT_AMOUNT
The pool does not hold enough of one of its tokens to pay out the amount this operation asked for, so it stopped before anything moved. Nothing was swapped or withdrawn and only gas was spent. Try a smaller amount.
ERROR_INSUFFICIENT_INPUT_AMOUNT
The swap was given a zero or too-small input amount. Enter a larger amount and retry.
ERROR_INSUFFICIENT_LIQUIDITY
The pool does not hold enough liquidity for this trade size. Try a smaller amount, or use a pair with deeper liquidity.
ERROR_INSUFFICIENT_LIQUIDITY_BURNED
The liquidity withdrawal was too small to redeem anything from the pool. Remove a larger share of your position and retry.
ERROR_INSUFFICIENT_LIQUIDITY_MINTED
The liquidity deposit was too small to mint any LP tokens. Deposit larger amounts of both tokens and retry.
ERROR_INSUFFICIENT_OUTPUT_AMOUNT
The swap would have produced zero output tokens, usually because the trade size is far too small for this pool. Increase the amount and retry.
ERROR_INVALID_AMOUNT
Adding liquidity failed because the two amounts don't match the pool's current price ratio: covering the second token would need more of the first token than you supplied. Nothing was added and only gas was spent. Refresh the amounts in the app so they match the pool's current ratio, then retry.
ERROR_K
The pool's final safety check failed: after the trade, its reserves would have broken the rule that keeps its pricing sound, so the whole swap was undone. Nothing was swapped and only gas was spent. This is rare and not caused by anything in your wallet. Retry, and if it keeps happening, report it to PancakeSwap.
ERROR_INSUFFICIENT_AMOUNT
An amount in this operation was zero or too small for the pool to process. Check the amounts you entered and retry with larger values.
ERROR_INSUFFICIENT_INPUT_AMOUNT
The swap was given a zero or too-small input amount. Enter a larger amount and retry.
ERROR_INSUFFICIENT_LIQUIDITY
The pool for this pair has no usable liquidity right now, so a price cannot be computed. Try a smaller amount or a different pair.
ERROR_INSUFFICIENT_OUTPOT_AMOUNT
The swap would have produced zero output tokens, usually because the trade size is far too small for this pool. Increase the amount and retry.
ERROR_SAME_COIN
The swap was asked to trade a token for itself. Pick two different tokens and retry.
Amnis · 10
EALREADY_VOTED
This wallet has already voted on this proposal, and each wallet can vote only once. No action is needed.
ELOCK_HAS_NOT_EXPIRED
Your governance lock has not expired yet, so the tokens cannot be unlocked. Wait until the lock period ends and try again.
ENO_TOKENS_LOCKED
This wallet has no tokens locked for Amnis governance, so there is nothing to vote with or unlock. Lock tokens first.
ESTAKE_POOL_DOES_NOT_EXIST
The stake pool this operation targets does not exist. This is a protocol configuration issue rather than a user mistake; if you hit this from the Amnis app, report it to the team.
ESTAKE_POOL_NOT_WHITELISTED
The target stake pool is not whitelisted by Amnis. This is a protocol configuration issue rather than a user mistake; if you hit this from the Amnis app, report it to the team.
EUNSTAKE_AMOUNT_TOO_LARGE
Amnis unstakes each withdrawal from a single validator pool, and none of its pools currently has enough active stake to cover this amount on its own. Nothing was unstaked and only gas was spent. Try a smaller amount, or split the withdrawal into several smaller ones.
EINSUFFICIENT_AMOUNT
The amount is below the minimum Amnis accepts for this operation, so nothing was staked or moved. Increase the amount and retry.
EINSUFFICIENT_DEPOSIT_AMOUNT
The deposit is below the minimum deposit Amnis accepts. Deposit a slightly larger amount of APT and retry.
ENOT_WITHDRAWAL_TOKEN_OWNER
The withdrawal ticket you tried to claim belongs to a different wallet. Switch to the wallet that requested the withdrawal and claim from there.
ETOKEN_LOCK_NOT_EXPIRED
This withdrawal is still inside its unbonding period, so it cannot be claimed yet. Wait until the lockup shown on your withdrawal ticket ends, then claim again.
Thala · 2
ERR_INSUFFICIENT_OUTPUT
The swap was cancelled because the amount you would have received fell below the minimum your slippage setting allows. The pool price moved between quoting and signing. Nothing was swapped and only gas was spent. Retry the swap; if it keeps happening, raise your slippage tolerance slightly or trade a smaller amount.
ERR_INSUFFICIENT_OUTPUT
The swap was cancelled because the amount you would have received fell below the minimum your slippage setting allows. The pool price moved between quoting and signing. Nothing was swapped and only gas was spent. Retry the swap; if it keeps happening, raise your slippage tolerance slightly or trade a smaller amount.
Hyperliquid
badAloPxRejected
The order was add-liquidity-only, and its price would have crossed the book and taken liquidity instead of adding it. Add-liquidity-only exists to guarantee the maker fee, so rather than filling at taker terms the order is refused. The market moved between the price being chosen and the order arriving.
canceled
The order was cancelled. On Hyperliquid this is the trader's own cancellation, so if the user did not cancel it, an app or a bot acting for them did.
insufficientSpotBalanceRejected
There was not enough of the spot asset to place this order. Spot and perpetual balances are held separately on Hyperliquid, so funds sitting on the perpetuals side do not back a spot order until they are transferred.
iocCancelRejected
The order was immediate-or-cancel, and there was nothing on the book to fill it at that price, so it was cancelled instead of resting. That is what immediate-or-cancel asks for: fill now or not at all. Nothing was traded.
minTradeNtlRejected
The order was below Hyperliquid's minimum trade value. Every market has a floor in dollars rather than in coins, so a small order in a high-priced asset can be under it even when the quantity looks reasonable. Nothing was traded and nothing was charged.
perpMarginRejected
There was not enough margin for this perpetual order. Margin is the collateral the position needs, not the account balance, so an account can hold funds and still be unable to open more.
reduceOnlyCanceled
The exchange cancelled this resting reduce-only order because the position it was there to reduce is gone. The trader did not cancel it. Nothing was traded.
reduceOnlyRejected
The order was marked reduce-only, and there was no position left for it to reduce. That usually means the position had already been closed, or another order closed it first. Nothing was traded.
rejected
The exchange refused the order without naming a more specific reason. Nothing was traded.
triggered
A stop or take-profit condition was met, so the order was released onto the book.
NEAR
insufficient balance or overflow
The account did not hold enough of the token this intent was going to spend, or the amounts involved were too large to process. Nothing was executed.
invalid intent
The intent this transaction carried was not one the contract would accept, usually because it had already been used, had expired, or was signed for different terms than the ones submitted. Nothing was executed.
E68
The price moved between the swap being quoted and it reaching the pool, by more than the slippage the swap allowed. Ref refuses rather than filling at a worse rate than agreed. Nothing was traded, only the gas was spent, and trying again with a slightly higher slippage tolerance, or a smaller size, usually goes through.
E76
The pool did not hold enough of the token being bought to complete this swap at the size requested. A smaller amount, or a different route, will usually go through.
Solana
BuySlippageBelowMinBaseAmountOut
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
BuySlippageBelowMinTokensOut
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
CoinCreatorMigratedToSharingConfig
coin creator has been migrated to sharing config, use pump_fees::reset_fee_sharing_config instead.
CreatorVaultMigratedToSharingConfig
creator_vault has been migrated to sharing config, use pump:distribute_creator_fees instead.
ExceededAmountSlippageTolerance
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
ExceededSlippage
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
InvalidSlippage
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
LessThanMinimumAmountOut
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
MinReturnNotReached
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
SlippageLimitExceeded
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
SlippageToleranceExceeded
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
TooLittleSolReceived
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
TooMuchSolRequired
The price moved between the quote and the transaction landing, so the trade would have returned less than your slippage setting allows. Nothing was swapped and only the fee was spent. Retry, and raise your slippage tolerance slightly if it keeps happening.
Stellar
ACCOUNT_MERGE_DEST_FULL
Merging would take the destination account past the maximum balance it can hold.
ACCOUNT_MERGE_HAS_SUB_ENTRIES
The account still has trustlines, offers, signers or data entries, and all of those have to be removed before it can be merged away.
CHANGE_TRUST_INVALID_LIMIT
The trustline limit given was not valid, for example lower than the balance already held.
CHANGE_TRUST_LOW_RESERVE
Adding this trustline would take the account below its minimum reserve. Each trustline raises the XLM an account must keep, so more XLM is needed before it can be added.
CHANGE_TRUST_NOT_AUTH_MAINTAIN_LIABILITIES
The issuer has not authorised this account to maintain liabilities on the asset.
CLAIM_CLAIMABLE_BALANCE_CANNOT_CLAIM
This account is not able to claim that balance right now. A claimable balance carries conditions, most often a time window, and they were not met.
CLAIM_CLAIMABLE_BALANCE_DOES_NOT_EXIST
There is no claimable balance with that identifier. It may already have been claimed.
CLAIM_CLAIMABLE_BALANCE_LINE_FULL
Claiming this would take the account past the limit on its trustline for the asset.
CLAIM_CLAIMABLE_BALANCE_NO_TRUST
The account has no trustline for the asset in this claimable balance, so it cannot receive it.
CREATE_ACCOUNT_UNDERFUNDED
The funding account did not have enough XLM to create the new account with its minimum starting balance.
CREATE_CLAIMABLE_BALANCE_LOW_RESERVE
Creating this claimable balance would take the account below its minimum reserve.
CREATE_CLAIMABLE_BALANCE_MALFORMED
The claimable balance was not well formed, for example an invalid amount or claimant.
CREATE_CLAIMABLE_BALANCE_NO_TRUST
The account has no trustline for the asset it tried to lock into a claimable balance.
INVOKE_HOST_FUNCTION_ENTRY_ARCHIVED
The contract data this call needed has been archived. Soroban expires state that has not been used, and it has to be restored before the contract can run again.
INVOKE_HOST_FUNCTION_INSUFFICIENT_REFUNDABLE_FEE
The refundable portion of the fee was not enough to cover the contract's rent and events.
INVOKE_HOST_FUNCTION_RESOURCE_LIMIT_EXCEEDED
The contract call needed more resources than the transaction reserved for it. On Soroban a transaction declares its resource budget up front, so this is a budget set too low rather than an account short of funds.
INVOKE_HOST_FUNCTION_TRAPPED
The contract stopped partway through and rejected the call. The reason is defined by the contract rather than by Stellar, so what it means depends on the protocol. Nothing the transaction set out to do took effect.
LIQUIDITY_POOL_DEPOSIT_BAD_PRICE
The pool's price moved outside the range this deposit allowed, so it was refused rather than filled at a worse rate.
LIQUIDITY_POOL_DEPOSIT_NO_TRUST
The account has no trustline for the pool shares or for one of the pool's assets.
LIQUIDITY_POOL_WITHDRAW_UNDER_MINIMUM
The withdrawal would have returned less than the minimum set, so it was refused. The pool's composition moved between the quote and the transaction being applied.
MANAGE_BUY_OFFER_BUY_NO_TRUST
The account has no trustline for the asset it offered to buy, so it could not receive it.
MANAGE_BUY_OFFER_CROSS_SELF
This offer would have matched against the account's own existing offer, which Stellar does not allow.
MANAGE_BUY_OFFER_LINE_FULL
Filling this offer would take the account past the limit on its trustline for the asset it would receive.
MANAGE_BUY_OFFER_LOW_RESERVE
Keeping this offer on the book would take the account below its minimum reserve. Each open offer raises the XLM an account must hold.
MANAGE_BUY_OFFER_MALFORMED
The offer was not well formed, for example a non-positive amount or an invalid price.
MANAGE_BUY_OFFER_NOT_FOUND
The offer this was trying to change or cancel is no longer on the book. It may already have been filled or cancelled.
MANAGE_BUY_OFFER_UNDERFUNDED
The account does not hold enough of the asset it offered to pay with, once the reserve is taken into account.
MANAGE_SELL_OFFER_BUY_NO_TRUST
The account has no trustline for the asset it offered to buy, so it could not receive it.
MANAGE_SELL_OFFER_CROSS_SELF
This offer would have matched against the account's own existing offer, which Stellar does not allow.
MANAGE_SELL_OFFER_LINE_FULL
Filling this offer would take the account past the limit on its trustline for the asset it would receive.
MANAGE_SELL_OFFER_LOW_RESERVE
Keeping this offer on the book would take the account below its minimum reserve. Each open offer raises the XLM an account must hold.
MANAGE_SELL_OFFER_MALFORMED
The offer was not well formed, for example a non-positive amount or an invalid price.
MANAGE_SELL_OFFER_NOT_FOUND
The offer this was trying to change or cancel is no longer on the book. It may already have been filled or cancelled.
MANAGE_SELL_OFFER_UNDERFUNDED
The account does not hold enough of the asset it offered to sell, once the reserve is taken into account.
opTOO_MANY_SUBENTRIES
The account already holds the maximum number of subentries (trustlines, offers, signers and data entries), so another could not be added.
PATH_PAYMENT_STRICT_RECEIVE_LINE_FULL
The destination's trustline for this asset has a limit, and this payment would have taken it over. The recipient sets that limit and can raise it.
PATH_PAYMENT_STRICT_RECEIVE_MALFORMED
The swap was not well formed, for example a non-positive amount or an invalid asset.
PATH_PAYMENT_STRICT_RECEIVE_NO_DESTINATION
The destination account does not exist on the ledger. A Stellar account has to be created before it can be paid.
PATH_PAYMENT_STRICT_RECEIVE_NO_TRUST
The destination has no trustline for the asset being delivered. On Stellar an account has to explicitly trust an asset before it can receive it, so this is something the recipient sets up, not a problem with the payment.
PATH_PAYMENT_STRICT_RECEIVE_NOT_AUTHORIZED
The destination is not authorised by the asset's issuer to hold it. Some issuers require approval per account.
PATH_PAYMENT_STRICT_RECEIVE_OFFER_CROSS_SELF
The path would have matched against this account's own offer, which Stellar does not allow.
PATH_PAYMENT_STRICT_RECEIVE_OVER_SENDMAX
The swap would have cost more than the maximum you set, so Stellar refused it rather than spending more than you allowed. That maximum is your slippage protection doing its job: the price along the path moved between the quote and the transaction being applied. Nothing was swapped and only the fee was spent.
PATH_PAYMENT_STRICT_RECEIVE_SRC_NO_TRUST
The sending account has no trustline for the asset it tried to send, so it cannot hold or send it.
PATH_PAYMENT_STRICT_RECEIVE_TOO_FEW_OFFERS
There was not enough liquidity along any path to complete this swap. Nothing was swapped.
PATH_PAYMENT_STRICT_RECEIVE_UNDERFUNDED
The sending account did not hold enough of the asset being sent. On Stellar this includes the reserve: an account must keep a minimum XLM balance plus an amount for each trustline, offer and signer, so a visible balance is not always a spendable one.
PATH_PAYMENT_STRICT_SEND_LINE_FULL
The destination's trustline for this asset has a limit, and this payment would have taken it over. The recipient sets that limit and can raise it.
PATH_PAYMENT_STRICT_SEND_MALFORMED
The swap was not well formed, for example a non-positive amount or an invalid asset.
PATH_PAYMENT_STRICT_SEND_NO_DESTINATION
The destination account does not exist on the ledger. A Stellar account has to be created before it can be paid.
PATH_PAYMENT_STRICT_SEND_NO_TRUST
The destination has no trustline for the asset being delivered. On Stellar an account has to explicitly trust an asset before it can receive it, so this is something the recipient sets up, not a problem with the payment.
PATH_PAYMENT_STRICT_SEND_NOT_AUTHORIZED
The destination is not authorised by the asset's issuer to hold it. Some issuers require approval per account.
PATH_PAYMENT_STRICT_SEND_OFFER_CROSS_SELF
The path would have matched against this account's own offer, which Stellar does not allow.
PATH_PAYMENT_STRICT_SEND_SRC_NO_TRUST
The sending account has no trustline for the asset it tried to send, so it cannot hold or send it.
PATH_PAYMENT_STRICT_SEND_TOO_FEW_OFFERS
There was not enough liquidity along any path to complete this swap. Nothing was swapped.
PATH_PAYMENT_STRICT_SEND_UNDER_DESTMIN
The swap would have delivered less than the minimum you set, so Stellar refused it rather than filling at a worse rate. That minimum is your slippage protection doing its job: the price along the path moved between the quote and the transaction being applied. Nothing was swapped and only the fee was spent.
PATH_PAYMENT_STRICT_SEND_UNDERFUNDED
The sending account did not hold enough of the asset being sent. On Stellar this includes the reserve: an account must keep a minimum XLM balance plus an amount for each trustline, offer and signer, so a visible balance is not always a spendable one.
PAYMENT_LINE_FULL
The destination's trustline for this asset has a limit, and this payment would have taken it over.
PAYMENT_MALFORMED
The payment was not well formed, for example a non-positive amount or an invalid asset.
PAYMENT_NO_DESTINATION
The destination account does not exist on the ledger. A Stellar account has to be created and funded before it can be paid.
PAYMENT_NO_TRUST
The destination has no trustline for this asset. On Stellar an account has to explicitly trust an asset before it can receive it, so the recipient sets this up.
PAYMENT_UNDERFUNDED
The account did not hold enough of this asset to send that amount. On Stellar the reserve counts against you: an account must keep a minimum XLM balance plus an amount for each trustline, offer and signer, so the spendable balance is lower than the one displayed.
SET_OPTIONS_LOW_RESERVE
This change would take the account below its minimum reserve. Adding a signer raises the XLM an account must keep, so more XLM is needed first.
SET_TRUST_LINE_FLAGS_CANT_REVOKE
The issuer has given up the ability to revoke authorisation on this asset, so the flag cannot be cleared.
SET_TRUST_LINE_FLAGS_NO_TRUST_LINE
There is no trustline between that account and this asset, so its flags could not be set.
txBAD_AUTH
The signatures on this transaction did not meet the account's signing requirements. Nothing was applied.
txBAD_SEQ
The sequence number was not the one this account expected next. That normally means two transactions were submitted from the same account at once, or one was already applied. Reloading the account and rebuilding the transaction fixes it. Nothing was applied here.
txFAILED
One of the operations in this transaction failed, so the whole transaction was rolled back. Stellar applies a transaction all or nothing, so nothing it set out to do took effect.
txFEE_BUMP_INNER_FAILED
This was a fee bump transaction, and the inner transaction it was paying for is the one that failed. The fee bump itself was fine, so look at the inner transaction's own result for the reason.
txINSUFFICIENT_BALANCE
The account could not cover the fee while keeping its minimum reserve. On Stellar an account must always hold a base reserve plus an amount for each trustline, offer and signer, so an account can show a balance and still be unable to spend it.
txINSUFFICIENT_FEE
The fee offered was below what the network was accepting when this was submitted. Stellar prices by surge when a ledger is full, so a fee that works normally can be too low for a busy ledger. Nothing was applied, and resubmitting with a higher fee is the fix.
txINTERNAL_ERROR
The network reported an internal error applying this transaction. Nothing was applied.
txMALFORMED
The transaction was not well formed, so the network rejected it without applying anything.
txNO_ACCOUNT
The source account does not exist on the ledger. A Stellar account has to be created and funded before it can send anything.
txSOROBAN_INVALID
The Soroban resources declared by this transaction were not valid, so it was rejected before running.
txTOO_EARLY
The transaction carried a time bound that had not started yet, so the network would not apply it.
txTOO_LATE
The transaction expired before it was included. Stellar transactions carry a time bound, and this one passed while it was waiting, so it was never applied and nothing moved. Submitting again is safe: the expired one cannot execute later.
Sui
EBalanceManagerBalanceTooLow
The withdrawal asked for more than the balance manager holds of that coin. Funds in DeepBook sit inside your balance manager rather than in your wallet, and settled trades or open orders can hold part of it, so the amount available to withdraw is not always the amount you deposited.
ECapNotInList
The capability this transaction tried to use or revoke is not registered on this balance manager. It may already have been revoked.
EInvalidOwner
The balance manager this transaction used is not owned by the address that signed it. A balance manager belongs to one owner, and only that owner can act on it directly.
EInvalidProof
The trade proof presented with this transaction was not valid for the balance manager it was used against. A proof is generated for one balance manager and one purpose, so this usually means the wrong one was attached.
EInvalidTrader
The address that signed is not a trader authorised on this balance manager. The owner grants trading rights explicitly, and this address does not currently hold them.
EMaxCapsReached
This balance manager already has the maximum number of capabilities issued against it, so another could not be added. An existing one has to be revoked first.
EBadRedistribution
DeepBook stopped on an internal check (a redistribution between orderbook nodes that would have had no effect). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EBadRemove
DeepBook stopped on an internal check (an orderbook node in an unexpected state during removal). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EExists
DeepBook stopped on an internal check (a key that already existed in the orderbook structure). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EFanOutTooBig
DeepBook stopped on an internal check (an orderbook fan-out above the allowed maximum). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EFanOutTooSmall
DeepBook stopped on an internal check (an orderbook fan-out below the allowed minimum). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
ENotAdjacent
DeepBook stopped on an internal check (two orderbook nodes whose links did not match up). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
ENotEmpty
DeepBook stopped on an internal check (an orderbook structure expected to be empty and was not). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
ENotFound
The order this transaction referred to is no longer on the book. An order that has already been filled, cancelled or expired cannot be modified or cancelled again, and DeepBook has no record of it to act on. Nothing was completed and only the gas was spent.
ESliceTooBig
DeepBook stopped on an internal check (an orderbook slice size above the allowed maximum). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
ESliceTooSmall
DeepBook stopped on an internal check (an orderbook slice size below the allowed minimum). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EEmptyOrderbook
There are no resting orders on the side of the book this order needed to match against, so there was nothing to trade with.
EInvalidAmountIn
The input amount for this swap was not accepted by the pool. A swap has to name a positive quantity of one of the pool's two coins.
ENewQuantityMustBeLessThanOriginal
An order can only be modified downwards. Increasing the size means cancelling and placing a new order, which also gives up its place in the queue.
EOrderBelowMinimumSize
The order is smaller than the pool's minimum size. Each pool sets its own floor, and an order under it is rejected rather than rounded up.
EOrderInvalidLotSize
The order quantity is not a whole number of lots. Every pool has a lot size, and quantities have to be a multiple of it.
EBookOrderMismatch
DeepBook stopped on an internal check (a book entry that did not match its order record). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EFillMismatch
DeepBook stopped on an internal check (a fill that did not reconcile against its order). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EIncorrectMidPrice
DeepBook stopped on an internal check (a mid price that failed its consistency check). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EIncorrectPoolId
DeepBook stopped on an internal check (a pool id that did not match the one expected). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EOrderInfoMismatch
DeepBook stopped on an internal check (an order record that did not match its book entry). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
ENoDataPoints
There are no DEEP price points recorded for this pool, so a DEEP-denominated fee cannot be priced.
EMaxProposalsReachedNotEnoughVotes
The pool already has the maximum number of proposals this epoch, and this one did not have enough votes to displace one of them.
EProposalDoesNotExist
The proposal voted on does not exist in the current epoch. Proposals do not carry over between epochs.
EInvalidPrecision
DeepBook stopped on an internal check (a precision check in DeepBook's fixed point maths). This is a condition inside DeepBook's own bookkeeping rather than anything wrong with your order, so retrying the same request is unlikely to change the outcome. Nothing was completed and only the gas was spent.
EInvalidNewQuantity
The new quantity for this modification was not valid. An order can only be reduced, and not to zero, which is a cancellation instead.
EOrderExpired
The order had already expired by the time this transaction executed, so there was nothing left to act on.
EFOKOrderCannotBeFullyFilled
This was a fill-or-kill order and there was not enough resting liquidity to fill all of it at your limit price, so none of it was filled. That is the behaviour fill-or-kill asks for: all or nothing.
EInvalidExpireTimestamp
The expiry given for this order is already in the past. An order cannot be placed with an expiry that has passed.
EMarketOrderCannotBePostOnly
The order was sent as both a market order and post-only, which contradict each other. A market order takes liquidity and post-only refuses to.
EOrderBelowMinimumSize
The order is smaller than the pool's minimum size. Each pool sets its own floor, and an order under it is rejected rather than rounded up.
EOrderInvalidLotSize
The order quantity is not a whole number of lots. Every pool has a lot size, and quantities have to be a multiple of it.
EOrderInvalidPrice
The order price sits outside the range the pool accepts, or is not a whole number of ticks. Every DeepBook pool has a tick size, and a price between ticks cannot be placed.
EPOSTOrderCrossesOrderbook
This was a post-only order and it would have matched against an order already resting on the book. Post-only exists to guarantee you add liquidity rather than take it, so instead of filling at a worse price it cancels. The market moved between the price being quoted and the order arriving.
ESelfMatchingCancelTaker
This order would have matched against another of your own orders on the book, and the self-match rule chosen cancelled the incoming side. Nothing was traded with yourself.
EIneligibleReferencePool
The pool named as a price reference is not eligible to be one. DeepBook only accepts certain pools as a source of price.
EInvalidDeepPrice
The DEEP price reference this pool needs was not usable. DeepBook charges fees in DEEP and needs a price for it, and without one the trade cannot be priced.
EInvalidEWMAAlpha
The smoothing parameter given for the pool's moving average is outside the accepted range.
EInvalidFee
The fee supplied for creating this pool was not the amount the registry requires.
EInvalidOrderBalanceManager
The balance manager presented does not match the one the order was placed with. An order can only be modified or cancelled through the balance manager that created it.
EInvalidQuantityIn
The quantity sent into this swap was not accepted. It has to be a positive amount of one of the pool's two coins.
EMinimumQuantityOutNotMet
The swap would have returned less than the minimum you set, so it was rejected rather than filled at a worse rate. That minimum is your slippage protection doing its job. The price moved between the quote and the transaction arriving.
EPackageVersionDisabled
This transaction went to a version of the DeepBook package that has been turned off. That happens after an upgrade, and it means the app or SDK that built the transaction is pointing at an old address. Updating the app is the fix, and your funds are unaffected.
ECoinNotWhitelisted
This coin is not whitelisted, so it cannot be used where a whitelisted coin is required.
EPackageVersionNotEnabled
This transaction went to a version of the DeepBook package that is not enabled. That usually means the app or SDK that built it is pointing at an old package address. Your funds are unaffected.
EPoolAlreadyExists
A pool for this pair of coins already exists, so a second one cannot be created.
EAlreadyProposed
This balance manager has already made a governance proposal in the current epoch.
EMaxOpenOrders
This balance manager already has the maximum number of open orders on this pool. Cancelling or letting some fill makes room for another.
EHasOwedBalances
This operation cannot run while the balance manager still owes balances on the pool. Those have to be settled first.
EIncorrectQuantityReturned
The amount returned to close the flash loan did not cover what was borrowed. A flash loan has to be repaid in full inside the same transaction, so the whole transaction is undone.
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.