IntroductionCosmos GMPSolidity UtilitiesSandboxGlossary
InterchainTokenServiceInterchainTokenFactoryTokenManagerAxelarGateway AxelarGasServiceAxelarExecutableAxelarJS SDK
Crosschain Message FlowaxlUSDCSecurity OverviewInterchain Transaction DurationEVM Contract Governance

Create a New Interchain Token

The Token Whitelisting for Squid Router form is now live! Download the repo, install dependencies, and npm run wizard on the command line to access the interactive form through the wizard.

Interchain tokens are ERC-20 tokens that are available on multiple blockchains. They are created using the Interchain Token Service and can be used to transfer value between blockchains.

The Interchain Token Service is deployed to 0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C while the Interchain Token Factory is deployed to 0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66.

You can create a new Interchain Token through the Interchain Portal, or by building a custom ERC-20 token and deploying it with a Mint/Burn token manager on all chains. These tokens will be accessible on multiple chains, allowing for seamless interaction on each chain by utilizing familiar methods such as send, transfer, and approve — just as with any standard ERC-20 token.

🚨

NOTE: The security of your token is limited to the security of the chains it integrates with. Since blockchains can have different security practices, we recommend doing due diligence on all chains your token will be deployed to.

Create a new Interchain Token using the Interchain Token Portal

The simplest way to create an Interchain Token is to do so through the portal:

  1. Visit the Interchain Portal.
  2. Connect your wallet.
  3. Select a source network where you have funds available.
  4. Select the option to deploy a new Interchain token.
  5. Add the required details for your new token:
    • Name
    • Symbol
    • Decimals
    • Amount to mint
      • You can also choose the advanced option where you can add an account as Token Minter and Salt value. Otherwise, these fields will be prefilled with the deployer (connected account) address and a random, uniquely generated salt value.
  6. Select additional chains for your token’s availability. You can optionally add the token amount to mint on each selected chain.

Congratulations! Your new Interchain Token is now available on multiple chains. Furthermore, it follows the Interchain Token Standard, meaning that users can call the interchainTransfer() method on the token itself to transfer between blockchains.

Refer to the four-step tutorial for more detailed steps on creating Interchain Tokens using the Interchain Token Portal.

💡

Make sure you consider all relevant stakeholders before deploying a token through ITS. Creating a simple token using the ITS Portal will give the token the same name and symbol on all chains. If you need your token to have different names or symbols on different chains, you’ll have to build a custom token.

Create a custom Interchain Token

If you want your token to have more features than the standard Interchain Token, you can create a custom token. With these tokens, you can specify minting policies, ownership structures, rate limits, and other bespoke functionality.

To create a custom Interchain Token:

  1. Build your ERC-20 token and deploy it on multiple chains.
  2. Deploy a Mint/Burn - Token Manager for existing tokens on all chains using the deployTokenManager() method on the Interchain Token Service specifying parameters like salt, destinationChain, tokenManagerType, params, and gasValue.
  3. Ensure that the Interchain Token Service can invoke the Mint/Burn functions on the token by calling transferMintership() on your token. This will transfer the minter role to the ITS on all chains, enabling it to mint or burn tokens.
    • Repeat this step on all other chains where the token exists, using the same deployer address and salt.
  4. Transfer Interchain Tokens between chains via the Interchain Token Service by calling interchainTransfer().
/**
 * @notice Used to deploy TokenManagers.
 * @dev At least the `gasValue` amount of native token must be passed to the function call. `gasValue` exists because this function can be
 * part of a multicall involving multiple functions that could make remote contract calls.
 * @param salt The salt to be used during deployment.
 * @param destinationChain The name of the chain to deploy the TokenManager and standardized token to.
 * @param tokenManagerType The type of TokenManager to be deployed.
 * @param params The params that will be used to initialize the TokenManager.
 * @param gasValue The amount of native tokens to be used to pay for gas for the remote deployment.
 * @return tokenId The tokenId corresponding to the deployed TokenManager.
 */
function deployTokenManager(
    bytes32 salt,
    string calldata destinationChain,
    TokenManagerType tokenManagerType,
    bytes calldata params,
    uint256 gasValue
) external payable

To create the params that will be used to initialize the Token Manager in the deployTokenManager method above, you can use the Online Ethereum ABI Encoder specifying the operator of the Token Manager and the token address with the argument type bytes and address respectively.

Tokens can move between chains seamlessly, as the Token Manager contracts will mint and burn tokens as needed. If the minter parameter consists of empty bytes when deploying a new Interchain Token, use a Mint/Burn TokenManager. Otherwise, use a Lock/Unlock TokenManager. Call transferMintership() on the token to change the token minter to another address.

If you want to build a token with the IInterchainToken feature yourself, make sure that your token implements the IInterchainTokenStandard interface so you can offer the interchainTransfer() and interchainTransferFrom() methods directly on it.

Once you have designed an Interchain Token, you can deploy it to multiple chains using a tool such as the Constant Address Deployer to give it the same address everywhere.

What’s next

For further examples utilizing the Interchain Token Service, check out the axelar-examples repo on GitHub.

Edit this page