Repository: iotaledger/iota
Pull request #5924: Update core contract references
Author: login: Dr-Electron
Labels: name: documentation
description: Improvements or additions to documentation
name: devrel
description: Issues related to the DevRel team
Created: 2025-03-14T09:29:28Z | Merged: 2025-04-28T20:03:52Z

# Description of change

This PR updates the core contract references.
There is still some open questions. 
Like what is the contract address of an ERC20
or if there is really that much functions that got removed.

## Links to any relevant issues

Fixes #5658 

## Type of change

- Documentation Fix

## Change checklist

- [x] I have followed the contribution guidelines for this project
- [x] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [x] I have made corresponding changes to the documentation
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] I have checked that new and existing unit tests pass locally with my changes


Linked issue #5658: Core contracts
a. Need to remove the blob contract
b. Update all return type data for all contracts.
c. Need to add BCS encoding doc.

Diff:
diff --git a/docs/content/iota-evm/explanations/core-contracts.md b/docs/content/iota-evm/explanations/core-contracts.md
index 0861ab33fad..230c500a655 100644
--- a/docs/content/iota-evm/explanations/core-contracts.md
+++ b/docs/content/iota-evm/explanations/core-contracts.md
@@ -1,5 +1,5 @@
 ---
-description: There currently are 7 core smart contracts that are always deployed on each  chain, root, _default, accounts, blob, blocklog, and governance.
+description: 'There currently are 6 core smart contracts that are always deployed on each  chain: root, accounts, blocklog, governance, errors and evm.'
 image: /img/banner/banner_wasp_core_contracts_overview.png
 tags:
   - core-contract
@@ -21,8 +21,6 @@ provide infrastructure for all other smart contracts:
 
 - [`accounts`](../references/core-contracts/accounts.md): Manages the on-chain ledger of accounts.
 
-- [`blob`](../references/core-contracts/blob.md): Responsible for the registry of binary objects of arbitrary size.
-
 - [`blocklog`](../references/core-contracts/blocklog.md): Keeps track of the blocks and receipts of requests that were processed by the chain.
 
 - [`governance`](../references/core-contracts/governance.md): Handles the administrative functions of the chain. For example: rotation of the committee of validators of the chain, fees and other chain-specific configurations.
diff --git a/docs/content/iota-evm/getting-started/contracts.mdx b/docs/content/iota-evm/getting-started/contracts.mdx
index 41f93fe0bda..0120b264590 100644
--- a/docs/content/iota-evm/getting-started/contracts.mdx
+++ b/docs/content/iota-evm/getting-started/contracts.mdx
@@ -65,4 +65,4 @@ wIOTA OFT Token contract to the following chains:
 
 TEA MultiSid (4 out of 7) which controls the OFT Token contract and Adapter of wIOTA on IOTA EVM.
 
-:::
\ No newline at end of file
+:::
diff --git a/docs/content/iota-evm/references/core-contracts/accounts.md b/docs/content/iota-evm/references/core-contracts/accounts.md
index 3ae71c4f56d..4ebc108fdab 100644
--- a/docs/content/iota-evm/references/core-contracts/accounts.md
+++ b/docs/content/iota-evm/references/core-contracts/accounts.md
@@ -22,7 +22,7 @@ i.e. [the L2 ledger](../../../iota-evm/explanations/how-accounts-work.md).
 The `accounts` contract provides functions to deposit and withdraw tokens, information about the assets deposited on the
 chain, and the functionality to create and use foundries.
 
-### `deposit()`
+### `deposit`
 
 A no-op that has the side effect of crediting any transferred tokens to the sender's account.
 
@@ -32,7 +32,7 @@ As with every call, the gas fee is debited from the L2 account right after execu
 
 :::
 
-### `withdraw()`
+### `withdraw`
 
 Moves tokens from the caller's on-chain account to the caller's L1 address. The number of
 tokens to be withdrawn must be specified via the allowance of the request.
@@ -51,7 +51,7 @@ amount must be able to cover the L1 storage deposit. Otherwise, it will fail.
 
 :::
 
-### `transferAllowanceTo(a AgentID)`
+### `transferAllowanceTo`
 
 Transfers the specified allowance from the sender's L2 account to the given L2 account on
 the chain.
