GitHub: InitiaCustomERC20

Overview

The InitiaCustomERC20 contract is a custom implementation of the ERC20 token standard. It includes additional access control mechanisms, registry functionalities, to allow for better integration with the rollup’s underlying Cosmos SDK stack.

This is the main ERC20 token contract that developers should use to create their own custom ERC20 tokens on the MiniEVM.

Inheritance

  • IERC20: Interface for ERC20 standard functions.
  • Ownable: Provides ownership control.
  • ERC20Registry: Handles ERC20 registry functionalities.
  • ERC165: Supports interface identification.
  • ERC20ACL: Provides access control mechanisms.

State Variables

  • mapping(address => uint256) public balanceOf: Tracks the balance of each address.
  • mapping(address => mapping(address => uint256)) public allowance: Tracks the allowance each address has given to another address.
  • string public name: The name of the token.
  • string public symbol: The symbol of the token.
  • uint8 public decimals: The number of decimals the token uses.
  • uint256 public totalSupply: The total supply of the token.

Constructor

Initializes the contract with the token’s name, symbol, and decimals. It also registers the ERC20 token with the ERC20Registry.

constructor(string memory _name, string memory _symbol, uint8 _decimals) register_erc20 {
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
}

Parameters

NameTypeDescription
_namestring memoryThe name of the token
_symbolstring memoryThe symbol of the token
_decimalsuint8The number of decimals the token uses

Functions

supportsInterface

Checks if the contract supports a given interface.

function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool)

Parameters

NameTypeDescription
interfaceIdbytes4The interface identifier

Returns

TypeDescription
booltrue if the interface is supported, false otherwise

_transfer

Transfers tokens from one address to another and registers the recipient’s ERC20 store if necessary.

function _transfer(address sender, address recipient, uint256 amount) internal register_erc20_store(recipient)

Parameters

NameTypeDescription
senderaddressThe address sending the tokens
recipientaddressThe address receiving the tokens
amountuint256The amount of tokens to transfer

_mint

Mints new tokens and assigns them to an address, registering the recipient’s ERC20 store if necessary.

function _mint(address to, uint256 amount) internal register_erc20_store(to)

Parameters

NameTypeDescription
toaddressThe address receiving the tokens
amountuint256The amount of tokens to mint

_burn

Burns tokens from an address.

function _burn(address from, uint256 amount) internal

Parameters

NameTypeDescription
fromaddressThe address whose tokens are burned
amountuint256The amount of tokens to burn

transfer

Transfers tokens to a recipient, ensuring the recipient is not a blocked address.

function transfer(address recipient, uint256 amount) external transferable(recipient) returns (bool)

Parameters

NameTypeDescription
recipientaddressThe address receiving the tokens
amountuint256The amount of tokens to transfer

Returns

TypeDescription
booltrue if the transfer was successful

approve

Approves an address to spend a specified amount of tokens on behalf of the caller.

function approve(address spender, uint256 amount) external returns (bool)

Parameters

NameTypeDescription
spenderaddressThe address allowed to spend the tokens
amountuint256The amount of tokens to approve

Returns

TypeDescription
booltrue if the approval was successful

transferFrom

Transfers tokens from one address to another on behalf of the sender, ensuring the recipient is not a blocked address.

function transferFrom(address sender, address recipient, uint256 amount) external transferable(recipient) returns (bool)

Parameters

NameTypeDescription
senderaddressThe address sending the tokens
recipientaddressThe address receiving the tokens
amountuint256The amount of tokens to transfer

Returns

TypeDescription
booltrue if the transfer was successful

mint

Mints new tokens to a specified address, ensuring the recipient is not a blocked address. This function can only be called by the owner.

function mint(address to, uint256 amount) external mintable(to) onlyOwner

Parameters

NameTypeDescription
toaddressThe address receiving the tokens
amountuint256The amount of tokens to mint

burn

Burns tokens from a specified address, ensuring the sender is not a module address. This function can only be called by the owner.

function burn(address from, uint256 amount) external burnable(from) onlyOwner

Parameters

NameTypeDescription
fromaddressThe address whose tokens are burned
amountuint256The amount of tokens to burn

sudoTransfer

Transfers tokens from one address to another, bypassing the usual access control checks. This function can only be called by the chain signer.

function sudoTransfer(address sender, address recipient, uint256 amount) external onlyChain

Parameters

NameTypeDescription
senderaddressThe address sending the tokens
recipientaddressThe address receiving the tokens
amountuint256The amount of tokens to transfer