Skip to main content
Version: 0.96.0

send

Supported chain families:
EVM iconEVMSolana iconSolanaAptos iconAptos

Send a CCIP message from a source chain to a destination chain.

Synopsis

Bash
ccip-cli send -s <source> -d <dest> -r <router> [options]

Description

The send command constructs and submits a CCIP message to transfer data and/or tokens between blockchains. It handles fee calculation, token approvals, and transaction submission.

Options

Required Options

OptionAliasTypeDescription
--source-sstringSource network (chain ID, selector, or name)
--dest-dstringDestination network (chain ID, selector, or name)
--router-rstringCCIP Router contract address on source chain

Message Options

OptionAliasTypeDefaultDescription
--receiver--tostring-Receiver address on destination. Defaults to sender if same chain family. Required for cross-family transfers.
--data-string-Message data. Non-hex strings are UTF-8 encoded. Optional.
--transfer-tokens-tstring[]-Token transfers in format 0xTokenAddr=amount. Can be specified multiple times.
--fee-token-stringNativeFee token address or symbol (e.g., LINK). Omit to pay in native token.

Gas Options

OptionAliasTypeDefaultDescription
--gas-limit-L, --compute-unitsnumber-Gas limit for receiver callback. Defaults to ramp config (~200k) if not specified.
--estimate-gas-limit-number-Estimate gas limit with a percentage margin (e.g., 10 for +10%). Conflicts with --gas-limit.
--allow-out-of-order-exec--ooobooleanfalseAllow out-of-order execution. Required for some destinations. Only v1.5+ lanes.

Wallet Options

OptionAliasTypeDescription
--wallet-wstringWallet source. See Configuration.
--approve-max-booleanApprove maximum token allowance instead of exact amount needed.

Solana-Specific Options

OptionAliasTypeDescription
--token-receiver-stringToken receiver address if different from program receiver.
--account--receiver-object-idstring[]Additional accounts for receiver program. Append =rw for writable accounts.

Dry-Run Options

OptionTypeDescription
--only-get-feebooleanPrint the fee and exit without sending.
--only-estimatebooleanPrint gas estimate and exit without sending. Requires --estimate-gas-limit.

Execution Options

OptionTypeDefaultDescription
--waitbooleanfalseWait for finality, commit, and first execution before returning.

See Configuration for global options (--rpcs, --rpcs-file, --format, --no-api, etc.).

Command Builder

Build your send command interactively:

ccip-cli send Builder

Send a CCIP message from source to destination chain

Message Options

Configure the CCIP message payload

Receiver address on destination. Defaults to sender if same chain family.

Message data (hex or UTF-8 text)

Token transfers (format: 0xTokenAddr=amount)

Token to pay fees (omit for native)

Gas & Execution

Control gas limits and execution behavior

Gas limit for receiver callback. Defaults to ramp config (~200k) if not specified. Alias: --compute-units

Estimate gas limit with margin % (e.g., 10 for +10%). Conflicts with --gas-limit.

Allow out-of-order execution (v1.5+ lanes only)

Solana Options

Options specific to Solana chains

Solana token receiver (if different from program receiver)

Solana accounts (append =rw for writable) or Sui object IDs

Wallet & Transaction

Configure wallet and transaction settings

Wallet source: ledger[:index], trezor[:index], or private key in USER_KEY env var

Approve max token allowance instead of exact amount

Output Options

Control command output format

Print fee and exit without sending

Print gas estimate and exit without sending. Requires --estimate-gas-limit.

Wait for message execution on destination chain

Format for command output

Enable debug logging

Fill in required fields to generate command
Generated Command
ccip-cli send --rpcs-file ./.env --format pretty

Examples

Send a simple message

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--data "hello world"

Send with token transfer

Bash
ccip-cli send \
-s 11155111 \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--transfer-tokens 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=0.1 \
--fee-token 0x779877A7B0D9E8603169DdbD7836e478b4624789
Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--data 0x1234abcd \
--gas-limit 300000 \
--fee-token LINK

Estimate gas before sending

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--data 0x1234abcd \
--estimate-gas-limit 10

Check fee without sending

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--only-get-fee

Use Ledger hardware wallet

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--wallet ledger

Send and wait for execution

Send a message and wait until it's fully executed on the destination:

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--data "hello world" \
--wait

Token Transfer Format

The --transfer-tokens option accepts pairs of address=amount:

ComponentDescription
AddressToken contract address on source chain
AmountHuman-readable amount (converted using decimals)
Bash
# Transfer 0.1 USDC (6 decimals) = 100000 smallest units
--transfer-tokens 0xTokenAddress=0.1

# Multiple tokens
--transfer-tokens 0xToken1=1.5 --transfer-tokens 0xToken2=100

See Also

Exit Codes

CodeMeaning
0Success - transaction submitted (or fee/estimate returned for dry-run)
1Error (network failure, transaction reverted, invalid arguments)

Use in CI/CD:

Bash
ccip-cli send -s $SOURCE -d $DEST -r $ROUTER --format json --only-get-fee || exit $?