@@ -65,23 +65,27 @@ Information about what is being transferred will be encoded in the transaction's
 <Sender_AgentID bytes> + <Assets bytes>
 ```
 
-The encoding used for this data can be found on [TIP-51](https://github.com/jorgemmsilva/tips/blob/b46d7bc36a0f7d4c2a1ad32ba25ec2abb4835cb3/tips/TIP-0051/tip-0051.md)
+The data will be BCS encoded
 
 :::
 
 #### Parameters
 
-- `a` (`AgentID`): The target L2 account.
+| Name    | Type    | Optional | Description           |
+| ------- | ------- | -------- | --------------------- |
+| agentID | AgentID | No       | The target L2 account |
 
-### `transferAccountToChain(g GasReserve)`
+### `transferAccountToChain`
 
 Transfers the specified allowance from the sender SC's L2 account on
 the target chain to the sender SC's L2 account on the origin chain.
 
 #### Parameters
 
-- `g` (`uint64`): Optional gas amount to reserve in the allowance for
-  the internal call to transferAllowanceTo(). Default 100 (MinGasFee).
+| Name                                                                 | Type | Optional | Description                                |
+| -------------------------------------------------------------------- | ---- | -------- | ------------------------------------------ |
+| optionalGasReserve                                                   | u64  | Yes      | Gas amount to reserve in the allowance for |
+| the internal call to transferAllowanceTo(). Default 100 (MinGasFee). |      |          |                                            |
 
 :::note Important Detailed Information
 
@@ -89,299 +93,179 @@ the target chain to the sender SC's L2 account on the origin chain.
 
 :::
 
-### `nativeTokenCreate(t TokenScheme, tn TokenName, ts TokenSymbol, td TokenDecimal) s SerialNumber`
-
-Creates a new foundry and registers it as a ERC20 and IRC30 token.
-
-You can call this end point from the CLI using `wasp-cli chain create-native-token -h`
-
-#### Parameters
-
-- `t` ([`iotago::TokenScheme`](https://github.com/iotaledger/iota.go/blob/develop/token_scheme.go)): The token scheme
-  for the new foundry.
-- `tn` (`string`): The token name
-- `ts` (`string`): The token symbol
-- `td` (`uint8`): The token decimals
-
-The storage deposit for the new foundry must be provided via allowance (only the minimum required will be used).
-
-#### Returns
-
-- `s` (`uint32`): The serial number of the newly created foundry
-
-### `nativeTokenModifySupply(s SerialNumber, d SupplyDeltaAbs, y DestroyTokens)`
-
-Mints or destroys tokens for the given foundry, which must be controlled by the caller.
-
-#### Parameters
-
-- `s` (`uint32`): The serial number of the foundry.
-- `d` (positive `big.Int`): Amount to mint or destroy.
-- `y` (optional `bool` - default: `false`): Whether to destroy tokens (`true`) or not (`false`).
-
-When minting new tokens, the storage deposit for the new output must be provided via an allowance.
-
-When destroying tokens, the tokens to be destroyed must be provided via an allowance.
-
-### `nativeTokenDestroy(s SerialNumber)`
-
-Destroys a given foundry output on L1, reimbursing the storage deposit to the caller. The foundry must be owned by the
-caller.
-
-:::warning
-
-This operation cannot be reverted.
-
-:::
-
-#### Parameters
+---
 
-- `s` (`uint32`): The serial number of the foundry.
+### `setCoinMetadata`
 
-### `foundryCreateNew(t TokenScheme) s SerialNumber`
+Sets metadata for a specific coin.
 
-:::warning Deprecated
+:::info
 
-This function is deprecated, please use [`nativeTokenCreate`](#nativetokencreatet-tokenscheme-tn-tokenname-ts-tokensymbol-td-tokendecimal-s-serialnumber) instead
+Only callable by the chain owner.
 
 :::
 
-Creates a new foundry with the specified token scheme, and assigns the foundry to the sender.
-
-You can call this end point from the CLI using `wasp-cli chain create-foundry -h`
-
 #### Parameters
 
-- `t` ([`iotago::TokenScheme`](https://github.com/iotaledger/iota.go/blob/develop/token_scheme.go)): The token scheme
-  for the new foundry.
+| Name     | Type         | Optional | Description            |
+| -------- | ------------ | -------- | ---------------------- |
+| coinInfo | IotaCoinInfo | Yes      | Metadata for the coin. |
 
-The storage deposit for the new foundry must be provided via allowance (only the minimum required will be used).
+### `deleteCoinMetadata`
 
-#### Returns
+Deletes metadata for a specific coin.
 
-- `s` (`uint32`): The serial number of the newly created foundry
+:::info
 
-### `mintNFT(I ImmutableData, a AgentID, C CollectionID, w WithdrawOnMint)`
+Only callable by the chain owner.
 
-Mints an NFT with ImmutableData `I` that will be owned by the AgentID `a`.
-It's possible to mint as part of a collection `C` (the caller must be the owner of the collection NFT to mint new NFTs as part of said collection).
-The mint can be done directly to any L1 address (it is not necessary for the target to have an account on the chain)
+:::
 
 #### Parameters
 
-- `I` (`[]byte`): ImmutableData for the NFT.
-- `a` (`AgentID`): AgentID that will be the owner of the NFT.
-- `C` (optional `NFTID` - default empty): collectionID (NFTID) for the NFT.
-- `w` (optional `bool` - default `false`): whether to withdrawal the NFT in the minting step (can only be `true` when the targetAgentID is a L1 address).
-
-#### Returns
-
-- `D` (`MintID`): the internal ID of the NFT at the time of minting that can be used by users/contracts to obtain the resulting NFTID on the next block
-
----
+| Name     | Type     | Optional | Description           |
+| -------- | -------- | -------- | --------------------- |
+| coinType | CoinType | No       | The type of the coin. |
 
 ## Views
 
-### `balance(a AgentID)`
+### `balance`
 
 Returns the fungible tokens owned by the given Agent ID on the chain.
 
 #### Parameters
 
-- `a` (`AgentID`): The account Agent ID.
-
-#### Returns
-
-A map of [`TokenID`](#tokenid) => `big.Int`. An empty token ID (a string of zero length) represents the L1 base token.
-
-### `balanceBaseToken(a AgentID)`
-
-Returns the amount of base tokens owned by any AgentID `a` on the chain.
-
-#### Parameters
-
-- `a` (`AgentID`): The account Agent ID.
-
-#### Returns
-
-- `B` (`uint64`): The amount of base tokens in the account.
-
-### `balanceNativeToken(a AgentID, N TokenID)`
-
-Returns the amount of native tokens with Token ID `N` owned by any AgentID `a` on the chain.
-
-#### Parameters
-
-- `a` (`AgentID`): The account Agent ID.
-- `N` ([`TokenID`](#tokenid)): The Token ID.
-
-#### Returns
-
-- `B` (`big.Int`): The amount of native tokens in the account.
-
-### `totalAssets()`
-
-Returns the sum of all fungible tokens controlled by the chain.
-
-#### Returns
-
-A map of [`TokenID`](#tokenid) => `big.Int`. An empty token ID (a string of zero length) represents the L1 base token.
-
-### `accounts()`
-
-Returns a list of all agent IDs that own assets on the chain.
+| Name            | Type    | Optional | Description          |
+| --------------- | ------- | -------- | -------------------- |
+| optionalAgentID | AgentID | Yes      | The account Agent ID |
 
 #### Returns
 
-A map of `AgentiD` => `0x01`.
-
-### `getNativeTokenIDRegistry()`
-
-Returns a list of all native tokenIDs that are owned by the chain.
+| Name         | Type         | Description                                                                                                        |
+| ------------ | ------------ | ------------------------------------------------------------------------------------------------------------------ |
+| coinBalances | CoinBalances | A map of Coin type => Coin value(`u64`). An empty token ID (a string of zero length) represents the L1 base token. |
 
-#### Returns
-
-A map of [`TokenID`](#tokenid) => `0x01`
+### `balanceBaseToken`
 
-### `nativeToken(s FoundrySerialNumber)`
+Returns the amount of base tokens owned by any AgentID `optionalAgentID` on the chain.
 
 #### Parameters
 
-- `s` ([`FoundrySerialNumber`](#foundryserialnumber)): The Foundry serial number.
+| Name            | Type    | Optional | Description          |
+| --------------- | ------- | -------- | -------------------- |
+| optionalAgentID | AgentID | Yes      | The account Agent ID |
 
 #### Returns
 
-- `b`: [`iotago::FoundryOutput`](https://github.com/iotaledger/iota.go/blob/develop/output_foundry.go)
+| Name             | Type | Description                              |
+| ---------------- | ---- | ---------------------------------------- |
+| baseTokenBalance | u64  | The amount of base tokens in the account |
 
-### `accountNFTs(a AgentID)`
+### `balanceBaseTokenEVM`
 
-Returns the NFT IDs for all NFTs owned by the given account.
+Returns the amount of base tokens owned by any AgentID `optionalAgentID` on the chain (in the EVM format with 18 decimals).
 
 #### Parameters
 
-- `a` (`AgentID`): The account Agent ID
+| Name            | Type    | Optional | Description          |
+| --------------- | ------- | -------- | -------------------- |
+| optionalAgentID | AgentID | Yes      | The account Agent ID |
 
 #### Returns
 
-- `i` ([`Array`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/array.go)
-  of [`iotago::NFTID`](https://github.com/iotaledger/iota.go/blob/develop/output_nft.go)):
-  The NFT IDs owned by the account
+| Name                | Type | Description                              |
+| ------------------- | ---- | ---------------------------------------- |
+| evmBaseTokenBalance | u64  | The amount of base tokens in the account |
 
-### `accountNFTAmount(a AgentID)`
+### `balanceCoin`
 
-Returns the number of NFTs owned by the given account.
+Returns the amount of coins with coin ID `coinID` owned by any AgentID `agentID` on the chain.
 
 #### Parameters
 
-- `a` (`AgentID`): The account Agent ID
+| Name            | Type     | Optional | Description          |
+| --------------- | -------- | -------- | -------------------- |
+| optionalAgentID | AgentID  | Yes      | The account Agent ID |
+| coinID          | CoinType | No       | The coin ID          |
 
 #### Returns
 
-- `A` (`uint32`) Amount of NFTs owned by the account
-
-### `accountNFTsInCollection(a AgentID)`
+| Name        | Type | Description                        |
+| ----------- | ---- | ---------------------------------- |
+| coinBalance | u64  | The amount of coins in the account |
 
-Returns the NFT IDs for all NFTs in the given collection that are owned by the given account.
+### `totalAssets`
 
-#### Parameters
-
-- `a` (`AgentID`): The account Agent ID
-- `C` (`NFTID`): The NFT ID of the collection
+Returns the sum of all fungible tokens controlled by the chain.
 
 #### Returns
 
-- `i` ([`Array`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/array.go)
-  of [`iotago::NFTID`](https://github.com/iotaledger/iota.go/blob/develop/output_nft.go)):
-  The NFT IDs in the collection owned by the account
+| Name         | Type         | Description                                                                                                        |
+| ------------ | ------------ | ------------------------------------------------------------------------------------------------------------------ |
+| coinBalances | CoinBalances | A map of Coin type => Coin value(`u64`). An empty token ID (a string of zero length) represents the L1 base token. |
 
-### `accountNFTAmountInCollection(a AgentID)`
+### `accountObjects`
 
-Returns the number of NFTs in the given collection that are owned by the given account.
+Returns the Object IDs for all Objects owned by the given account.
 
 #### Parameters
 
-- `a` (`AgentID`): The account Agent ID
-- `C` (`NFTID`): The NFT ID of the collection
+| Name            | Type    | Optional | Description          |
+| --------------- | ------- | -------- | -------------------- |
+| optionalAgentID | AgentID | Yes      | The account Agent ID |
 
 #### Returns
 
-- `A` (`uint32`) Amount of NFTs in the collection owned by the account
+| Name            | Type | Description                       |
+| --------------- | ---- | --------------------------------- |
+| bcsEncodedBytes | [u8] | A BSC encoded array of Object IDs |
 
-### `accountFoundries(a AgentID)`
+### `accountObjectsInCollection`
 
-Returns all foundries owned by the given account.
+Returns the Object IDs for all Objects in the given collection/object that are owned by the given account.
 
 #### Parameters
 
-- `a` (`AgentID`): The account Agent ID
-
-#### Returns
-
-A map of [`FoundrySerialNumber`](#foundryserialnumber) => `0x01`
-
-### `nftData(z NFTID)`
-
-Returns the data for a given NFT with ID `z` that is on the chain.
+| Name            | Type     | Optional | Description                     |
+| --------------- | -------- | -------- | ------------------------------- |
+| optionalAgentID | AgentID  | Yes      | The account Agent ID            |
+| collectionID    | [u8; 32] | No       | The Object ID of the collection |
 
 #### Returns
 
-- `e`: [`NFTData`](#nftdata)
+| Name            | Type | Description                       |
+| --------------- | ---- | --------------------------------- |
+| bcsEncodedBytes | [u8] | A BSC encoded array of Object IDs |
 
-### `NFTIDbyMintID(D MintID)`
+### `getAccountNonce`
 
-Returns the NFTID `z` for a given MintID `D`.
+Returns the current account nonce for a give AgentID `agentID`.
+The account nonce is used to issue off-ledger requests.
 
 #### Parameters
 
-- `D` (`MintID`): MintID produced at the time the NFT was minted
+| Name            | Type    | Optional | Description          |
+| --------------- | ------- | -------- | -------------------- |
+| optionalAgentID | AgentID | Yes      | The account Agent ID |
 
 #### Returns
 
-- `z` (`NFTID`): The ID of the NFT
+| Name  | Type | Description       |
+| ----- | ---- | ----------------- |
+| nonce | u64  | The account Nonce |
 
-### `getAccountNonce(a AgentID)`
+### `objectBCS`
 
-Returns the current account nonce for a give AgentID `a`.
-The account nonce is used to issue off-ledger requests.
+Returns the Object data for a given ObjectID
 
 #### Parameters
 
-- `a` (`AgentID`): The account Agent ID.
+| Name     | Type     | Optional | Description   |
+| -------- | -------- | -------- | ------------- |
+| objectID | [u8; 32] | No       | The Object ID |
 
 #### Returns
 
-- `n` (`uint64`): The account nonce.
-
-## Schemas
-
-### `FoundrySerialNumber`
-
-```
-FoundrySerialNumber = uint32
-```
-
-### `TokenID`
-
-```
-TokenID = [38]byte
-```
-
-### `NFTID`
-
-```
-NFTID = [32]byte
-```
-
-### `MintID`
-
-```
-MintID = [6]byte
-```
-
-### `NFTData`
-
-`NFTData` is encoded as the concatenation of:
-
-- The issuer ([`iotago::Address`](https://github.com/iotaledger/iota.go/blob/develop/address.go)).
-- The NFT metadata: the length (`uint16`) followed by the data bytes.
-- The NFT owner (`AgentID`).
+| Name            | Type | Description                                 |
+| --------------- | ---- | ------------------------------------------- |
+| bcsEncodedBytes | [u8] | The data of the object as bcs encoded bytes |
diff --git a/docs/content/iota-evm/references/core-contracts/blocklog.md b/docs/content/iota-evm/references/core-contracts/blocklog.md
index c1e7e22dc17..48b535e7e25 100644
--- a/docs/content/iota-evm/references/core-contracts/blocklog.md
+++ b/docs/content/iota-evm/references/core-contracts/blocklog.md
@@ -18,180 +18,119 @@ To avoid having a monotonically increasing state size, only the latest `N`
 blocks (and their events and receipts) are stored. This parameter can be configured
 when deploying the chain.
 
----
-
-## Entry Points
-
-### `retryUnprocessable(u requestID)`
-
-Tries to retry a given request that was marked as "unprocessable".
-
-:::note
-"Unprocessable" requests are on-ledger requests that do not include enough base tokens to cover the deposit fees (example if an user tries to deposit many native tokens in a single output but only includes the minimum possible amount of base tokens). Such requests will be collected into an "unprocessable list" and users are able to deposit more funds onto their on-chain account and retry them afterwards.
-:::
-
-#### Parameters
-
-- `u` ([`isc::RequestID`](https://github.com/iotaledger/wasp/blob/develop/packages/isc/request.go)): The requestID to be retried. (sender of the retry request must match the sender of the "unprocessable" request)
-
----
-
 ## Views
 
-### `getBlockInfo(n uint32)`
+### `getBlockInfo`
 
-Returns information about the block with index `n`.
+Returns information about the block with index `blockIndex`.
 
 #### Parameters
 
-- `n`: (optional `uint32`) The block index. Default: the latest block.
+| Name       | Type | Optional | Description                                |
+| ---------- | ---- | -------- | ------------------------------------------ |
+| blockIndex | u32  | Yes      | The block index. Default: the latest block |
 
 #### Returns
 
-- `n` (`uint32`):The block index.
-- `i` ([`BlockInfo`](#blockinfo)):The information about the block.
+| Name       | Type                               | Description                     |
+| ---------- | ---------------------------------- | ------------------------------- |
+| blockIndex | u32                                | The block Index                 |
+| blockInfo  | *[BlockInfo](./types.md#blockinfo) | The information about the block |
 
-### `getRequestIDsForBlock(n uint32)`
+### `getRequestIDsForBlock`
 
 Returns a list with all request IDs in the block with block index `n`.
 
 #### Parameters
 
-- `n` (optional `uint32`):The block index. The default value is the latest block.
+| Name       | Type | Optional | Description                                            |
+| ---------- | ---- | -------- | ------------------------------------------------------ |
+| blockIndex | u32  | Yes      | The block index. The default value is the latest block |
 
 #### Returns
 
-- `n` (`uint32`):The block index.
-- `u`: ([`Array`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/array.go)
-  of [`RequestID`](#requestid))
+| Name              | Type       | Description         |
+| ----------------- | ---------- | ------------------- |
+| blockIndex        | u32        | The block Index     |
+| requestIDsInBlock | [[u8; 32]] | The ISC Request IDs |
 
-### `getRequestReceipt(u RequestID)`
+### `getRequestReceipt`
 
 Returns the receipt for the request with the given ID.
 
 #### Parameters
 
-- `u` ([`RequestID`](#requestid)):The request ID.
+| Name      | Type     | Optional | Description    |
+| --------- | -------- | -------- | -------------- |
+| requestID | [u8; 32] | No       | The request ID |
 
 #### Returns
 
-- `n` (`uint32`):The block index.
-- `r` (`uint16`):The request index within the block.
-- `d` ([`RequestReceipt`](#requestreceipt)):The request receipt.
+| Name           | Type                                        | Description         |
+| -------------- | ------------------------------------------- | ------------------- |
+| requestReceipt | [RequestReceipt](./types.md#requestreceipt) | The request receipt |
 
-### `getRequestReceiptsForBlock(n uint32)`
+### `getRequestReceiptsForBlock`
 
-Returns all the receipts in the block with index `n`.
+Returns all the receipts in the block with index `blockIndex`.
 
 #### Parameters
 
-- `n` (optional `uint32`):The block index. Defaults to the latest block.
+| Name       | Type | Optional | Description                                   |
+| ---------- | ---- | -------- | --------------------------------------------- |
+| blockIndex | u32  | Yes      | The block index. Defaults to the latest block |
 
-#### Returns
+#### Response
 
-- `n` (`uint32`):The block index.
-- `d`: ([`Array`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/array.go)
-  of [`RequestReceipt`](#requestreceipt))
+| Name            | Type                                                          | Description                  |
+| --------------- | ------------------------------------------------------------- | ---------------------------- |
+| requestReceipts | [RequestReceiptsResponse](./types.md#requestreceiptsresponse) | The request receipt response |
 
-### `isRequestProcessed(u RequestID)`
+### `isRequestProcessed`
 
 Returns whether the request with ID `u` has been processed.
 
 #### Parameters
 
-- `u` ([`RequestID`](#requestid)):The request ID.
+| Name      | Type     | Optional | Description    |
+| --------- | -------- | -------- | -------------- |
+| requestID | [u8; 32] | No       | The request ID |
 
 #### Returns
 
-- `p` (`bool`):Whether the request was processed or not.
+| Name        | Type | Description                              |
+| ----------- | ---- | ---------------------------------------- |
+| isProcessed | bool | Whether the request was processed or not |
 
-### `getEventsForRequest(u RequestID)`
+### `getEventsForRequest`
 
-Returns the list of events triggered during the execution of the request with ID `u`.
+Returns the list of events triggered during the execution of the request with ID `requestID`.
 
 ### Parameters
 
-- `u` ([`RequestID`](#requestid)):The request ID.
-
-#### Returns
-
-- `e`: ([`Array`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/array.go) of `[]byte`).
-
-### `getEventsForBlock(n blockIndex)`
-
-Returns the list of events triggered during the execution of all requests in the block with index `n`.
-
-#### Parameters
-
-- `n` (optional `uint32`):The block index. Defaults to the latest block.
+| Name      | Type     | Optional | Description    |
+| --------- | -------- | -------- | -------------- |
+| requestID | [u8; 32] | No       | The request ID |
 
 #### Returns
 
-- `e`: ([`Array`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/array.go) of `[]byte`).
+| Name   | Type                        | Description    |
+| ------ | --------------------------- | -------------- |
+| events | [[Event](./types.md#event)] | List of events |
 
-### `getEventsForContract(h Hname)`
+### `getEventsForBlock`
 
-Returns a list of events triggered by the smart contract with hname `h`.
+Returns the list of events triggered during the execution of all requests in the block with index `blockIndex`.
 
 #### Parameters
 
-- `h` (`hname`):The smart contract’s hname.
-- `f` (optional `uint32` - default: `0`):"From" block index.
-- `t` (optional `uint32` - default: `MaxUint32`):"To" block index.
+| Name       | Type | Optional | Description                                   |
+| ---------- | ---- | -------- | --------------------------------------------- |
+| blockIndex | u32  | Yes      | The block index. Defaults to the latest block |
 
 #### Returns
 
-- `e`: ([`Array`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/array.go) of `[]byte`)
-
-### `hasUnprocessable(u requestID)`
-
-Asserts whether or not a given requestID (`u`) is present in the "unprocessable list"
-
-#### Parameters
-
-- `u` ([`isc::RequestID`](https://github.com/iotaledger/wasp/blob/develop/packages/isc/request.go)): The requestID to be checked
-
-#### Returns
-
-- `x` ([`bool`]) Whether or not the request exists in the "unprocessable list"
-
----
-
-## Schemas
-
-### `RequestID`
-
-A `RequestID` is encoded as the concatenation of:
-
-- Transaction ID (`[32]byte`).
-- Transaction output index (`uint16`).
-
-### `BlockInfo`
-
-`BlockInfo` is encoded as the concatenation of:
-
-- The block timestamp (`uint64` UNIX nanoseconds).
-- Amount of requests in the block (`uint16`).
-- Amount of successful requests (`uint16`).
-- Amount of off-ledger requests (`uint16`).
-- Anchor transaction ID ([`iotago::TransactionID`](https://github.com/iotaledger/iota.go/blob/develop/transaction.go)).
-- Anchor transaction sub-essence hash (`[32]byte`).
-- Previous L1 commitment (except for block index 0).
-  - Trie root (`[20]byte`).
-  - Block hash (`[20]byte`).
-- Total base tokens in L2 accounts (`uint64`).
-- Total storage deposit (`uint64`).
-- Gas burned (`uint64`).
-- Gas fee charged (`uint64`).
-
-### `RequestReceipt`
-
-`RequestReceipt` is encoded as the concatenation of:
-
-- Gas budget (`uint64`).
-- Gas burned (`uint64`).
-- Gas fee charged (`uint64`).
-- The request ([`isc::Request`](https://github.com/iotaledger/wasp/blob/develop/packages/isc/request.go)).
-- Whether the request produced an error (`bool`).
-- If the request produced an error, the
-  [`UnresolvedVMError`](./errors.md#unresolvedvmerror).
+| Name       | Type                        | Description     |
+| ---------- | --------------------------- | --------------- |
+| blockIndex | u32                         | The block index |
+| events     | [[Event](./types.md#event)] | List of events  |
diff --git a/docs/content/iota-evm/references/core-contracts/errors.md b/docs/content/iota-evm/references/core-contracts/errors.md
index 7d8141c3e28..c87e2d5546a 100644
--- a/docs/content/iota-evm/references/core-contracts/errors.md
+++ b/docs/content/iota-evm/references/core-contracts/errors.md
@@ -17,54 +17,40 @@ The `errors` contract keeps a map of error codes to error message templates.
 This allows contracts to store lengthy error strings only once and then reuse them by just providing the error code (and
 optional extra values) when producing an error, thus saving storage and gas.
 
----
-
 ## Entry Points
 
-### `registerError(m ErrorMessageFormat) c ErrorCode`
+### `registerError`
 
 Registers an error message template.
 
 #### Parameters
 
-- `m` (`string`): The error message template, which supports standard [go verbs](https://pkg.go.dev/fmt#hdr-Printing)
-  for variable printing.
+| Name               | Type   | Optional | Description                                                                                                               |
+| ------------------ | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------- |
+| errorMessageFormat | string | No       | The error message template, which supports standard [go verbs](https://pkg.go.dev/fmt#hdr-Printing) for variable printing |
 
 #### Returns
 
-- `c` (`ErrorCode`): The error code of the registered template
+| Name        | Type                                  | Description                               |
+| ----------- | ------------------------------------- | ----------------------------------------- |
+| vmErrorCode | [VMErrorCode](./types.md#vmerrorcode) | The error code of the registered template |
 
 ---
 
 ## Views
 
-### `getErrorMessageFormat(c ErrorCode) m ErrorMessageFormat`
+### `getErrorMessageFormat`
 
 Returns the message template stored for a given error code.
 
 #### Parameters
 
-- `c` (`ErrorCode`): The error code of the registered template.
+| Name        | Type                                  | Optional | Description                               |
+| ----------- | ------------------------------------- | -------- | ----------------------------------------- |
+| vmErrorCode | [VMErrorCode](./types.md#vmerrorcode) | No       | The error code of the registered template |
 
 #### Returns
 
-- `m` (`string`): The error message template.
-
----
-
-## Schemas
-
-### `ErrorCode`
-
-`ErrorCode` is encoded as the concatenation of:
-
-- The contract hname(`hname`).
-- The error ID, calculated as the hash of the error template(`uint16`).
-
-### `UnresolvedVMError`
-
-`UnresolvedVMError` is encoded as the concatenation of:
-
-- The error code ([`ErrorCode`](#errorcode)).
-- CRC32 checksum of the formatted string (`uint32`).
-- The JSON-encoded list of parameters for the template (`string` prefixed with `uint16` size).
+| Name               | Type   | Description                |
+| ------------------ | ------ | -------------------------- |
+| errorMessageFormat | string | The error message template |
diff --git a/docs/content/iota-evm/references/core-contracts/evm.md b/docs/content/iota-evm/references/core-contracts/evm.md
index e4cb90616c2..44bd73a562e 100644
--- a/docs/content/iota-evm/references/core-contracts/evm.md
+++ b/docs/content/iota-evm/references/core-contracts/evm.md
@@ -29,91 +29,52 @@ Most entry points of the `evm` core contract are meant to be accessed through th
 automatically by the Wasp node so that the end users can use standard EVM tools like [MetaMask](https://metamask.io/).
 We only list the entry points not exposed through the JSON-RPC interface in this document.
 
-### `init()`
+### `registerERC20Coin`
 
-Called automatically when the ISC is deployed.
-
-Some parameters of the `evm` contract can be specified by passing them to the
-[`root` contract `init` entry point](root.md#init):
-
-- `evmg` (optional [`GenesisAlloc`](#genesisalloc)): The genesis allocation. The balance of all accounts must be 0.
-- `evmbk` (optional `int32` - default: keep all): Amount of EVM blocks to keep in the state.
-- `evmchid` (optional `uint16` - default: 1074): EVM chain iD
-
-  :::caution
-
-  Re-using an existing Chain ID is not recommended and can be a security risk. For serious usage, register a unique
-  Chain ID on [Chainlist](https://chainlist.org/) and use that instead of the default. **It is not possible to change
-  the EVM chain ID after deployment.**
-
-  :::
-
-- `evmw` (optional [`GasRatio`](./governance.md#ratio32) - default: `1:1`): The ISC to EVM gas ratio.
-
-### `registerERC20NativeToken`
-
-Registers an ERC20 contract to act as a proxy for the native tokens, at address
-`0x107402xxxxxxxx00000000000000000000000000`, where `xxxxxxxx` is the
-little-endian encoding of the foundry serial number.
+Registers an ERC20 contract to act as a proxy for the L1 coin, at address
+`0x107402xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`, where `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` is the first 17 bytes of the Keccak hash of the coin type (`0x123...module::yourcoin`).
 
 Only the foundry owner can call this endpoint.
 
 #### Parameters
 
-- `fs` (`uint32`): The foundry serial number
-- `n` (`string`): The token name
-- `t` (`string`): The ticker symbol
-- `d` (`uint8`): The token decimals
-
-You can call this endpoint with the `wasp-cli register-erc20-native-token` command. See
-`wasp-cli chain register-erc20-native-token -h` for instructions on how to use the command.
+| Name     | Type                            | Optional | Description   |
+| -------- | ------------------------------- | -------- | ------------- |
+| coinType | [CoinType](./types.md#cointype) | No       | The coin type |
 
-### `registerERC20NativeTokenOnRemoteChain`
+#### Returns
 
-Registers an ERC20 contract to act as a proxy for the native tokens **on another
-chain**.
+_None_
 
-The foundry must be controlled by this chain. Only the foundry owner can call
-this endpoint.
+### `sendTransaction`
 
-This endpoint is intended to be used in case the foundry is controlled by chain
-A, and the owner of the foundry wishes to register the ERC20 contract on chain
-B. In that case, the owner must call this endpoint on chain A with `target = chain B`.
-The request to chain B is then sent as an on-ledger request.
-After a few minutes, call
-[`getERC20ExternalNativeTokenAddress`](#geterc20externalnativetokenaddress)
-on chain B to find out the address of the ERC20 contract.
+Sends a transaction to the EVM.
 
 #### Parameters
 
-- `fs` (`uint32`): The foundry serial number
-- `n` (`string`): The token name
-- `t` (`string`): The ticker symbol
-- `d` (`uint8`): The token decimals
-- `A` (`uint8`): The target chain address, where the ERC20 contract will be
-  registered.
+| Name        | Type               | Optional | Description             |
+| ----------- | ------------------ | -------- | ----------------------- |
+| transaction | *types.Transaction | No       | The transaction to send |
 
-You can call this endpoint with the `wasp-cli register-erc20-native-token-on-remote-chain` command. See
-`wasp-cli chain register-erc20-native-token-on-remote-chain -h` for instructions on how to use the command.
+#### Returns
 
-### `registerERC20ExternalNativeToken`
+_None_
 
-Registers an ERC20 contract to act as a proxy for the native tokens.
+### `callContract`
 
-Only an alias address can call this endpoint.
-
-If the foundry is controlled by another ISC chain, the foundry owner can call
-[`registerERC20NativeTokenOnRemoteChain`](#registererc20nativetokenonremotechain)
-on that chain, which will automatically call this endpoint on the chain set as
-target.
+Calls a contract on the EVM.
 
 #### Parameters
 
-- `fs` (`uint32`): The foundry serial number
-- `n` (`string`): The token name
-- `t` (`string`): The ticker symbol
-- `d` (`uint8`): The token decimals
-- `T` (`TokenScheme`): The native token scheme
+| Name        | Type             | Optional | Description      |
+| ----------- | ---------------- | -------- | ---------------- |
+| callMessage | ethereum.CallMsg | No       | The call message |
+
+#### Returns
+
+| Name           | Type | Description            |
+| -------------- | ---- | ---------------------- |
+| functionResult | []u8 | The result of the call |
 
 ### `registerERC721NFTCollection`
 
@@ -125,39 +86,44 @@ The call will fail if the address is taken by another collection with the same p
 
 #### Parameters
 
-- `C` (`NTFID`): The collection ID
+| Name         | Type           | Optional | Description       |
+| ------------ | -------------- | -------- | ----------------- |
+| collectionID | iotago.Address | No       | The collection ID |
 
----
-
-## Views
+#### Returns
 
-### `getERC20ExternalNativeTokenAddress`
+_None_
 
-Returns the address of an ERC20 contract registered with
-[`registerERC20NativeTokenOnRemoteChain`](#registererc20nativetokenonremotechain).
+### `newL1Deposit`
 
-Only the foundry owner can call this endpoint.
+Creates a new L1 deposit.
 
 #### Parameters
 
-- `N` (`NativeTokenID`): The native token ID
+| Name                       | Type                        | Optional | Description             |
+| -------------------------- | --------------------------- | -------- | ----------------------- |
+| l1DepositOriginatorAgentID | [u8; 32]                    | No       | The originator agent ID |
+| targetAddress              | [u8; 32]                    | No       | The target address      |
+| assets                     | [Assets](./types.md#assets) | No       | The assets              |
+
+#### Returns
+
+_None_
 
 ---
 
-## Schemas
+## Views
+
+### `getChainID`
+
+Returns the chain ID.
+
+#### Parameters
 
-### `GenesisAlloc`
+_None_
 
-`GenesisAlloc` is encoded as the concatenation of:
+#### Returns
 
-- Amount of accounts `n` (`uint32`).
-- `n` times:
-  - Ethereum address (`[]byte` prefixed with `uint32` size).
-  - Account code (`[]byte` prefixed with `uint32` size).
-  - Amount of storage key/value pairs `m`(`uint32`).
-  - `m` times:
-    - Key (`[]byte` prefixed with `uint32` size).
-    - Value(`[]byte` prefixed with `uint32` size).
-  - Account balance (must be 0)(`[]byte` prefixed with `uint32` size).
-  - Account nonce (`uint64`).
-  - Account private key (may be used for tests)(`uint64`).
+| Name    | Type | Description  |
+| ------- | ---- | ------------ |
+| chainID | u16  | The chain ID |
diff --git a/docs/content/iota-evm/references/core-contracts/governance.md b/docs/content/iota-evm/references/core-contracts/governance.md
index 398d06f003b..2183bf46473 100644
--- a/docs/content/iota-evm/references/core-contracts/governance.md
+++ b/docs/content/iota-evm/references/core-contracts/governance.md
@@ -25,25 +25,11 @@ The `governance` contract provides the following functionalities:
 
 ---
 
-## Fee Policy
-
-The Fee Policy looks like the following:
-
-```go
-{
-  GasPerToken Ratio32 // how many gas units are paid for each token
-  EVMGasRatio Ratio32 // the ratio at which EVM gas is converted to ISC gas
-  ValidatorFeeShare uint8 // percentage of the fees that are credited to the validators (0 - 100)
-}
-```
-
----
-
 ## Entry Points
 
-### `rotateStateController(S StateControllerAddress)`
+### `rotateStateController`
 
-Called when the committee is about to be rotated to the new address `S`.
+Called when the committee is about to be rotated to the new address `newStateControllerAddr`.
 
 If it succeeds, the next state transition will become a governance transition, thus updating the state controller in the
 chain's Alias Output. If it fails, nothing happens.
@@ -52,137 +38,198 @@ It can only be invoked by the chain owner.
 
 #### Parameters
 
-- `S` ([`iotago::Address`](https://github.com/iotaledger/iota.go/blob/develop/address.go)): The address of the next
-  state controller. Must be an
-  [allowed](#addallowedstatecontrolleraddresss-statecontrolleraddress) state controller address.
+| Name                   | Type     | Optional | Description                                                                                                                |
+| ---------------------- | -------- | -------- | -------------------------------------------------------------------------------------------------------------------------- |
+| newStateControllerAddr | [u8; 32] | No       | The address of the next state controller. Must be an [allowed](#addallowedstatecontrolleraddress) state controller address |
+
+#### Returns
+
+_None_
 
-### `addAllowedStateControllerAddress(S StateControllerAddress)`
+### `addAllowedStateControllerAddress`
 
-Adds the address `S` to the list of identities that constitute the state controller.
+Adds the address `stateControllerAddress` to the list of identities that constitute the state controller.
 
 It can only be invoked by the chain owner.
 
 #### Parameters
 
-- `S` ([`iotago::Address`](https://github.com/iotaledger/iota.go/blob/develop/address.go)): The address to add to the
-  set of allowed state controllers.
+| Name                   | Type     | Optional | Description                                                |
+| ---------------------- | -------- | -------- | ---------------------------------------------------------- |
+| stateControllerAddress | [u8; 32] | No       | The address to add to the set of allowed state controllers |
+
+#### Returns
+
+_None_
 
-### `removeAllowedStateControllerAddress(S StateControllerAddress)`
+### `removeAllowedStateControllerAddress`
 
-Removes the address `S` from the list of identities that constitute the state controller.
+Removes the address `stateControllerAddress` from the list of identities that constitute the state controller.
 
 It can only be invoked by the chain owner.
 
 #### Parameters
 
-- `S` ([`iotago::Address`](https://github.com/iotaledger/iota.go/blob/develop/address.go)): The address to remove from
-  the set of allowed state controllers.
+| Name                   | Type     | Optional | Description                                                     |
+| ---------------------- | -------- | -------- | --------------------------------------------------------------- |
+| stateControllerAddress | [u8; 32] | No       | The address to remove from the set of allowed state controllers |
 
-### `delegateChainOwnership(o AgentID)`
+#### Returns
 
-Sets the Agent ID `o` as the new owner for the chain. This change will only be effective
-once [`claimChainOwnership`](#claimchainownership) is called by `o`.
+_None_
+
+### `delegateChainOwnership`
+
+Sets the Agent ID `ownerAgentID` as the new owner for the chain. This change will only be effective
+once [`claimChainOwnership`](#claimchainownership) is called by `ownerAgentID`.
 
 It can only be invoked by the chain owner.
 
 #### Parameters
 
-- `o` (`AgentID`): The Agent ID of the next chain owner.
+| Name         | Type     | Optional | Description                          |
+| ------------ | -------- | -------- | ------------------------------------ |
+| ownerAgentID | [u8; 32] | No       | The Agent ID of the next chain owner |
+
+#### Returns
+
+_None_
 
-### `claimChainOwnership()`
+### `claimChainOwnership`
 
 Claims the ownership of the chain if the caller matches the identity set
-in [`delegateChainOwnership`](#delegatechainownershipo-agentid).
+in [`delegateChainOwnership`](#delegatechainownership).
+
+#### Parameters
+
+_None_
+
+#### Returns
+
+_None_
 
-### `setFeePolicy(g FeePolicy)`
+### `setFeePolicy`
 
-Sets the fee policy for the chain.
+Sets the fee policy for the chain. It can only be invoked by the chain owner.
 
 #### Parameters
 
-- `g`: ([`FeePolicy`](#feepolicy)).
+| Name      | Type                              | Optional | Description    |
+| --------- | --------------------------------- | -------- | -------------- |
+| feePolicy | [FeePolicy](./types.md#feepolicy) | No       | The fee policy |
 
-It can only be invoked by the chain owner.
+#### Returns
+
+_None_
 
-### `setGasLimits(l GasLimits)`
+### `setGasLimits`
 
-Sets the gas limits for the chain.
+Sets the gas limits for the chain. It can only be invoked by the chain owner.
 
 #### Parameters
 
-- `l`: ([`GasLimits`](#gaslimits)).
+| Name      | Type                        | Optional | Description    |
+| --------- | --------------------------- | -------- | -------------- |
+| gasLimits | [Limits](./types.md#limits) | No       | The gas limits |
 
-It can only be invoked by the chain owner.
+#### Returns
+
+_None_
 
-### `setEVMGasRatio(e Ratio32)`
+### `setEVMGasRatio`
 
-Sets the EVM gas ratio for the chain.
+Sets the EVM gas ratio for the chain. It can only be invoked by the chain owner.
 
 #### Parameters
 
-- `e` ([`Ratio32`](#ratio32)): The EVM gas ratio.
+| Name        | Type                          | Optional | Description       |
+| ----------- | ----------------------------- | -------- | ----------------- |
+| evmGasRatio | [Ratio32](./types.md#ratio32) | No       | The EVM gas ratio |
 
-It can only be invoked by the chain owner.
+#### Returns
+
+_None_
 
-### `addCandidateNode(ip PubKey, ic Certificate, ia API, i ForCommittee)`
+### `addCandidateNode`
 
-Adds a node to the list of candidates.
+Adds a node to the list of candidates. It can only be invoked by the access node owner (verified via the Certificate field).
 
 #### Parameters
 
-- `ip` (`[]byte`): The public key of the node to be added.
-- `ic` (`[]byte`): The certificate is a signed binary containing both the node public key and their L1 address.
-- `ia` (`string`): The API base URL for the node.
-- `i` (optional `bool` - default: `false`): Whether the candidate node is being added to be part of the committee or
-  just an access node.
+| Name                | Type     | Optional | Description                                                                                 |
+| ------------------- | -------- | -------- | ------------------------------------------------------------------------------------------- |
+| nodePublicKey       | [u8; 32] | No       | The public key of the node to be added                                                      |
+| nodeCertificate     | [u8]     | No       | The certificate is a signed binary containing both the node public key and their L1 address |
+| nodeAccessAPI       | string   | No       | The API base URL for the node                                                               |
+| isCommittee         | bool     | No       | Whether the candidate node is being added to be part of the committee or                    |
+| just an access node |          |          |                                                                                             |
+
+#### Returns
 
-It can only be invoked by the access node owner (verified via the Certificate field).
+_None_
 
-### `revokeAccessNode(ip PubKey, ic Certificate, ia API, i ForCommittee)`
+### `revokeAccessNode`
 
-Removes a node from the list of candidates.
+Removes a node from the list of candidates. It can only be invoked by the access node owner (verified via the Certificate field).
 
 #### Parameters
 
-- `ip` (`[]byte`): The public key of the node to be removed.
-- `ic` (`[]byte`): The certificate of the node to be removed.
+| Name          | Type     | Optional | Description                               |
+| ------------- | -------- | -------- | ----------------------------------------- |
+| nodePublicKey | [u8; 32] | No       | The public key of the node to be removed  |
+| certificate   | [u8]     | No       | The certificate of the node to be removed |
 
-It can only be invoked by the access node owner (verified via the Certificate field).
+#### Returns
+
+_None_
 
-### `changeAccessNodes(n actions)`
+### `changeAccessNodes`
 
-Iterates through the given map of actions and applies them.
+Iterates through the given map of actions and applies them. It can only be invoked by the chain owner.
 
 #### Parameters
 
-- `n` ([`Map`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/map.go) of `public key` => `byte`):
-  The list of actions to perform. Each byte value can be one of the following:
-  - `0`: Remove the access node from the access nodes list.
-  - `1`: Accept a candidate node and add it to the list of access nodes.
-  - `2`: Drop an access node from the access node and candidate lists.
+| Name                                                                         | Type                        | Optional | Description                                                                                                         |
+| ---------------------------------------------------------------------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------- |
+| accessNodes                                                                  | []lo.Tuple2[[u8; 32], byte] | No       | [`Map`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/map.go) of `public key` => `byte`): |
+| The list of actions to perform. Each byte value can be one of the following: |                             |          |                                                                                                                     |
 
-It can only be invoked by the chain owner.
+- `0`: Remove the access node from the access nodes list.
+- `1`: Accept a candidate node and add it to the list of access nodes.
+- `2`: Drop an access node from the access node and candidate lists. |
+
+#### Returns
+
+_None_
 
-### `startMaintenance()`
+### `startMaintenance`
 
 Starts the chain maintenance mode, meaning no further requests will be processed except
 calls to the governance contract.
 
 It can only be invoked by the chain owner.
 
-### `stopMaintenance()`
+#### Parameters
+
+_None_
+
+#### Returns
+
+_None_
+
+### `stopMaintenance`
 
 Stops the maintenance mode.
 
 It can only be invoked by the chain owner.
 
-### `setCustomMetadata(x bytes)`
+#### Parameters
 
-Changes optional extra metadata that is appended to the L1 AliasOutput.
+_None_
 
-#### Parameters
+#### Returns
 
-- `x` (`bytes`): the optional metadata
+_None_
 
 ### `setPayoutAgentID`
 
@@ -190,156 +237,157 @@ Changes optional extra metadata that is appended to the L1 AliasOutput.
 
 #### Parameters
 
-- `s` (`AgentID`): the payout AgentID
-
-### `setMinCommonAccountBalance`
-
-`setMinCommonAccountBalance` sets the minimum balanced to be held in the common account.
+| Name          | Type     | Optional | Description        |
+| ------------- | -------- | -------- | ------------------ |
+| payoutAgentID | [u8; 32] | No       | The payout AgentID |
 
-#### Parameters
+#### Returns
 
-- `ms` (`AgentID`): the minimum common account balance
+_None_
 
 ---
 
 ## Views
 
-### `getAllowedStateControllerAddresses()`
+### `getAllowedStateControllerAddresses`
 
 Returns the list of allowed state controllers.
 
+#### Parameters
+
+_None_
+
 #### Returns
 
-- `a` ([`Array`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/array.go)
-  of [`iotago::Address`](https://github.com/iotaledger/iota.go/blob/develop/address.go)): The list of allowed state
-  controllers.
+| Name                     | Type       | Description                           |
+| ------------------------ | ---------- | ------------------------------------- |
+| stateControllerAddresses | [[u8; 32]] | The list of allowed state controllers |
 
-### `getChainOwner()`
+### `getChainOwner`
 
 Returns the AgentID of the chain owner.
 
+#### Parameters
+
+_None_
+
 #### Returns
 
-- `o` (`AgentID`): The chain owner.
+| Name              | Type     | Description              |
+| ----------------- | -------- | ------------------------ |
+| chainOwnerAgentID | [u8; 32] | The chain owner agent ID |
 
-### `getChainInfo()`
+### `getChainInfo`
 
 Returns information about the chain.
 
-#### Returns
+#### Parameters
 
-- `c` (`ChainID`): The chain ID
-- `o` (`AgentID`): The chain owner
-- `g` ([`FeePolicy`](#feepolicy)): The gas fee policy
-- `l` ([`GasLimits`](#gaslimits)): The gas limits
-- `x` (`bytes`): The custom metadata
+_None_
 
-### `getFeePolicy()`
+#### Returns
 
-Returns the gas fee policy.
+| Name      | Type                              | Description    |
+| --------- | --------------------------------- | -------------- |
+| chainInfo | [ChainInfo](./types.md#chaininfo) | The chain info |
 
-#### Returns
+### `getFeePolicy`
 
-- `g` ([`FeePolicy`](#feepolicy)): The gas fee policy.
+Returns the gas fee policy.
 
-### `getEVMGasRatio`
+#### Parameters
 
-Returns the ISC : EVM gas ratio.
+_None_
 
 #### Returns
 
-- `e` ([`Ratio32`](#ratio32)): The ISC : EVM gas ratio.
+| Name      | Type                              | Description        |
+| --------- | --------------------------------- | ------------------ |
+| feePolicy | [FeePolicy](./types.md#feepolicy) | The gas fee policy |
 
-### `getGasLimits()`
+### `getGasLimits`
 
 Returns the gas limits.
 
-#### Returns
+#### Parameters
 
-- `l` ([`GasLimits`](#gaslimits)): The gas limits.
+_None_
 
-### `getChainNodes()`
+#### Returns
 
-Returns the current access nodes and candidates.
+| Name      | Type                        | Description    |
+| --------- | --------------------------- | -------------- |
+| gasLimits | [Limits](./types.md#limits) | The gas limits |
 
-#### Returns
+### `getEVMGasRatio`
 
-- `ac` ([`Map`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/map.go)
-  of public key => `0x01`): The access nodes.
-- `an` ([`Map`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/map.go)
-  of public key => [`AccessNodeInfo`](#accessnodeinfo)): The candidate nodes.
+Returns the EVM gas ratio.
 
-### `getMaintenanceStatus()`
+#### Parameters
 
-Returns whether the chain is undergoing maintenance.
+_None_
 
 #### Returns
 
-- `m` (`bool`): `true` if the chain is in maintenance mode
-
-### `getCustomMetadata()`
+| Name        | Type                          | Description       |
+| ----------- | ----------------------------- | ----------------- |
+| evmGasRatio | [Ratio32](./types.md#ratio32) | The EVM gas ratio |
 
-Returns the extra metadata that is added to the chain AliasOutput.
+### `getChainNodes`
 
-#### Returns
+Returns the current access nodes and candidates.
 
-- `x` (`bytes`): the optional metadata
+#### Parameters
 
-### `getPayoutAgentID`
+_None_
 
-`getPayoutAgentID` gets the payout AgentID.
+#### Returns
 
-Returns the payout AgentID of the chain.
+| Name                                                                              | Type                                        | Description                                                                             |
+| --------------------------------------------------------------------------------- | ------------------------------------------- | --------------------------------------------------------------------------------------- |
+| accessNodes                                                                       | [[u8; 32]]                                  | The access node keys                                                                    |
+| candidates                                                                        | [AccessNodeInfo](./types.md#accessnodeinfo) | [`Map`](https://github.com/iotaledger/wasp/blob/develop/packages/kv/collections/map.go) |
+| of public key => [AccessNodeInfo](./types.md#accessnodeinfo): The candidates info |                                             |                                                                                         |
 
-#### Returns
+### `getMaintenanceStatus`
 
-- `s` (`AgentID`): the payout AgentID.
+Returns whether the chain is undergoing maintenance.
 
-### `getMinCommonAccountBalance`
+#### Parameters
 
-`getMinCommonAccountBalance` returns the minimum balanced to be held in the common account.
+_None_
 
 #### Returns
 
-- `ms` (`uint64`): the minimum storage deposit.
-
-## Schemas
+| Name          | Type | Description           |
+| ------------- | ---- | --------------------- |
+| isMaintenance | bool | Is maintenance active |
 
-### `Ratio32`
+### `getPayoutAgentID`
 
-A ratio between two values `x` and `y`, expressed as two `int32` numbers `a:b`, where `y = x * b/a`.
+Returns the payout AgentID.
 
-`Ratio32` is encoded as the concatenation of the two `uint32` values `a` & `b`.
+#### Parameters
 
-### `FeePolicy`
+_None_
 
-`FeePolicy` is encoded as the concatenation of:
+#### Returns
 
-- The [`TokenID`](accounts.md#tokenid) of the token used to charge for gas. (`iotago.NativeTokenID`)
-  - If this value is `nil`, the gas fee token is the base token.
-- Gas per token ([`Ratio32`](#ratio32)): expressed as an `a:b` (`gas/token`) ratio, meaning how many gas units each token pays for.
-- Validator fee share. Must be between 0 and 100, meaning the percentage of the gas fees distributed to the
-  validators. (`uint8`)
-- The ISC:EVM gas ratio ([`Ratio32`](#ratio32)): such that `ISC gas = EVM gas * a/b`.
+| Name          | Type     | Description         |
+| ------------- | -------- | ------------------- |
+| payoutAgentID | [u8; 32] | The payout agent ID |
 
-### `GasLimits`
+### `getMetadata`
 
-`GasLimits` is encoded as the concatenation of:
+Returns the metadata.
 
-- The maximum gas per block (`uint64`). A request that exceeds this limit is
-  skipped and processed in the next block.
-- The minimum gas per request (`uint64`). If a request consumes less than this
-  value, it is charged for this instead.
-- The maximum gas per request (`uint64`). If a request exceeds this limit, it
-  is rejected as failed.
-- The maximum gas per external view call (`uint64). This is the gas budget
-  assigned to external view calls.
+#### Parameters
 
