Documentation

ICTT Hooks

Hooks for Inter-Chain Token Transfer functionality.

ICTT Hooks

BuilderKit provides hooks for handling Inter-Chain Token Transfer (ICTT) operations between Avalanche chains.

useICTT

The useICTT hook provides functions for transferring tokens between different Avalanche chains.

import { useICTT } from '@avalabs/builderkit';
 
const { 
  getInterchainMessenger,
  send,
  sendNative,
  getMessageId,
  getReceiveTransaction,
  getHomeHopMessageId
} = useICTT();
 
// Get messenger contract
const messenger = await getInterchainMessenger(43114);
 
// Send ERC20 tokens
const sendData = send(
  transferer,           // Transferer contract
  destinationChainHex,  // Destination chain ID in hex
  destTransferer,       // Destination transferer
  receiver,            // Recipient address
  feeTokenAddr,        // Fee token address
  amount,              // Amount to send
  decimals,            // Token decimals
  isMultiHop           // Whether this is a multi-hop transfer
);
 
// Send native token
const sendNativeData = sendNative(
  transferer,           // Transferer contract
  destinationChainHex,  // Destination chain ID in hex
  destTransferer,       // Destination transferer
  receiver,            // Recipient address
  feeTokenAddr,        // Fee token address
  amount,              // Amount to send
  decimals,            // Token decimals
  isMultiHop           // Whether this is a multi-hop transfer
);
 
// Get message ID from log
const messageId = getMessageId(txLog);
 
// Get receive transaction
const receiveData = await getReceiveTransaction(
  43114,              // Chain ID
  messageId           // Message ID
);
 
// Get home hop message ID
const hopMessageId = await getHomeHopMessageId(
  43114,              // Chain ID
  txHash              // Transaction hash
);

Available Functions

  • getInterchainMessenger(chain_id: number): Get messenger contract address
  • send(transferer: string, destination_L1_hex: string, destination_transferer: string, receiver: string, fee_token_addr: string, amount: BigNumber, decimals: number, is_multi_hop: boolean): Generate ERC20 transfer transaction
  • sendNative(transferer: string, destination_L1_hex: string, destination_transferer: string, receiver: string, fee_token_addr: string, amount: BigNumber, decimals: number, is_multi_hop: boolean): Generate native token transfer transaction
  • getMessageId(log: any): Extract message ID from transaction log
  • getReceiveTransaction(chain_id: number, message_id: string): Generate receive transaction
  • getHomeHopMessageId(chain_id: number, hash: string): Get message ID for home hop

Integration Example

function ICTTTransfer() {
  const { getInterchainMessenger, send, getMessageId } = useICTT();
  
  const handleTransfer = async () => {
    // Get messenger contract
    const messenger = await getInterchainMessenger(43114);
    
    // Generate transfer transaction
    const data = send(
      transfererContract,
      "0x0000000000000000000000000000000000000000000000000000000000002aef", // 43114 in hex
      destinationTransferer,
      receiverAddress,
      "0x0000000000000000000000000000000000000000", // Zero address for native fee
      new BigNumber("1.0"),
      18,
      false
    );
    
    return (
      <TransactionButton
        chain_id={43114}
        title="Transfer Tokens"
        description="Sending tokens cross-chain"
        data={data}
        onTransactionConfirmed={(receipt) => {
          const messageId = getMessageId(receipt.logs[0]);
          console.log('Transfer message ID:', messageId);
        }}
      />
    );
  };
  
  return (
    <div>
      {handleTransfer()}
    </div>
  );
}

Last updated on 3/10/2025

On this page

Privacy Policy

We respect your privacy and are committed to protecting your personal data. This privacy policy will inform you about how we look after your personal data and tell you about your privacy rights.

Read full policy