Skip to main content
Version: 0.96.0

Token Transfer

Transfer tokens cross-chain using a four-step workflow: verify token support, estimate fees, send the transfer, and track execution.

Workflow

StepCommandPurpose
1. VerifygetSupportedTokensCheck token support on the lane
2. Estimatesend --only-get-feeGet fee quote
3. Sendsend --transfer-tokensExecute transfer
4. TrackshowMonitor execution

Prerequisites

Configure RPC endpoints and wallet:

Bash
.env
RPC_SEPOLIA=https://ethereum-sepolia-rpc.publicnode.com
RPC_ARB_SEPOLIA=https://arbitrum-sepolia-rpc.publicnode.com
USER_KEY=0xYourPrivateKeyHere

Required balances on source chain:

  • Tokens to transfer
  • Gas for source transaction
  • CCIP fee (native token or LINK)

Step 1: Verify Token Support

Check that your token is supported on the lane:

Bash
ccip-cli getSupportedTokens \
-n ethereum-testnet-sepolia \
-a 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59

Select a token to view its configuration:

═══ Token Details ═══
Address: 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05
Symbol: CCIP-BnM
Decimals: 18
Pool: 0x466D489b6d36E7E3b824ef491C225F5830E81cC1

═══ Remote Chains ═══
┌─────────────────────────────────────┬──────────────┬───────────────┐
│ Destination │ Rate Limit │ Available │
├─────────────────────────────────────┼──────────────┼───────────────┤
│ ethereum-testnet-sepolia-arbitrum-1 │ 10000.0/min │ 100% (10000) │
└─────────────────────────────────────┴──────────────┴───────────────┘

Verify:

FieldRequirement
DestinationTarget chain is listed
Rate LimitTransfer amount is within limit
AvailableCapacity exists for transfer

Query a specific token directly:

Bash
ccip-cli getSupportedTokens \
-n ethereum-testnet-sepolia \
-a 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-t 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05

Step 2: Estimate Fee

Get the fee quote before sending:

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xYourReceiverAddress \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--only-get-fee

Output:

Fee: 0.001234567890123456 ETH (native)

To get the fee in LINK:

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xYourReceiverAddress \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--fee-token LINK \
--only-get-fee

Step 3: Send Transfer

Single token

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xYourReceiverAddress \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--wallet ledger

Multiple tokens

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xYourReceiverAddress \
--transfer-tokens 0xToken1=1.0 \
--transfer-tokens 0xToken2=100.5 \
--wallet ledger

With message data

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xYourReceiverAddress \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--data "transfer-id:12345" \
--wallet ledger
Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xYourReceiverAddress \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--fee-token LINK \
--wallet ledger

With custom gas limit

For receivers with complex token handling:

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xYourReceiverAddress \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--gas-limit 500000 \
--wallet ledger

Step 4: Track Transfer

Check message status:

Bash
ccip-cli show 0xYourTransactionHash

Wait for execution to complete:

Bash
ccip-cli show 0xYourTransactionHash --wait

Or include --wait in the send command:

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xYourReceiverAddress \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--wallet ledger \
--wait

Example

Bash
# Verify token support
ccip-cli getSupportedTokens \
-n ethereum-testnet-sepolia \
-a 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-t 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05

# Estimate fee
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--fee-token LINK \
--only-get-fee

# Send transfer
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d ethereum-testnet-sepolia-arbitrum-1 \
--receiver 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--fee-token LINK \
--wallet ledger

# Track execution
ccip-cli show 0xabc123... --wait

Chain-Specific Behavior

Tokens transfer via Lock/Release or Burn/Mint pools. Receiver addresses use standard EVM format.

Token approvals:

The CLI handles approvals automatically. Use --approve-max for unlimited allowance:

Bash
--approve-max

Failures

For failed transfers, see Debugging Failed Messages.

IssueCauseSolution
Transfer stuckRate limiter depletedWait for refill or reduce amount
Execution failedInsufficient gasRetry with manualExec --gas-limit
Token not supportedToken not registeredUse a supported token
Insufficient allowanceApproval failedRun send again or approve manually

Token Amount Format

Specify amounts in human-readable format. The CLI converts to smallest units using the token's decimals.

InputInterpretation
1.01.0 tokens
0.50.5 tokens
100100 tokens

Multiple tokens:

Bash
--transfer-tokens 0xToken1=1.0 --transfer-tokens 0xToken2=50

Short form:

Bash
-t 0xToken1=1.0 -t 0xToken2=50