Docs
IntegrationsEVM

Overview

Deploy, connect and transfer interchain tokens from EVM chains.

On EVM chains, you use two contracts:

  • Interchain Token Service (ITS) (InterchainTokenService) registers tokens, deploys their token managers, and sends and receives transfers.
  • Interchain Token Factory (InterchainTokenFactory) has the functions most token deployers call: deploy an interchain token, register an existing token, and link custom tokens.
ContractAddress on most chains, mainnet and testnet
Interchain Token Service0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C
Interchain Token Factory0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66

The exceptions are on Chains and contracts. Token IDs, token managers and the ITS Hub are explained in How it works.

💡

Using an AI agent?

Copy this page with Copy Markdown at the top and give it to your agent, with the token you want to make interchain. The copied page links to the Markdown of the other pages it refers to, so the agent can read them too. Review what it writes, and test on testnet before mainnet.

Choose a path

You havePage
No token yetInterchain tokens
A token on one chainCanonical tokens
Your own token contracts on several chainsCustom tokens
A token connected to ITS, to send to another chainTransfers
A contract that should act on the tokens it receivesTransfers with data

Versions

Most EVM chains run ITS v2.1.x. Some newer chains run v2.2.0, which adds two functions:

Functionv2.1.xv2.2.0
interchainTransfer with metadata and gasValue (6 arguments)YesYes
interchainTransfer without them (4 arguments, gas from msg.value)NoYes
callContractWithInterchainTokenNoYes

These pages use the functions that work on both. A chain's version is the version of its InterchainTokenService in the deployment configs.

Setup

The examples on these pages use cast and these variables:

ITS=0xB5FB4BE02232B1bBA4dC8f81dc24C26980dE9e3C
FACTORY=0x83a93500d23Fbc3e82B410aD07A6a9F7A0670D66
RPC=<RPC URL of the chain you send from>
PK=<your private key>
ME=$(cast wallet address --private-key $PK)
FEE=<gas fee in wei, see Gas below>

To build contracts against ITS, install the package. Version 2.1.1 matches what most chains run:

# npm
npm install @axelar-network/interchain-token-service@2.1.1

# Foundry
forge install axelarnetwork/interchain-token-service@v2.1.1 axelarnetwork/axelar-gmp-sdk-solidity@v6.0.4

With Foundry, add remappings so the imports in these docs resolve:

@axelar-network/interchain-token-service/=lib/interchain-token-service/
@axelar-network/axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/

Chain names

ITS identifies chains by their Axelar name, such as binance or Avalanche. Names are listed on Axelarscan: mainnet | testnet.

ITS on EVM chains matches names exactly, including case: Avalanche and Ethereum are capitalized, binance isn't. A call with a name in the wrong case reverts with UntrustedChain.

Gas

Each call that reaches another chain sends a GMP message through the ITS Hub, and you pay its gas on the source chain. Most of those calls take a gasValue argument: send the same amount as the transaction value. The contract pays gasValue to the gas service out of its balance, and keeps any difference.

CallContractSends a messagePay
deployInterchainTokenFactoryNoNothing
deployRemoteInterchainTokenFactoryYesmsg.value = gasValue
deployRemoteInterchainTokenWithMinterFactoryYesmsg.value = gasValue
registerCanonicalInterchainTokenFactoryNoNothing
deployRemoteCanonicalInterchainTokenFactoryYesmsg.value = gasValue
registerTokenMetadataITSTo the hub onlymsg.value = gasValue
registerCustomTokenFactoryNoNothing
linkTokenFactoryYesmsg.value = gasValue
interchainTransfer (6 arguments)ITSYesmsg.value = gasValue
interchainTransfer on the tokenTokenYesmsg.value

Calls that send no message are payable only so they can be batched in a multicall. Send no value with them: it stays in the contract.

Estimate the fee off-chain, right before sending: see Estimate ITS fees. For registerTokenMetadata, estimate a message to the chain axelar. Unused gas is refunded to the account that sent the transaction (tx.origin).

Express currently doesn't work for ITS transfers.

Track a message

Messages go through the hub, so Axelarscan shows each as two: one to the chain axelar, and one from it to the destination. A metadata registration is one message, to the hub. Look the transaction up on Axelarscan (testnet). If it gets stuck, see Track and recover.

Next steps

Resources

On this page