# Common errors

This page summarises common errors that you might encounter while developing on Acala EVM+. If an error occurs that is not listed here, please reach out, so we might lend a hand and include it on this page.

## ProviderError: Error: -32603: execution fatal

### `{ index: 180, error: 0, message: None }`

**Error name:** AddressNotMapped

**Error explanation:** This means that maintenance features are called on a smart contract, that doesn't have an EVM address bound to it

**Common causes:**

* Should not happen, because even if no user account is associated with the smart contract, it should bind to the `0x0` address

**Suggested actions:**

* We suggest reaching out to us, so we can help you investigate the issue

### `{ index: 180, error: 1, message: None }`

**Error name:** ContractNotFound

**Error explanation:** This means that maintenance actions are being preformed on an address that is not a smart contract

**Common causes:**

* Usually happens when trying to maintain a non-existent or already deleted smart contract

**Suggested actions:**

* We suggest reviewing the address you are trying to maintain

### `{ index: 180, error: 2, message: None }`

**Error name:** NoPermission

**Error explanation:** This means that the account is not allowed to interact with the smart contract

**Common causes:**

* This means that the account is not allowed to interact with the smart contract

**Suggested actions:**

* If the user wants to interact with the smart contract before it is published, they can turn on the development mode
* It the smart contract maintainer wishes to enable non-developer users to interact with the smart contract, they can publish the smart contract

### `{ index: 180, error: 3, message: None }`

**Error name:** ContractDevelopmentNotEnabled

**Error explanation:** This means that the account doesn't have the development mode enabled

**Common causes:**

* Usually happens when account doesn't have development mode enabled and the user tries to disable the development mode

**Suggested actions:**

* If you wish for the development mode to be disabled, you don't need to do anything
* If you wish to enable the development mode, you can enable it by following the documentation

### `{ index: 180, error: 4, message: None }`

**Error name:** ContractDevelopmentAlreadyEnabled

**Error explanation:** This means that the account already has the development mode enabled

**Common causes:**

* Usually happens when account has development mode enabled and the user tries to enable the development mode

**Suggested actions:**

* If you wish for the development mode to be enabled, you don't need to do anything
* If you wish to disable the development mode, you can enable it by following the documentation

### `{ index: 180, error: 5, message: None }`

**Error name:** ContractAlreadyPublished

**Error explanation:** This means that the smart contract is already published

**Common causes:**

* Usually happens when trying to publish an already published smart contract

**Suggested actions:**

* If you wish for the smart contract to be published, you don't need to do anything
* If you wish that the smart contract wouldn't be reachable by users that don't have development mode enabled, you can delete it and redeploy it

### `{ index: 180, error: 6, message: None })&#x20`

**Error name:** ContractExceedsMaxCodeSize

**Error explanation:** This means that the smart contract file size is too big

**Common causes:**

* Usually happens when trying to deploy a smart contract that is too big

**Suggested actions:**

* We suggest refactoring your smart contract, so that the file size is decreased

### `{ index: 180, error: 7, message: None }`

**Error name:** ContractAlreadyExisted

**Error explanation:** This means that the same address has already been used and can't be used again

**Common causes:**

* Usually happens when the substrate account, to which the EVM+ account has been bound, has been reaped, which resulted in the EVM+ account nonce being reset. This in turn can cause the EVM+ to try and create a smart contract at an address that has already been used

**Suggested actions:**

* We suggest using another EVM+ account

{% hint style="warning" %}
**NOTE: This behaviour should be made obsolete. If you encounter this error, please reach out to us, so we can investigate.**
{% endhint %}

### `{ index: 180, error: 8, message: None }`

**Error name:** OutOfStorage

**Error explanation:** This means that the storage usage of the transaction is greater than the storage limit

**Common causes:**

* Usually happens when transaction changes a number of states and the storage limit value is too low

**Suggested actions:**

* We suggest increasing the storage limit value of the transaction
* If the storage limit exceeds the maximum storage limit we suggest reviewing the call initiated by the transaction and adapting it to change less states

### `{ index: 180, error: 9, message: None }`

**Error name:** ChargeFeeFailed

**Error explanation:** This means that the smart contract, that is trying to use Schedule predeployed smart contract, doesn't have enough funds to pay for the Schedule transaction fees

**Common causes:**

* Usually happens when either the smart contract has too low of a balance or the scheduled call is too complex

**Suggested actions:**

* We suggest additionally funding the smart contract or reviewing the scheduled call in order to make it more efficient

### `{ index: 180, error: 10, message: None }`

**Error name:** CannotKillContract

**Error explanation:** This means that killing the smart contract has failed

**Common causes:**

* Usually happens when trying to kill a non-existent function

**Suggested actions:**

* We suggest reviewing the address you are using to kill the smart contract and checking for typos or missed characters

