When a call fails, the engine panics and nothing in the call changes: no balances, no storage. Deposits with *_transfer_call are refunded by the token contract. The message is in the receipt’s failure, after Smart contract panicked: . Many messages come after a source location and a line break, like panicked at src/lib.rs:491:18:, and some have details after them, so match the messages below as substrings.
<asset> is an asset ID, <owner> is Account(<account id>) or Dex(<dex id>).
| Message |
Cause |
Contract is paused |
The contract is paused. Try again later |
Requires attached deposit of exactly 1 yoctoNEAR |
The method needs exactly 1 yoctoNEAR attached |
Deposit of at least one yoctoNEAR is required. |
execute_operations was called without a deposit |
Failed to deserialize input from JSON. Error: <error> |
Malformed arguments, for example an asset ID without its nep141: prefix (Invalid asset id: ...), a DEX ID without / (Invalid dex id: ...), or a missing required argument |
| Message |
Cause |
Asset <asset> is not registered for <owner> |
The owner would receive an asset that isn’t registered for them |
Failed to deposit assets to contract tracked balance: asset not registered |
Nobody ever registered this asset. Register it for yourself |
Insufficient balance for account <account> and asset <asset>: <balance> < <amount> |
Not enough in your inner balance |
Insufficient balance of <asset> for <owner>: <balance> < <amount> |
Not enough in your inner balance for the attached_assets of a DEX call |
User balance not found for account <account> and asset <asset> |
An asset in the attached_assets of a DEX call isn’t registered for you |
Failed to withdraw assets from user balance: user <account> balance for asset <asset> was not found |
The asset isn’t registered for you, so you have none of it |
Not enough balance for withdraw <asset>: <balance> < Some(U128(<at_least>)), Not enough balance for withdrawal of <asset>: <balance> < U128(<at_least>) |
A Full withdrawal with a balance lower than at_least. The second one is a Withdraw in a deposit message |
Invalid input array lengths |
A multi token contract called mt_on_transfer with arrays of different lengths |
account_id and dex_id are mutually exclusive |
registered_assets_of needs exactly one of them |
No assets to register |
register_assets or a RegisterAssets operation with an empty asset_ids |
| Message |
Cause |
Output amount is less than constraint |
An ExactIn swap would give less than constraint. The price moved: get a new quote |
Input amount is greater than constraint |
An ExactOut swap would cost more than constraint, referral fees included |
At most 5 referrers are allowed |
More than 5 accounts in referral_fees |
Referral fees must add up to at most 50000 |
The referral_fees add up to more than 5% |
Insufficient balance for dex <dex id> and asset <asset>: <balance> < <amount> |
The DEX doesn’t hold enough asset_out |
Amount in does not match, Amount out does not match |
The DEX returned a different exact amount than requested. A bug in the DEX |
Dex code not found |
No DEX with this ID |
At least one swap option is required |
A SwapAdvanced with an empty options |
All swap options failed |
Every option of a SwapAdvanced failed, or, with FallbackQueue, didn’t meet the constraint. The receipt logs why each was skipped |
| Message |
Cause |
Failed to call function '<method>': [<dex id>] Dex panicked: <message> |
The DEX refused the swap or call. It comes after Running wasm failed: . <method> is swap for swaps. <message> comes from the DEX, which can also panic without one. A message raised with a Rust panic!, like Plach’s Invalid message, starts with panicked at <file>:<line>:<col>: and a line break. One raised with env::panic_str, like Plach’s No routes, has no prefix |
Failed to get function '<method>' |
The DEX has no such method. It comes after Running wasm failed: |
Failed to instantiate module: <error> |
The DEX imports a host function the engine doesn’t have, like attached_deposit or log_utf8. It comes after Running wasm failed: |
Method name 'swap' is reserved for the swap operation |
dex_call and dex_view can’t call swap. Use swap_simple |
Cannot modify data in view-only mode |
The DEX tried to change its storage in dex_view. It comes after Running wasm failed: Failed to call function '<method>': |
| Message |
Cause |
Failed to parse operations |
msg of a deposit isn’t a valid DepositMessage |
Operation only available in execute_actions |
RegisterAssets or DeployDexCode in a deposit message |
Sandboxed assets must be empty after execution. Did you forget to withdraw <amount> <asset>? |
Operations in a deposit didn’t use up everything. Add a Withdraw or TransferAsset for the rest |
Asset in not found in anonymous assets, Asset to withdraw not found in anonymous assets, Asset to transfer not found in anonymous assets |
An operation in a deposit uses an asset that wasn’t deposited and isn’t the output of an earlier swap |
Not enough balance in anonymous assets, Not enough input balance in anonymous assets |
An operation in a deposit uses more than what’s left. The second one is a swap whose input is more than what’s left, for example an ExactOut swap that needs more than was deposited |
No rescue address provided and user doesn't have a registered balance for this asset |
A Withdraw in a deposit needs the sender or rescue_address to have the asset registered. See Withdrawing from a deposit |
Asset <asset> was not attached, while specified that it was attached, Not enough balance for attached deposit of <asset> |
A DexCall in a deposit attaches an asset that wasn’t deposited, or more than what’s left |
Near balance not found in anonymous assets, Not enough near balance in anonymous assets |
A StorageDeposit in a deposit uses NEAR that wasn’t deposited, or more than what’s left |
Amount is required for the first swap operation |
OutputOfLastIn without a swap before it |
Amount can only be omitted if the last swap asset out matches the current asset in |
OutputOfLastIn after a swap to a different asset |
PreviousSwapOutput can only be used after a swap, in the same operation batch |
PreviousSwapOutput without a swap before it |
PreviousSwapOutput can only be used if the last swap asset out matches the withdraw asset |
PreviousSwapOutput after a swap to a different asset |
Only the previous owner can execute operations on behalf of the previous owner |
An NFT or multi token sent with an approval, with a non-empty msg |
Operations can only follow a transfer of one token |
An mt_batch_transfer_call of several tokens with a non-empty msg |
r#for is required for StorageDeposit operation |
StorageDeposit without for |
| Message |
Cause |
Storage used (<used>) exceeds total (<total>) |
Not enough storage balance: yours for a registration, the DEX’s for deploy_dex_code or for a swap or call that stores more data. Deposit more |
Deposit amount <amount> is less than the minimum bound 0.005 NEAR |
Storage deposits must be at least 0.005 NEAR |
Storage used not found |
storage_withdraw from an account without a storage balance |
Amount exceeds storage used |
storage_withdraw of more than available |
Only the deployer can withdraw dex storage |
dex_storage_withdraw by someone other than the DEX’s deployer |
not implemented: Storage unregistration is not supported |
storage_unregister isn’t supported |
Amounts in storage errors are in NEAR, rounded up, like 0.006 NEAR.
| Message |
Cause |
Only the trusted code deployer can deploy dex code |
deploy_dex_code by another account |
Only the trusted code deployer can transfer this permission |
set_trusted_code_deployer by another account |
Only authorized accounts can pause the contract |
pause or unpause by another account |
Invalid dex code: <error> |
deploy_dex_code with code that isn’t valid WebAssembly |
Contract must be paused to rescue assets |
rescue while the contract isn’t paused |
Nothing to rescue |
rescue with nothing untracked, or an amount of 0 |