Skip to main content
Version: 1.1.1

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

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

OptionAliasTypeDefaultDescription
--receiver--tostring-Receiver address on destination. Defaults to sender if same chain family. Required for cross-family transfers.
--data-string-Message data payload. Non-hex strings are UTF-8 encoded automatically. Hex strings (0x...) are used as-is.
--transfer-tokens-tstring[]-Token transfers as token=amount. See Token Amount Format.
--fee-token-stringNativeFee token address or symbol (e.g., LINK). Omit to pay in native token.

Gas & Execution

OptionAliasTypeDefaultDescription
--gas-limit-L, --compute-unitsnumber-Gas limit for receiver callback. See Gas Limit Behavior.
--estimate-gas-limit-number-Estimate gas limit with % margin (e.g., 10 for +10%). Conflicts with --gas-limit.
--allow-out-of-order-exec--ooobooleantrueAllow out-of-order execution. Supported on v1.5+ lanes.

Extra Args

OptionAliasTypeDescription
--extra-xstring[]Extra args as key=value. Values parsed as JSON with BigInt support; fallback to string. Repeated keys become arrays.
note

Extra args fields like blockConfirmations, ccvs, ccvArgs, executor, executorArgs, tokenReceiver, and tokenArgs require CCIP v2+ lanes (GenericExtraArgsV3). Using them on older lanes will fail. The SDK auto-detects V3 when any V3-only field is present. Check your lane version in the CCIP Directory.

Array fields with a single element

For array fields (ccvs, ccvArgs, tokenArgs), repeating a key creates an array automatically: -x ccvs=0xA -x ccvs=0xB produces ["0xA", "0xB"]. However, a single value is treated as a string, not an array. If your array has exactly one element, you must use the JSON array syntax:

Bash
# WRONG — produces string "0xVerifier1", not an array
-x ccvs=0xVerifier1

# CORRECT — produces ["0xVerifier1"]
-x ccvs='["0xVerifier1"]'

--extra values override values set by other flags. For example, --gas-limit 100000 -x gasLimit=200000 uses 200000.

Chain-Specific

OptionAliasTypeDescription
--token-receiver-stringSolana token receiver address if different from program receiver. Required when sending tokens + data to Solana.
--account--receiver-object-idstring[]Solana accounts (append =rw for writable) or Sui receiver object IDs.

Wallet

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

Dry-Run

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

Other

OptionTypeDefaultDescription
--waitbooleanfalseWait for finality, commit, and 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)

Extra args as key=value (e.g., blockConfirmations=5). Requires CCIP v2+ lanes for V3 fields.

Gas & Execution

Control gas limits and execution behavior

Gas limit for receiver callback. Defaults to 200k when data present, 0 for token-only. 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

RPC Configuration

Configure blockchain RPC connections

List of RPC endpoint URLs (ws[s] or http[s])

File containing RPC endpoints (reads RPC_* environment variables)

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

Token Amount Format

The --transfer-tokens / -t option accepts token=amount pairs. The CLI converts human-readable amounts to smallest units using the token's decimals.

Bash
# Single token (1.5 tokens)
-t 0xTokenAddress=1.5

# Multiple tokens
-t 0xToken1=1.0 -t 0xToken2=50

# By symbol (if resolvable on source chain)
-t USDC=100

Gas Limit Behavior

Token-only transfers don't need a gas limit

If you're sending tokens without --data, the gas limit defaults to 0 — no receiver callback is executed, and the tokens are delivered directly. Only set --gas-limit or --estimate-gas-limit when your receiver contract processes the message in ccipReceive.

When --data is present and --gas-limit is omitted, the SDK applies a default of 200,000 for EVM and Solana destinations, or 1,000,000 for Sui. If your receiver needs more gas, set it explicitly or use --estimate-gas-limit to auto-calculate with a margin.

Lane-Specific Parameters

OptionEVM→EVMEVM→SolanaSolana→EVMEVM→Sui
--gas-limit / -LGas limit for ccipReceiveCompute unitsGas limitGas limit
--estimate-gas-limitAuto-estimate + % marginAuto-estimateAuto-estimate-
--token-receiverv2+ lanes only (--extra)Required if tokens + data-Optional
--account-Receiver accounts (append =rw)-Receiver object IDs
--oooDefault: trueDefault: trueDefault: trueDefault: true
--extra / -xv2+ lanes only---

Examples

Send a data message

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

Transfer tokens

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
-t 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=0.1 \
--fee-token LINK

Programmable token transfer (tokens + data)

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
-t 0xFd57b4ddBf88a4e07fF4e34C487b99af2Fe82a05=1.0 \
--data "deposit:pool-123" \
--estimate-gas-limit 15

Check fee without sending

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

EVM to Solana

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d solana-devnet \
--to <SOLANA_PROGRAM_ADDRESS> \
--token-receiver <SOLANA_TOKEN_ACCOUNT> \
--account <ACCOUNT_1> \
--account <ACCOUNT_2>=rw \
-t 0xToken=1.0 \
--data "instruction-data" \
--wallet ledger

Solana to EVM

Bash
ccip-cli send \
-s solana-devnet \
-r <SOLANA_ROUTER> \
-d ethereum-testnet-sepolia \
--to 0xReceiverContract \
-t <SPL_TOKEN_MINT>=1.0 \
--wallet ledger

EVM to Sui

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
-d sui-testnet \
--to 0xSuiReceiverAddress \
--account 0xObjectId1 \
--account 0xObjectId2 \
-t 0xToken=1.0 \
--wallet ledger

Extra args (CCIP v2+ lanes)

Bash
ccip-cli send \
-s ethereum-testnet-sepolia \
-d arbitrum-sepolia \
-r 0x0BF3dE8c5D3e8A2B34D2BEeB17ABfCeBaf363A59 \
--to 0xAB4f961939BFE6A93567cC57C59eEd7084CE2131 \
--data "hello world" \
-x blockConfirmations=5 \
-x ccvs='["0xVerifier1"]' \
-x executor=0xExecutorAddress

Send and wait for execution

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

See Also

Exit Codes

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