### `{ index: 180, error: 11, message: None }`

**Error name:** ReserveStorageFailed

**Error explanation:** This means that the account doesn't have enough funds to put data into storage

**Common causes:**

* Usually happens when trying to change a lot of states in a single transaction

**Suggested actions:**

* We suggest reviewing the call and reducing the number of states that are changed within it
* If the number of states changed by the call can't be reduced, we suggest adding funds to the account

### `{ index: 180, error: 12, message: None }`

**Error name:** UnreserveStorageFailed

**Error explanation:** This means that releasing the storage has failed

**Common causes:**

* Usually happens when the storage rent is increased after the storage has been rented, but not before it has been released

**Suggested actions:**

* We suggest reaching out to the team as this shouldn't happen under normal circumstances

### `{ index: 180, error: 13, message: None }`

**Error name:** ChargeStorageFailed

**Error explanation:** This means that charging the storage rent has failed

**Common causes:**

* None

**Suggested actions:**

* We suggest reaching out to the team if you encounter this error

### `{ index: 180, error: 14, message: None }`

**Error name:** InvalidDecimals

**Error explanation:** This means that the value provided was too low

**Common causes:**

* Usually happens when trying to convert wei to ACA or KAR. As ACA and KAR have 12 decimal spaces and the EVM+ expects the native currency to have 18, this error might occur during the conversion.

**Suggested actions:**

* We suggest only using the values greater than `1_000_000` when referring to a native currency in wei

## Named Errors

### `Error: 1010: Invalid transaction: Transaction is outdated`

**Error name:** Transaction is outdated

**Error explanation:** This means that the transaction's `validUntil` value is too low or that there is already a transaction with the same nonce in the chain.

**Common causes:**

* `validUntil` value of the transaction is lower than current block number
* Transaction nonce is the same as one of the preexisting transactions had

**Suggested actions:**

* Verify that the transaction has a valid `validUntil` value and update it if the block number of the chain is higher
* Reset the account nonce, to make sure it corresponds to the one associated with the account nonce on chain

### `Error: 1012: Invalid transaction: Transaction is temporary banned`

**Error name:** Transaction is temporary banned

**Error explanation:** This means that an identic transaction to this one has already failed, so mining this transaction won't be attempted. This behaviour is narrated by Substrate and has to be supported.

**Common causes:**

* Transaction identic to this one has recently failed

**Suggested actions:**

* Review logs and identify the original error to address it
* If the previous error can't be found, wait for 15 minutes and re-attempt sending the transaction. The original error message should be returned

## Other Errors

### `invalid ETH gasLimit/gasPrice combination provided`

We don't support inputting random gasLimit/gasPrice combination. Please read through the [gas params](https://evmdocs.acala.network/network/gas-parameters) section, which has detailed explanation of how to provide valid gas params.

### `Transaction hash mismatch from Provider.sendTransaction`

**Common causes:**

This is usually cause by using `ethers.JsonRpcProvider` as provider when sending a transaction. `JsonRpcProvider` expects a pre-calculated ETH style tx hash. However, the algorithm we use to derive the result tx hash is different than traditional EVM world, causing the mismatch.

**Suggested actions:**

Use [AcalaJsonRpcProvider](https://github.com/AcalaNetwork/bodhi.js/tree/master/packages/eth-providers#acala-networketh-providers) as a drop-in replacement.

For example:

```ts
import { AcalaJsonRpcProvider } from "@acala-network/eth-providers";

// https://evmdocs.acala.network/network/network-configuration#karura-mainnet
const KARURA_ETH_RPC= 'https://eth-rpc-karura.aca-api.network';
const provider = new AcalaJsonRpcProvider(KARURA_ETH_RPC);

// send transaction
const wallet = new Wallet(PRIVATE_KEY, provider);
const contractInstance = new Contract(CONTRACT_ADDR, CONTRACT_ABI, wallet);
await contractInstance.someMethod();
```

Note that `JsonRpcProvider` should still work in most cases, such as getting account balance, etc... The only senario that this error occur is when sending a transaction with `Provider.sendTransaction`.

Also, such error only occurs with `ethers.JsonRpcProvider`, and using other providers (such as metamask's provider) should be fine.

### `Account cannot exist with the funds that would be given`

**Common causes:**

Each address needs a minimum balance of 0.1 ACA/KAR, this is called [Existential Deposit](https://wiki.acala.network/get-started/acala-network/acala-account#existential-deposit). Sending a transaction with value lower than ED to a **new address** will result in this error.

**Suggested actions:**

* when sending native token to a new EOA, make sure the value is greater than ED, which is 0.1 ACA/KAR.
* if target address is a contract that handles payments, we can send 0.1 ACA/KAR to the contract right after the it is deployed, so this error won't occur for any following transactions.
