Docs
How it works

Concepts

Token IDs, the kinds of interchain token, and the token managers that connect tokens to ITS.

Contracts

  • Interchain Token Service (ITS). A contract on each connected chain, sometimes called the ITS edge contract. It registers tokens, deploys token managers, and sends and receives transfers as GMP messages. Implementations: EVM, Solana, Sui, Stellar. On XRPL, Axelar's multisig account plays this role.
  • Interchain Token Factory. A contract next to ITS on EVM chains, with the functions most token deployers use: deploy an interchain token, register a canonical token, link custom tokens.
  • ITS Hub. A contract on the Axelar network that every transfer goes through. See ITS Hub.
  • Token manager. A contract that ITS deploys for each token on each chain, which mints and burns, or locks and unlocks, the token. See Token managers.

Token ID

Every token connected to ITS has a token ID, a bytes32 that's the same on every chain. A transfer of a token ID on one chain arrives as the token with the same ID on the destination chain.

The ID is fixed when the token is first registered, on its origin chain. On EVM, the Interchain Token Factory derives it from the origin chain's name, the deployer's address and a salt (or, for a canonical token, the token's address). The same deployer and salt give a different ID on another chain. The factory computes the IDs of the tokens it deploys or registers on its chain:

TokenFactory function
An interchain token you deployed with a saltinterchainTokenId(deployer, salt)
A canonical token, from its address on its home chaincanonicalInterchainTokenId(tokenAddress)
A custom token you registered and linked with a saltlinkedTokenId(deployer, salt)

Call them on the origin chain to get the ID before you deploy. Other chains derive IDs their own way.

Kinds of token

  • Interchain token. A token contract that ITS deploys, InterchainToken, with the same name, symbol and ID on every chain. Its token managers mint and burn it. It can have a minter of your choice, or none.
  • Canonical token. An existing token on one chain, its home chain, registered with ITS. It's locked on its home chain when it's sent out, and unlocked when it comes back. On every other chain, ITS deploys an interchain token for it, with no minter. Examples: USDT, WETH, WBTC and PAXG from Ethereum, WAVAX from Avalanche, WBNB from BNB Chain, SAUCE from Hedera and wrapped SOL from Solana.
  • Custom token. Your own token contracts on several chains, linked under one token ID. Each keeps its own name, symbol and logic, and you choose how ITS handles it on each chain by its token manager type.

Token managers

A token manager connects one token to ITS on one chain: ITS calls it to take the tokens of an outgoing transfer, and to give out the tokens of an incoming one. On EVM chains and Solana, it also holds the token's flow limit on that chain, and its operator and flow limiters; on Sui and Stellar, ITS keeps them.

Its type sets how it handles the token (ITokenManagerType):

TypeValueOutgoingIncomingThe token must
NATIVE_INTERCHAIN_TOKEN0BurnMintBe an interchain token. Reserved for tokens ITS deploys
MINT_BURN_FROM1burnFromMintLet the token manager mint, and burn with an approval from the sender
LOCK_UNLOCK2LockUnlockNothing; the token manager holds the locked tokens. The sender approves ITS to transfer them
LOCK_UNLOCK_FEE3LockUnlockSame as LOCK_UNLOCK, for tokens that take a fee on transfer. ITS accounts for the amount actually received
MINT_BURN4BurnMintLet the token manager mint and burn

Other chains support some of these types: Stellar has all but LOCK_UNLOCK_FEE, and on Sui you can link a coin as LOCK_UNLOCK or MINT_BURN. See each chain's integration pages.

Use lock and unlock on at most one chain, the token's home chain, where its supply lives. On other chains, use a mint and burn type, so tokens are created as they arrive and destroyed as they leave.

ITS moves tokens through a separate contract, the TokenHandler. For an interchain token, ITS makes the token manager a minter right after deploying it.

On this page