-### `AccessNodeInfo`
+_None_
 
-`AccessNodeInfo` is encoded as the concatenation of:
+#### Returns
 
-- The validator address. (`[]byte` prefixed by `uint16` size)
-- The certificate. (`[]byte` prefixed by `uint16` size)
-- Whether the access node is part of the committee of validators. (`bool`)
-- The API base URL. (`string` prefixed by `uint16` size)
+| Name      | Type                                                  | Description    |
+| --------- | ----------------------------------------------------- | -------------- |
+| publicURL | string                                                | The public URL |
+| metadata  | [PublicChainMetadata](./types.md#publicchainmetadata) | The metadata   |
diff --git a/docs/content/iota-evm/references/core-contracts/overview.md b/docs/content/iota-evm/references/core-contracts/overview.md
index 601e509920e..ed3d5d27b12 100644
--- a/docs/content/iota-evm/references/core-contracts/overview.md
+++ b/docs/content/iota-evm/references/core-contracts/overview.md
@@ -18,8 +18,6 @@ provide infrastructure for all other smart contracts:
 
 - [`accounts`](./accounts.md): Manages the on-chain ledger of accounts.
 
-- [`blob`](./blob.md): Responsible for the registry of binary objects of arbitrary size.
-
 - [`blocklog`](./blocklog.md): Keeps track of the blocks and receipts of requests that were processed by the chain.
 
 - [`governance`](./governance.md): Handles the administrative functions of the chain. For example: rotation of the committee of validators of the chain, fees and other chain-specific configurations.
diff --git a/docs/content/iota-evm/references/core-contracts/root.md b/docs/content/iota-evm/references/core-contracts/root.md
index 09450bfd98b..ef3ba528ec8 100644
--- a/docs/content/iota-evm/references/core-contracts/root.md
+++ b/docs/content/iota-evm/references/core-contracts/root.md
@@ -1,114 +1,45 @@
 ---
-description: 'The root contract is the first smart contract deployed on the chain. It functions as a smart contract
-factory for the chain.'
+description: 'The `root` contract is the first smart contract deployed on the chain. It functions as a smart contract factory for the chain.'
 image: /img/logo/WASP_logo_dark.png
 tags:
-- core-contract
-- core-contract-root
-- reference
+  - core-contract
+  - core-contract-root
+  - reference
 ---
 
 # The `root` Contract
 
-The `root` contract is one of the [core contracts](overview.md) on each IOTA Smart Contracts
-chain.
+The `root` contract is one of the [core contracts](overview.md) on each IOTA Smart Contracts chain.
 
-The `root` contract is responsible for the initialization of the chain.
-It is the first smart contract deployed on the chain and, upon receiving the `init` request, bootstraps the state of the
-chain.
-Deploying all of the other core contracts is a part of the state initialization.
+This contract is responsible for the initialization of the chain. It is the first smart contract deployed on the chain and, upon receiving the `init` request, bootstraps the state of the chain. Deploying all of the other core contracts is a part of the state initialization.
 
-The `root` contract also functions as a smart contract factory for the chain: upon request, it deploys other smart
-contracts and maintains an on-chain registry of smart contracts in its state.
-The contract registry keeps a list of contract records containing their respective name, hname, description, and
-creator.
-
----
-
-## Entry Points
-
-### `init()`
-
-The constructor. Automatically called immediately after confirmation of the origin transaction and never called again.
-When executed, this function:
-
-- Initializes base values of the chain according to parameters.
-- Sets the caller as the _chain owner_.
-- Deploys all the core contracts.
-
-### `deployContract(ph ProgramHash, nm Name, ds Description)`
-
-Deploys a non-EVM smart contract on the chain if the caller has deployment permission.
-
-#### Parameters
-
-- `ph` (`[32]byte`): The hash of the binary _blob_ (that has been previously stored in the [`blob` contract](blob.md)).
-- `nm` (`string`): The name of the contract to be deployed, used to calculate the
-  contract's _hname_. The hname must be unique among all contract hnames in the chain.
-- `ds` (`string`): Description of the contract to be deployed.
-
-Any other parameters that are passed to the deployContract function will be passed on to
-the `init` function of the smart contract being deployed. Note that this means that the
-init parameter names cannot be the above ones, as they will have been filtered out.
-
-### `grantDeployPermission(dp AgentID)`
-
-The chain owner grants deploy permission to the agent ID `dp`.
-
-#### Parameters
-
-`dp`(AgentID): The agent ID.
-
-### `revokeDeployPermission(dp AgentID)`
-
-The chain owner revokes the deploy permission of the agent ID `dp`.
-
-#### Parameters
-
-`dp`(AgentID): The agent ID.
-
-### `requireDeployPermissions(de DeployPermissionsEnabled)`
-
-#### Parameters
-
-- `de` (`bool`): Whether permissions should be required to deploy a contract on the chain.
-
-By default, permissions are enabled (addresses need to be granted the right to deploy), but the chain owner can override
-this setting to allow anyone to deploy contracts on the chain.
-
----
+The `root` contract also functions as a smart contract factory for the chain: upon request, it deploys other smart contracts and maintains an on-chain registry of smart contracts in its state. The contract registry keeps a list of contract records containing their respective name, hname, description, and creator.
 
 ## Views
 
-### `findContract(hn Hname)`
+### `findContract`
 
 Returns the record for a given smart contract with Hname `hn` (if it exists).
 
 #### Parameters
 
-`hn`: The smart contract’s Hname
+| Name | Type | Optional | Description                 |
+| ---- | ---- | -------- | --------------------------- |
+| hn   | u32  | No       | The smart contract’s Hname. |
 
 #### Returns
 
-- `cf` (`bool`): Whether or not the contract exists.
-- `dt` ([`ContractRecord`](#contractrecord)): The requested contract record (if it exists).
+| Name | Type                                        | Description                                   |
+| ---- | ------------------------------------------- | --------------------------------------------- |
+| cf   | bool                                        | Whether or not the contract exists.           |
+| dt   | [ContractRecord](./types.md#contractrecord) | The requested contract record (if it exists). |
 
-### `getContractRecords()`
+### `getContractRecords`
 
 Returns the list of all smart contracts deployed on the chain and related records.
 
 #### Returns
 
-A map of `Hname` => [`ContractRecord`](#contractrecord)
-
----
-
-## Schemas
-
-### `ContractRecord`
-
-A `ContractRecord` is encoded as the concatenation of:
-
-- Program hash (`[32]byte`).
-- Contract description (`string`).
-- Contract name (`string`).
+| Name    | Type                                                  | Description                         |
+| ------- | ----------------------------------------------------- | ----------------------------------- |
+| records | map[u32][[ContractRecord](./types.md#contractrecord)] | A map of Hname to contract records. |
diff --git a/docs/content/iota-evm/references/core-contracts/types.md b/docs/content/iota-evm/references/core-contracts/types.md
new file mode 100644
index 00000000000..aeaaf69fd52
--- /dev/null
+++ b/docs/content/iota-evm/references/core-contracts/types.md
@@ -0,0 +1,323 @@
+# Types
+
+To call core contracts from Move you have to encode the parameters using BCS. This page lists custom enums and structs used.
+
+## Enums
+
+### `AgentID`
+
+| Name                   | Type                      |
+| ---------------------- | ------------------------- |
+| NoType                 | null                      |
+| AddressAgentID         | IscAddressAgentID         |
+| ContractAgentID        | IscContractAgentID        |
+| EthereumAddressAgentID | IscEthereumAddressAgentID |
+| NilAgentID             | IscNilAgentID             |
+
+### `Request`
+
+| Name           | Type                                        |
+| -------------- | ------------------------------------------- |
+| OnLedger       | [OnLedgerRequestData](#onledgerrequestdata) |
+| OffLedger      | OffLedgerRequestData                        |
+| EVMOffLedgerTx | evmOffLedgerTxRequest                       |
+
+### `VMErrorParam`
+
+| Name   | Type    |
+| ------ | ------- |
+| NoType | null    |
+| uint16 | u16     |
+| int64  | [u8; 8] |
+| string | string  |
+| uint8  | u8      |
+| int32  | [u8; 4] |
+| uint64 | u64     |
+| int16  | [u8; 2] |
+| uint32 | u32     |
+
+## Maps
+
+### CoinBalances
+
+[[CoinType](#cointype)][u64]
+
+## Structs
+
+### `AccessNodeData`
+
+| Name          | Type     |
+| ------------- | -------- |
+| ValidatorAddr | [u8; 32] |
+| Certificate   | [u8]     |
+| ForCommittee  | bool     |
+| AccessAPI     | string   |
+
+### `AccessNodeInfo`
+
+| Name           | Type                              |
+| -------------- | --------------------------------- |
+| NodePubKey     | [u8; 32]                          |
+| AccessNodeData | [AccessNodeData](#accessnodedata) |
+
+### `Anchor`
+
+| Name          | Type                                      |
+| ------------- | ----------------------------------------- |
+| iD            | [u8; 32]                                  |
+| assets        | [Referent_AssetsBag](#referent_assetsbag) |
+| stateMetadata | [u8]                                      |
+| stateIndex    | u32                                       |
+
+### `AnchorWithRef`
+
+| Name      | Type                    |
+| --------- | ----------------------- |
+| objectRef | [ObjectRef](#objectref) |
+| object    | [Anchor](#anchor)       |
+| owner     | [u8; 32]                |
+
+### `Assets`
+
+| Name    | Type                          |
+| ------- | ----------------------------- |
+| Coins   | [CoinBalances](#coinbalances) |
+| Objects | [u8; 32]                      |
+
+### `AssetsBag`
+
+| Name | Type     |
+| ---- | -------- |
+| iD   | [u8; 32] |
+| size | u64      |
+
+### `AssetsBagWithBalances`
+
+| Name      | Type                    |
+| --------- | ----------------------- |
+| AssetsBag | [AssetsBag](#assetsbag) |
+| Assets    | [Assets](#assets)       |
+
+### `BlockInfo`
+
+| Name                  | Type                        |
+| --------------------- | --------------------------- |
+| schemaVersion         | u8                          |
+| blockIndex            | u32                         |
+| timestamp             | u64                         |
+| previousAnchor        | [StateAnchor](#stateanchor) |
+| l1Params              | [L1Params](#l1params)       |
+| totalRequests         | u16                         |
+| numSuccessfulRequests | u16                         |
+| numOffLedgerRequests  | u16                         |
+| gasBurned             | u64                         |
+| gasFeeCharged         | u64                         |
+
+### `CallTarget`
+
+| Name       | Type |
+| ---------- | ---- |
+| contract   | u32  |
+| entryPoint | u32  |
+
+### `ChainInfo`
+
+| Name            | Type                                        |
+| --------------- | ------------------------------------------- |
+| chainID         | [u8; 32]                                    |
+| chainOwnerID    | [u8; 32]                                    |
+| gasFeePolicy    | [FeePolicy](#feepolicy)                     |
+| gasLimits       | [Limits](#limits)                           |
+| blockKeepAmount | [u8; 4]                                     |
+| publicURL       | string                                      |
+| metadata        | [PublicChainMetadata](#publicchainmetadata) |
+
+### `CoinType`
+
+| Name | Type   |
+| ---- | ------ |
+| s    | string |
+
+### `ContractIdentity`
+
+| Name    | Type     |
+| ------- | -------- |
+| kind    | u8       |
+| evmAddr | [u8, 20] |
+| hname   | u32      |
+
+### `ContractRecord`
+
+| Name | Type   |
+| ---- | ------ |
+| Name | string |
+
+### `Event`
+
+| Name       | Type   |
+| ---------- | ------ |
+| ContractID | u32    |
+| Topic      | string |
+| Timestamp  | u64    |
+| Payload    | [u8]   |
+
+### `FeePolicy`
+
+| Name              | Type                |
+| ----------------- | ------------------- |
+| eVMGasRatio       | [Ratio32](#ratio32) |
+| gasPerToken       | [Ratio32](#ratio32) |
+| validatorFeeShare | u8                  |
+
+### `GasBurnLog`
+
+| Name    | Type                              |
+| ------- | --------------------------------- |
+| records | [[GasBurnRecord](#gasburnrecord)] |
+
+### `GasBurnRecord`
+
+| Name      | Type |
+| --------- | ---- |
+| code      | u16  |
+| gasBurned | u64  |
+
+### `IotaCoinInfo`
+
+| Name        | Type                  |
+| ----------- | --------------------- |
+| CoinType    | [CoinType](#cointype) |
+| Decimals    | u8                    |
+| Name        | string                |
+| Symbol      | string                |
+| Description | string                |
+| IconURL     | string                |
+| TotalSupply | u64                   |
+
+### `L1Params`
+
+| Name      | Type                          |
+| --------- | ----------------------------- |
+| protocol  | [Protocol](#protocol)         |
+| baseToken | [IotaCoinInfo](#iotacoininfo) |
+
+### `Limits`
+
+| Name                   | Type |
+| ---------------------- | ---- |
+| maxGasPerBlock         | u64  |
+| minGasPerRequest       | u64  |
+| maxGasPerRequest       | u64  |
+| maxGasExternalViewCall | u64  |
+
+### `Message`
+
+| Name   | Type                      |
+| ------ | ------------------------- |
+| Target | [CallTarget](#calltarget) |
+| Params | [[byte]]                  |
+
+### `ObjectRef`
+
+| Name     | Type     |
+| -------- | -------- |
+| objectID | [u8; 32] |
+| version  | u64      |
+| digest   | [u8]     |
+
+### `OnLedgerRequestData`
+
+| Name            | Type                                             |
+| --------------- | ------------------------------------------------ |
+| requestRef      | [ObjectRef](#objectref)                          |
+| senderAddress   | *[u8; 32]                                        |
+| targetAddress   | *[u8; 32]                                        |
+| assets          | *[Assets](#assets)                               |
+| assetsBag       | *[AssetsBagWithBalances](#assetsbagwithbalances) |
+| requestMetadata | *[RequestMetadata](#requestmetadata)             |
+
+### `Protocol`
+
+| Name                  | Type   |
+| --------------------- | ------ |
+| epoch                 | BigInt |
+| protocolVersion       | BigInt |
+| systemStateVersion    | BigInt |
+| iotaTotalSupply       | BigInt |
+| referenceGasPrice     | BigInt |
+| epochStartTimestampMs | BigInt |
+| epochDurationMs       | BigInt |
+
+### `PublicChainMetadata`
+
+| Name            | Type   |
+| --------------- | ------ |
+| eVMJsonRPCURL   | string |
+| eVMWebSocketURL | string |
+| name            | string |
+| description     | string |
+| website         | string |
+
+### `Ratio32`
+
+| Name | Type |
+| ---- | ---- |
+| A    | u32  |
+| B    | u32  |
+
+### `Referent_AssetsBag`
+
+| Name  | Type                    | optional |
+| ----- | ----------------------- | -------- |
+| iD    | [u8; 32]                | No       |
+| value | [AssetsBag](#assetsbag) | Yes      |
+
+### `RequestMetadata`
+
+| Name           | Type                                  |
+| -------------- | ------------------------------------- |
+| senderContract | [ContractIdentity](#contractidentity) |
+| message        | [Message](#message)                   |
+| allowance      | *[Assets](#assets)                    |
+| gasBudget      | u64                                   |
+
+### `RequestReceipt`
+
+| Name          | Type                                                  |
+| ------------- | ----------------------------------------------------- |
+| Request       | [Request](#request)                                   |
+| Error         | [IscUnresolvedVMError](#unresolvedvmerror) (optional) |
+| GasBudget     | u64                                                   |
+| GasBurned     | u64                                                   |
+| GasFeeCharged | u64                                                   |
+| GasBurnLog    | [GasBurnLog](#gasburnlog)                             |
+| BlockIndex    | u32                                                   |
+| RequestIndex  | u16                                                   |
+
+### `RequestReceiptsResponse`
+
+| Name       | Type             |
+| ---------- | ---------------- |
+| BlockIndex | u32              |
+| Receipts   | [RequestReceipt] |
+
+### `StateAnchor`
+
+| Name       | Type                            |
+| ---------- | ------------------------------- |
+| anchor     | [AnchorWithRef](#anchorwithref) |
+| iscPackage | [u8; 32]                        |
+
+### `UnresolvedVMError`
+
+| Name      | Type                            |
+| --------- | ------------------------------- |
+| errorCode | [IscVMErrorCode](#vmerrorcode)  |
+| params    | [[VMErrorParam](#vmerrorparam)] |
+
+### `VMErrorCode`
+
+| Name       | Type |
+| ---------- | ---- |
+| contractID | u32  |
+| iD         | u16  |
diff --git a/docs/content/iota-evm/references/core-contracts/xfer.md b/docs/content/iota-evm/references/core-contracts/xfer.md
index dc0affd0dce..3b1d8aeded7 100644
--- a/docs/content/iota-evm/references/core-contracts/xfer.md
+++ b/docs/content/iota-evm/references/core-contracts/xfer.md
@@ -16,7 +16,7 @@ prevent
 
 ## Entry Point
 
-### `transferAccountToChain(g GasReserve)`
+### `transferAccountToChain`
 
 Transfers the specified allowance from the sender SC's L2 account on
 the target chain to the sender SC's L2 account on the origin chain.
@@ -29,9 +29,10 @@ function then transfers it into the caller's L2 account on that chain.
 
 #### Parameters
 
-- `g` (`uint64`): Optional gas amount to reserve in the allowance for
-  the internal call to transferAllowanceTo(). Default 100 (MinGasFee).
-  But better to provide it so that it matches the fee structure.
+| Name                                                                 | Type | Optional | Description                                |
+| -------------------------------------------------------------------- | ---- | -------- | ------------------------------------------ |
+| optionalGasReserve                                                   | u64  | Yes      | Gas amount to reserve in the allowance for |
+| the internal call to transferAllowanceTo(). Default 100 (MinGasFee). |      |          |                                            |
 
 ### IMPORTANT CONSIDERATIONS
 
diff --git a/docs/content/sidebars/iota-evm.js b/docs/content/sidebars/iota-evm.js
index c7b032b5c1e..59ce60023df 100644
--- a/docs/content/sidebars/iota-evm.js
+++ b/docs/content/sidebars/iota-evm.js
@@ -516,11 +516,6 @@ const iotaEvm = [
                         label: 'accounts',
                         id: 'iota-evm/references/core-contracts/accounts',
                     },
-                    {
-                        type: 'doc',
-                        label: 'blob',
-                        id: 'iota-evm/references/core-contracts/blob',
-                    },
                     {
                         type: 'doc',
                         label: 'blocklog',
@@ -541,6 +536,11 @@ const iotaEvm = [
                         label: 'EVM',
                         id: 'iota-evm/references/core-contracts/evm',
                     },
+                    {
+                        type: 'doc',
+                        label: 'Types',
+                        id: 'iota-evm/references/core-contracts/types',
+                    },
                 ],
             },
             {


Reviews:
user: login: lucas-tortora
body: Why does this PR update some many image files and snippets?
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T13:30:59Z
user: login: lucas-tortora
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T12:33:14Z
user: login: Dr-Electron
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-25T09:00:31Z
user: login: Dr-Electron
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-25T13:14:28Z
user: login: lucas-tortora
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-28T13:56:51Z
user: login: vivekjain23
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-28T15:42:23Z

Review comments:
diff_hunk: @@ -29,91 +29,53 @@ Most entry points of the `evm` core contract are meant to be accessed through th
 automatically by the Wasp node so that the end users can use standard EVM tools like [MetaMask](https://metamask.io/).
 We only list the entry points not exposed through the JSON-RPC interface in this document.
 
-### `init()`
+### `registerERC20Coin`
 
-Called automatically when the ISC is deployed.
-
-Some parameters of the `evm` contract can be specified by passing them to the
-[`root` contract `init` entry point](root.md#init):
-
-- `evmg` (optional [`GenesisAlloc`](#genesisalloc)): The genesis allocation. The balance of all accounts must be 0.
-- `evmbk` (optional `int32` - default: keep all): Amount of EVM blocks to keep in the state.
-- `evmchid` (optional `uint16` - default: 1074): EVM chain iD
-
-  :::caution
-
-  Re-using an existing Chain ID is not recommended and can be a security risk. For serious usage, register a unique
-  Chain ID on [Chainlist](https://chainlist.org/) and use that instead of the default. **It is not possible to change
-  the EVM chain ID after deployment.**
-
-  :::
-
-- `evmw` (optional [`GasRatio`](./governance.md#ratio32) - default: `1:1`): The ISC to EVM gas ratio.
-
-### `registerERC20NativeToken`
-
-Registers an ERC20 contract to act as a proxy for the native tokens, at address
+Registers an ERC20 contract to act as a proxy for the L1 coin, at address
 `0x107402xxxxxxxx00000000000000000000000000`, where `xxxxxxxx` is the
-little-endian encoding of the foundry serial number.
+hash of the coin type. <!--TODO: Check this info-->
path: docs/content/iota-evm/references/core-contracts/evm.md
user: login: lucas-tortora
body: Just in case, there's a todo here 
created_at: 2025-04-22T12:23:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,66 @@
+---
+description: Deploying Wasm smart contracts with Solo.
+image: /img/iota-evm/tutorial/send_request.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+# Deploying Wasm Smart Contracts
+
+:::note WASM VM
path: docs/content/iota-evm/solo/how-tos/deploying-sc.md
user: login: lucas-tortora
body: Do we still have WASM?
created_at: 2025-04-22T12:24:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
the `SoloContext` to create full-blown tests for the `dividend` example smart contract.
```
created_at: 2025-04-22T12:25:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
`SoloContext` `ctx`. Then it uses `ctx` to create a new `SoloAgent`, `member1`. When creating a
```
created_at: 2025-04-22T12:26:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
`SoloAgent`, a new _Tangle_ address is created for that agent, and its on-chain account is
```
Do we still use the term tangle?
created_at: 2025-04-22T12:26:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
`SoloAgent`, a new _Tangle_ address is created for that agent, and its on-chain account is
```
Do we still use the term tangle?
created_at: 2025-04-22T12:26:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
+pre-seeded with 10M base tokens so that it is ready to be used in tests. The SoloAgent can
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
pre-seeded with 10M base tokens so that it is ready to be used in tests. The `SoloAgent` can
```
created_at: 2025-04-22T12:27:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
+pre-seeded with 10M base tokens so that it is ready to be used in tests. The SoloAgent can
+be used whenever an address or agent ID needs to be provided, it can be used to sign a
+request to identify it as the sender, and it can be used to inspect the asset balances on
+its Tangle address and its on-chain account.
+
+In this case, we simply create `member1`, and pass it to the dividend contract's `member`
+function, which will receive the address of `member1` and a dispersal factor of 100.
+Finally, we check if ctx has received an error during the execution of the call. Remember
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
Finally, we check if `ctx` has received an error during the execution of the call. Remember
```
created_at: 2025-04-22T12:27:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
+pre-seeded with 10M base tokens so that it is ready to be used in tests. The SoloAgent can
+be used whenever an address or agent ID needs to be provided, it can be used to sign a
+request to identify it as the sender, and it can be used to inspect the asset balances on
+its Tangle address and its on-chain account.
+
+In this case, we simply create `member1`, and pass it to the dividend contract's `member`
+function, which will receive the address of `member1` and a dispersal factor of 100.
+Finally, we check if ctx has received an error during the execution of the call. Remember
+that the only way to pass an error from a WasmLib function call is through a `panic()`
+call. The code that handles the actual call will intercept any `panic()` that was raised,
+and return an error. The SoloContext saves this error for later inspection, because the
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
and return an error. The `SoloContext` saves this error for later inspection, because the
```
created_at: 2025-04-22T12:28:03Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
+pre-seeded with 10M base tokens so that it is ready to be used in tests. The SoloAgent can
+be used whenever an address or agent ID needs to be provided, it can be used to sign a
+request to identify it as the sender, and it can be used to inspect the asset balances on
+its Tangle address and its on-chain account.
+
+In this case, we simply create `member1`, and pass it to the dividend contract's `member`
+function, which will receive the address of `member1` and a dispersal factor of 100.
+Finally, we check if ctx has received an error during the execution of the call. Remember
+that the only way to pass an error from a WasmLib function call is through a `panic()`
+call. The code that handles the actual call will intercept any `panic()` that was raised,
+and return an error. The SoloContext saves this error for later inspection, because the
+function descriptor used in the call itself has no way of passing back this error.
+
+The next two example tests each call the contract's `member` function in the exact same
+way, but in both cases one required parameter is omitted. The idea is to test that the
+function properly panics by checking the ctx.Err value is not nil after the call. Finally,
+the error message text is checked to see if it contains the expected error message.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberFailMissingAddress(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Factor().SetValue(100)
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory address")
+}
+
+func TestAddMemberFailMissingFactor(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Address().SetValue(member1.ScAgentID().Address())
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory factor")
+}
+```
+
+</TabItem>
+</Tabs>
+
+Each test has to set up the chain/contract/context from scratch. We will often use a
+specific setupTest() function to do all setup work that is shared by many tests.
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
specific `setupTest()` function to do all setup work that is shared by many tests.
```
created_at: 2025-04-22T12:28:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
+pre-seeded with 10M base tokens so that it is ready to be used in tests. The SoloAgent can
+be used whenever an address or agent ID needs to be provided, it can be used to sign a
+request to identify it as the sender, and it can be used to inspect the asset balances on
+its Tangle address and its on-chain account.
+
+In this case, we simply create `member1`, and pass it to the dividend contract's `member`
+function, which will receive the address of `member1` and a dispersal factor of 100.
+Finally, we check if ctx has received an error during the execution of the call. Remember
+that the only way to pass an error from a WasmLib function call is through a `panic()`
+call. The code that handles the actual call will intercept any `panic()` that was raised,
+and return an error. The SoloContext saves this error for later inspection, because the
+function descriptor used in the call itself has no way of passing back this error.
+
+The next two example tests each call the contract's `member` function in the exact same
+way, but in both cases one required parameter is omitted. The idea is to test that the
+function properly panics by checking the ctx.Err value is not nil after the call. Finally,
+the error message text is checked to see if it contains the expected error message.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberFailMissingAddress(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Factor().SetValue(100)
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory address")
+}
+
+func TestAddMemberFailMissingFactor(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Address().SetValue(member1.ScAgentID().Address())
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory factor")
+}
+```
+
+</TabItem>
+</Tabs>
+
+Each test has to set up the chain/contract/context from scratch. We will often use a
+specific setupTest() function to do all setup work that is shared by many tests.
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
specific `setupTest()` function to do all the setup work that is shared by many tests.
```
created_at: 2025-04-22T12:28:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
+pre-seeded with 10M base tokens so that it is ready to be used in tests. The SoloAgent can
+be used whenever an address or agent ID needs to be provided, it can be used to sign a
+request to identify it as the sender, and it can be used to inspect the asset balances on
+its Tangle address and its on-chain account.
+
+In this case, we simply create `member1`, and pass it to the dividend contract's `member`
+function, which will receive the address of `member1` and a dispersal factor of 100.
+Finally, we check if ctx has received an error during the execution of the call. Remember
+that the only way to pass an error from a WasmLib function call is through a `panic()`
+call. The code that handles the actual call will intercept any `panic()` that was raised,
+and return an error. The SoloContext saves this error for later inspection, because the
+function descriptor used in the call itself has no way of passing back this error.
+
+The next two example tests each call the contract's `member` function in the exact same
+way, but in both cases one required parameter is omitted. The idea is to test that the
+function properly panics by checking the ctx.Err value is not nil after the call. Finally,
+the error message text is checked to see if it contains the expected error message.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberFailMissingAddress(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Factor().SetValue(100)
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory address")
+}
+
+func TestAddMemberFailMissingFactor(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Address().SetValue(member1.ScAgentID().Address())
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory factor")
+}
+```
+
+</TabItem>
+</Tabs>
+
+Each test has to set up the chain/contract/context from scratch. We will often use a
+specific setupTest() function to do all setup work that is shared by many tests.
+
+We cannot use the `dividendMember` wrapper function in these two tests because of the
+missing required function parameters. So we have simply copy/pasted the code, and removed
+the `Params` proxy initialization lines that we wanted to be detected as missing.
+
+Now let's see a more complex example:
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
Next, let's see a more complex example:
```
created_at: 2025-04-22T12:29:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
+pre-seeded with 10M base tokens so that it is ready to be used in tests. The SoloAgent can
+be used whenever an address or agent ID needs to be provided, it can be used to sign a
+request to identify it as the sender, and it can be used to inspect the asset balances on
+its Tangle address and its on-chain account.
+
+In this case, we simply create `member1`, and pass it to the dividend contract's `member`
+function, which will receive the address of `member1` and a dispersal factor of 100.
+Finally, we check if ctx has received an error during the execution of the call. Remember
+that the only way to pass an error from a WasmLib function call is through a `panic()`
+call. The code that handles the actual call will intercept any `panic()` that was raised,
+and return an error. The SoloContext saves this error for later inspection, because the
+function descriptor used in the call itself has no way of passing back this error.
+
+The next two example tests each call the contract's `member` function in the exact same
+way, but in both cases one required parameter is omitted. The idea is to test that the
+function properly panics by checking the ctx.Err value is not nil after the call. Finally,
+the error message text is checked to see if it contains the expected error message.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberFailMissingAddress(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Factor().SetValue(100)
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory address")
+}
+
+func TestAddMemberFailMissingFactor(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Address().SetValue(member1.ScAgentID().Address())
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory factor")
+}
+```
+
+</TabItem>
+</Tabs>
+
+Each test has to set up the chain/contract/context from scratch. We will often use a
+specific setupTest() function to do all setup work that is shared by many tests.
+
+We cannot use the `dividendMember` wrapper function in these two tests because of the
+missing required function parameters. So we have simply copy/pasted the code, and removed
+the `Params` proxy initialization lines that we wanted to be detected as missing.
+
+Now let's see a more complex example:
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestDivide1Member(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    bal := ctx.Balances(member1)
+
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator += ctx.StorageDeposit - ctx.GasFee
+    bal.VerifyBalances(t)
+
+    const dividendToDivide = 1*isc.Million + 1
+    dividendDivide(ctx, dividendToDivide)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator -= ctx.GasFee
+    bal.Add(member1, dividendToDivide)
+    bal.VerifyBalances(t)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The first half of the code is almost identical to our first test above. We set up the
+test, create an agent, set the factor for that agent to 100, and verify that no error
+occurred. Notice how we additionally call `ctx.Balances()` to make a snapshot of all the
+original asset balances including those of the agent.
+
+Then in the next lines we update the asset balances with the changes we expect to happen
+because of the call to the `member` function. And then we verify these changes against the
+actual asset balances by calling `bal.VerifyBalances(t)`.
+
+Next we transfer 1M + 1 tokens as part of the post request to the `divide` function. We
+subsequently check that no error has occurred. Finally, we again modify the asset balances
+to reflect the expected changes and verify these changes against the actual asset
+balances.
+
+Now let's skip to the most complex test of all:
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+    func TestDivide3Members(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    bal := ctx.Balances(member1)
+
+    dividendMember(ctx, member1, 25)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator += ctx.StorageDeposit - ctx.GasFee
+    bal.VerifyBalances(t)
+
+    member2 := ctx.NewSoloAgent("member2")
+    bal = ctx.Balances(member1, member2)
+
+    dividendMember(ctx, member2, 50)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator += ctx.StorageDeposit - ctx.GasFee
+    bal.VerifyBalances(t)
+
+    member3 := ctx.NewSoloAgent()
+    bal = ctx.Balances(member1, member2, member3)
+
+    dividendMember(ctx, member3, 75)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator += ctx.StorageDeposit - ctx.GasFee
+    bal.VerifyBalances(t)
+
+    const dividendToDivide = 2*isc.Million - 1
+    dividendDivide(ctx, dividendToDivide)
+    require.NoError(t, ctx.Err)
+
+    remain := dividendToDivide - dividendToDivide*25/150 - dividendToDivide*50/150 - dividendToDivide*75/150
+    bal.Chain += ctx.GasFee
+    bal.Originator += remain - ctx.GasFee
+    bal.Add(member1, dividendToDivide*25/150)
+    bal.Add(member2, dividendToDivide*50/150)
+    bal.Add(member3, dividendToDivide*75/150)
+    bal.VerifyBalances(t)
+
+    const dividendToDivide2 = 2*isc.Million + 234
+    dividendDivide(ctx, dividendToDivide2)
+    require.NoError(t, ctx.Err)
+
+    remain = dividendToDivide2 - dividendToDivide2*25/150 - dividendToDivide2*50/150 - dividendToDivide2*75/150
+    bal.Chain += ctx.GasFee
+    bal.Originator += remain - ctx.GasFee
+    bal.Add(member1, dividendToDivide2*25/150)
+    bal.Add(member2, dividendToDivide2*50/150)
+    bal.Add(member3, dividendToDivide2*75/150)
+    bal.VerifyBalances(t)
+}
+```
+
+</TabItem>
+</Tabs>
+
+This function creates 3 agents, and associates factors of 25, 50, and 75 respectively to
+them. That required 3 `member` requests, and we verify the expected balance changes after
+each request. Next the `divide` function is called, with 2M-1 tokens passed to it.
+
+After this we verify that each agent has been distributed tokens according to its relative
+factor. Those factors are 25/150th, 50/150th, and 75/150th, respectively. Note that we
+cannot transfer fractional tokens, so we truncate to the nearest integer and ultimately
+any remaining tokens are not transferred, but remain in the sender's account.
+
+Finally, we call `divide` again with 2M+234 tokens and again verify the asset balances
+afterwards.
+
+Next we will show how to test Views and/or Funcs that return
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: Please add a link to the explantions/context doc
created_at: 2025-04-22T12:32:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,276 @@
+---
+description: Use the SoloContext to create full-blown tests for the dividend example smart contract.
+image: /img/logo/WASP_logo_dark.png
+tags:
+  - how-to
+  - evm
+  - solo
+  - testing
+teams:
+  - iotaledger/l2-smart-contract
+---
+
+
+# Example Tests
+
+In the previous sections we showed how you can `call()` or
+`post()` smart contract function requests. We also created a few wrapper
+functions to simplify calling these functions even further. Now we will look at how to use
+the SoloContext to create full-blown tests for the `dividend` example smart contract.
+
+Let's start with a simple test. We are going to use the `member` function to add a valid
+new member/factor combination to the member group.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberOk(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The above test first deploys the `dividend` smart contract to a new chain, and returns a
+SoloContext `ctx`. Then it uses `ctx` to create a new SoloAgent `member1`. When creating a
+SoloAgent a new _Tangle_ address is created for that agent and its on-chain account is
+pre-seeded with 10M base tokens so that it is ready to be used in tests. The SoloAgent can
+be used whenever an address or agent ID needs to be provided, it can be used to sign a
+request to identify it as the sender, and it can be used to inspect the asset balances on
+its Tangle address and its on-chain account.
+
+In this case, we simply create `member1`, and pass it to the dividend contract's `member`
+function, which will receive the address of `member1` and a dispersal factor of 100.
+Finally, we check if ctx has received an error during the execution of the call. Remember
+that the only way to pass an error from a WasmLib function call is through a `panic()`
+call. The code that handles the actual call will intercept any `panic()` that was raised,
+and return an error. The SoloContext saves this error for later inspection, because the
+function descriptor used in the call itself has no way of passing back this error.
+
+The next two example tests each call the contract's `member` function in the exact same
+way, but in both cases one required parameter is omitted. The idea is to test that the
+function properly panics by checking the ctx.Err value is not nil after the call. Finally,
+the error message text is checked to see if it contains the expected error message.
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestAddMemberFailMissingAddress(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Factor().SetValue(100)
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory address")
+}
+
+func TestAddMemberFailMissingFactor(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    member := dividend.ScFuncs.Member(ctx)
+    member.Params.Address().SetValue(member1.ScAgentID().Address())
+    member.Func.Post()
+    require.Error(t, ctx.Err)
+    require.Contains(t, ctx.Err.Error(), "missing mandatory factor")
+}
+```
+
+</TabItem>
+</Tabs>
+
+Each test has to set up the chain/contract/context from scratch. We will often use a
+specific setupTest() function to do all setup work that is shared by many tests.
+
+We cannot use the `dividendMember` wrapper function in these two tests because of the
+missing required function parameters. So we have simply copy/pasted the code, and removed
+the `Params` proxy initialization lines that we wanted to be detected as missing.
+
+Now let's see a more complex example:
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+func TestDivide1Member(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    bal := ctx.Balances(member1)
+
+    dividendMember(ctx, member1, 100)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator += ctx.StorageDeposit - ctx.GasFee
+    bal.VerifyBalances(t)
+
+    const dividendToDivide = 1*isc.Million + 1
+    dividendDivide(ctx, dividendToDivide)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator -= ctx.GasFee
+    bal.Add(member1, dividendToDivide)
+    bal.VerifyBalances(t)
+}
+```
+
+</TabItem>
+</Tabs>
+
+The first half of the code is almost identical to our first test above. We set up the
+test, create an agent, set the factor for that agent to 100, and verify that no error
+occurred. Notice how we additionally call `ctx.Balances()` to make a snapshot of all the
+original asset balances including those of the agent.
+
+Then in the next lines we update the asset balances with the changes we expect to happen
+because of the call to the `member` function. And then we verify these changes against the
+actual asset balances by calling `bal.VerifyBalances(t)`.
+
+Next we transfer 1M + 1 tokens as part of the post request to the `divide` function. We
+subsequently check that no error has occurred. Finally, we again modify the asset balances
+to reflect the expected changes and verify these changes against the actual asset
+balances.
+
+Now let's skip to the most complex test of all:
+
+<Tabs groupId="language" queryString>
+
+<TabItem value="go" label="Go">
+
+```go
+    func TestDivide3Members(t *testing.T) {
+    ctx := wasmsolo.NewSoloContext(t, dividend.ScName, dividend.OnDispatch)
+
+    member1 := ctx.NewSoloAgent("member1")
+    bal := ctx.Balances(member1)
+
+    dividendMember(ctx, member1, 25)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator += ctx.StorageDeposit - ctx.GasFee
+    bal.VerifyBalances(t)
+
+    member2 := ctx.NewSoloAgent("member2")
+    bal = ctx.Balances(member1, member2)
+
+    dividendMember(ctx, member2, 50)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator += ctx.StorageDeposit - ctx.GasFee
+    bal.VerifyBalances(t)
+
+    member3 := ctx.NewSoloAgent()
+    bal = ctx.Balances(member1, member2, member3)
+
+    dividendMember(ctx, member3, 75)
+    require.NoError(t, ctx.Err)
+
+    bal.Chain += ctx.GasFee
+    bal.Originator += ctx.StorageDeposit - ctx.GasFee
+    bal.VerifyBalances(t)
+
+    const dividendToDivide = 2*isc.Million - 1
+    dividendDivide(ctx, dividendToDivide)
+    require.NoError(t, ctx.Err)
+
+    remain := dividendToDivide - dividendToDivide*25/150 - dividendToDivide*50/150 - dividendToDivide*75/150
+    bal.Chain += ctx.GasFee
+    bal.Originator += remain - ctx.GasFee
+    bal.Add(member1, dividendToDivide*25/150)
+    bal.Add(member2, dividendToDivide*50/150)
+    bal.Add(member3, dividendToDivide*75/150)
+    bal.VerifyBalances(t)
+
+    const dividendToDivide2 = 2*isc.Million + 234
+    dividendDivide(ctx, dividendToDivide2)
+    require.NoError(t, ctx.Err)
+
+    remain = dividendToDivide2 - dividendToDivide2*25/150 - dividendToDivide2*50/150 - dividendToDivide2*75/150
+    bal.Chain += ctx.GasFee
+    bal.Originator += remain - ctx.GasFee
+    bal.Add(member1, dividendToDivide2*25/150)
+    bal.Add(member2, dividendToDivide2*50/150)
+    bal.Add(member3, dividendToDivide2*75/150)
+    bal.VerifyBalances(t)
+}
+```
+
+</TabItem>
+</Tabs>
+
+This function creates 3 agents, and associates factors of 25, 50, and 75 respectively to
+them. That required 3 `member` requests, and we verify the expected balance changes after
+each request. Next the `divide` function is called, with 2M-1 tokens passed to it.
+
+After this we verify that each agent has been distributed tokens according to its relative
+factor. Those factors are 25/150th, 50/150th, and 75/150th, respectively. Note that we
+cannot transfer fractional tokens, so we truncate to the nearest integer and ultimately
+any remaining tokens are not transferred, but remain in the sender's account.
+
+Finally, we call `divide` again with 2M+234 tokens and again verify the asset balances
+afterwards.
+
+Next we will show how to test Views and/or Funcs that return
+a result. Note that even though Funcs are usually invoked through a `post()`
+request, in which case any return values are inaccessible, they still can be invoked
+through a call() from within another Func, in which these return values can
path: docs/content/iota-evm/solo/how-tos/examples.mdx
user: login: lucas-tortora
body: ```suggestion
through a `call()` from within another Func, in which these return values can
```
created_at: 2025-04-22T12:32:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -29,91 +29,53 @@ Most entry points of the `evm` core contract are meant to be accessed through th
 automatically by the Wasp node so that the end users can use standard EVM tools like [MetaMask](https://metamask.io/).
 We only list the entry points not exposed through the JSON-RPC interface in this document.
 
-### `init()`
+### `registerERC20Coin`
 
-Called automatically when the ISC is deployed.
-
-Some parameters of the `evm` contract can be specified by passing them to the
-[`root` contract `init` entry point](root.md#init):
-
-- `evmg` (optional [`GenesisAlloc`](#genesisalloc)): The genesis allocation. The balance of all accounts must be 0.
-- `evmbk` (optional `int32` - default: keep all): Amount of EVM blocks to keep in the state.
-- `evmchid` (optional `uint16` - default: 1074): EVM chain iD
-
-  :::caution
-
-  Re-using an existing Chain ID is not recommended and can be a security risk. For serious usage, register a unique
-  Chain ID on [Chainlist](https://chainlist.org/) and use that instead of the default. **It is not possible to change
-  the EVM chain ID after deployment.**
-
-  :::
-
-- `evmw` (optional [`GasRatio`](./governance.md#ratio32) - default: `1:1`): The ISC to EVM gas ratio.
-
-### `registerERC20NativeToken`
-
-Registers an ERC20 contract to act as a proxy for the native tokens, at address
+Registers an ERC20 contract to act as a proxy for the L1 coin, at address
 `0x107402xxxxxxxx00000000000000000000000000`, where `xxxxxxxx` is the
-little-endian encoding of the foundry serial number.
+hash of the coin type. <!--TODO: Check this info-->
path: docs/content/iota-evm/references/core-contracts/evm.md
user: login: Dr-Electron
body: Good point
created_at: 2025-04-25T09:00:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -29,91 +29,53 @@ Most entry points of the `evm` core contract are meant to be accessed through th
 automatically by the Wasp node so that the end users can use standard EVM tools like [MetaMask](https://metamask.io/).
 We only list the entry points not exposed through the JSON-RPC interface in this document.
 
-### `init()`
+### `registerERC20Coin`
 
-Called automatically when the ISC is deployed.
-
-Some parameters of the `evm` contract can be specified by passing them to the
-[`root` contract `init` entry point](root.md#init):
-
-- `evmg` (optional [`GenesisAlloc`](#genesisalloc)): The genesis allocation. The balance of all accounts must be 0.
-- `evmbk` (optional `int32` - default: keep all): Amount of EVM blocks to keep in the state.
-- `evmchid` (optional `uint16` - default: 1074): EVM chain iD
-
-  :::caution
-
-  Re-using an existing Chain ID is not recommended and can be a security risk. For serious usage, register a unique
-  Chain ID on [Chainlist](https://chainlist.org/) and use that instead of the default. **It is not possible to change
-  the EVM chain ID after deployment.**
-
-  :::
-
-- `evmw` (optional [`GasRatio`](./governance.md#ratio32) - default: `1:1`): The ISC to EVM gas ratio.
-
-### `registerERC20NativeToken`
-
-Registers an ERC20 contract to act as a proxy for the native tokens, at address
+Registers an ERC20 contract to act as a proxy for the L1 coin, at address
 `0x107402xxxxxxxx00000000000000000000000000`, where `xxxxxxxx` is the
-little-endian encoding of the foundry serial number.
+hash of the coin type. <!--TODO: Check this info-->
path: docs/content/iota-evm/references/core-contracts/evm.md
user: login: Dr-Electron
body: Resolved in 47a70a3
created_at: 2025-04-25T13:14:28Z
author_association: CONTRIBUTOR

PR comments:
user: login: vercel[bot]
created_at: 2025-03-14T09:29:33Z
body: [vc]: #p+Fq67DRO0FEc5MgIRDj8FvZMeHBJd50dgadA7atMAE=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJhcHBzLXVpLWtpdCIsInJvb3REaXJlY3RvcnkiOiJhcHBzL3VpLWtpdC8iLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiIn0sImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9pb3RhL2FwcHMtdWkta2l0L0FoSER3dUV2SkhhamozRFdiQUFteWF1UG5zamkiLCJuZXh0Q29tbWl0U3RhdHVzIjoiSUdOT1JFRCIsInByZXZpZXdVcmwiOiJhcHBzLXVpLWtpdC1naXQtZGV2eC13YXNwLXVwZGF0ZS1jb3JlLXJlZi1pb3RhMS52ZXJjZWwuYXBwIn0seyJuYW1lIjoid2FsbGV0LWRhc2hib2FyZCIsInJvb3REaXJlY3RvcnkiOiJhcHBzL3dhbGxldC1kYXNoYm9hcmQiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiIn0sImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9pb3RhL3dhbGxldC1kYXNoYm9hcmQvQ0dFNndIWDJ3QndKNXRxTVN6Z2V6YmVtN2VSWSIsIm5leHRDb21taXRTdGF0dXMiOiJJR05PUkVEIiwicHJldmlld1VybCI6IndhbGxldC1kYXNoYm9hcmQtZ2l0LWRldngtd2FzcC11cGRhdGUtY29yZS1yZWYtaW90YTEudmVyY2VsLmFwcCJ9LHsibmFtZSI6InJlYmFzZWQtZXhwbG9yZXIiLCJyb290RGlyZWN0b3J5IjoiYXBwcy9leHBsb3JlciIsImxpdmVGZWVkYmFjayI6eyJyZXNvbHZlZCI6MCwidW5yZXNvbHZlZCI6MCwidG90YWwiOjAsImxpbmsiOiIifSwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL2lvdGEvcmViYXNlZC1leHBsb3Jlci9HZ2pFTHVNRXpkeWN4SGd0QUp3NlE0ZHhhZ2QyIiwibmV4dENvbW1pdFN0YXR1cyI6IklHTk9SRUQiLCJwcmV2aWV3VXJsIjoicmViYXNlZC1leHBsb3Jlci1naXQtZGV2eC13YXNwLXVwZGF0ZS1jb3JlLXJlZi1pb3RhMS52ZXJjZWwuYXBwIn0seyJuYW1lIjoiYXBwcy1iYWNrZW5kIiwicm9vdERpcmVjdG9yeSI6ImFwcHMvYXBwcy1iYWNrZW5kIiwibGl2ZUZlZWRiYWNrIjp7InJlc29sdmVkIjowLCJ1bnJlc29sdmVkIjowLCJ0b3RhbCI6MCwibGluayI6IiJ9LCJpbnNwZWN0b3JVcmwiOiJodHRwczovL3ZlcmNlbC5jb20vaW90YS9hcHBzLWJhY2tlbmQvSFdXbmNkZ01rdG91NVB2M25uMlVXdzdxRFZZSCIsIm5leHRDb21taXRTdGF0dXMiOiJJR05PUkVEIiwicHJldmlld1VybCI6ImFwcHMtYmFja2VuZC1naXQtZGV2eC13YXNwLXVwZGF0ZS1jb3JlLXJlZi1pb3RhMS52ZXJjZWwuYXBwIn1dfQ==
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)


<details><summary>4 Skipped Deployments</summary>

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **apps-backend** | ⬜️ Ignored ([Inspect](https://vercel.com/iota/apps-backend/HWWncdgMktou5Pv3nn2UWw7qDVYH)) | [Visit Preview](https://apps-backend-git-devx-wasp-update-core-ref-iota1.vercel.app) |  | Apr 25, 2025 2:13pm |
| **apps-ui-kit** | ⬜️ Ignored ([Inspect](https://vercel.com/iota/apps-ui-kit/AhHDwuEvJHajj3DWbAAmyauPnsji)) | [Visit Preview](https://apps-ui-kit-git-devx-wasp-update-core-ref-iota1.vercel.app) |  | Apr 25, 2025 2:13pm |
| **rebased-explorer** | ⬜️ Ignored ([Inspect](https://vercel.com/iota/rebased-explorer/GgjELuMEzdycxHgtAJw6Q4dxagd2)) | [Visit Preview](https://rebased-explorer-git-devx-wasp-update-core-ref-iota1.vercel.app) |  | Apr 25, 2025 2:13pm |
| **wallet-dashboard** | ⬜️ Ignored ([Inspect](https://vercel.com/iota/wallet-dashboard/CGE6wHX2wBwJ5tqMSzgezbem7eRY)) | [Visit Preview](https://wallet-dashboard-git-devx-wasp-update-core-ref-iota1.vercel.app) |  | Apr 25, 2025 2:13pm |
</details>





author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-21T15:27:42Z
body: ✅ Vercel Preview Deployment is ready!

[View Preview](https://iota3-wiki-86224a49db5aefb63c2cbbbbdfdecbc9e1e90732-g0ux1x4ed.vercel.app)
author_association: CONTRIBUTOR
user: login: Dr-Electron
created_at: 2025-04-21T18:37:14Z
body: > Why does this PR update some many image files and snippets?

Sorry for my late reply. Somehow Github swallowed your message. But not sure what you are talking about. I see no issues here :trollface: 
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-25T13:20:23Z
body: ✅ Vercel Preview Deployment is ready!

[View Preview](https://iota3-wiki-86224a49db5aefb63c2cbbbbdfdecbc9e1e90732-pw91vlidf.vercel.app)
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-25T13:34:46Z
body: ✅ Vercel Preview Deployment is ready!

[View Preview](https://iota3-wiki-86224a49db5aefb63c2cbbbbdfdecbc9e1e90732-n5g86bkk6.vercel.app)
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-25T14:20:48Z
body: ✅ Vercel Preview Deployment is ready!

[View Preview](https://iota3-wiki-86224a49db5aefb63c2cbbbbdfdecbc9e1e90732-5v9zeaenw.vercel.app)
author_association: CONTRIBUTOR