manual-exec
Manually execute pending or failed CCIP messages on the destination chain.
Synopsis
ccip-cli manual-exec <tx-hash-or-id> [options]
Aliases: manualExec
Description
The manual-exec command allows you to manually trigger the execution of a CCIP message that is stuck or has failed. It accepts either a source transaction hash or a CCIP message ID (32-byte hex). When given a transaction hash, it retrieves the original request from the source chain, calculates the merkle proof, and fetches any required offchain data. When given a message ID (with --api enabled, the default), it fetches execution inputs directly from the CCIP API, removing the need for source chain RPC access. In both cases, it submits the execution transaction to the destination chain.
Arguments
| Argument | Type | Required | Description |
|---|---|---|---|
<tx-hash-or-id> | string | Yes | Transaction hash of the original CCIP request, or a CCIP message ID (32-byte hex) |
Options
Message Selection
| Option | Type | Default | Description |
|---|---|---|---|
--log-index | number | - | Select a specific message by log index when multiple messages exist in one transaction |
Gas Options
| Option | Alias | Type | Default | Description |
|---|---|---|---|---|
--gas-limit | -L, --compute-units | number | - | Override gas limit for receiver callback. 0 keeps the original request value. |
--tokens-gas-limit | - | number | - | Override gas limit for token pool releaseOrMint calls. 0 keeps original. |
--estimate-gas-limit | - | number | - | Estimate gas limit with percentage margin (e.g., 10 for +10%). Conflicts with --gas-limit. |
Wallet
| Option | Alias | Type | Description |
|---|---|---|---|
--wallet | -w | string | Wallet for signing transactions. See Configuration. |
Solana-Specific Options
| Option | Type | Default | Description |
|---|---|---|---|
--force-buffer | boolean | - | Use buffer for messages too large for a single transaction. |
--force-lookup-table | boolean | - | Create a lookup table for accounts to fit in transaction. |
--clear-leftover-accounts | boolean | - | Clear buffers or lookup tables from previous attempts. |
Sui-Specific Options
| Option | Type | Default | Description |
|---|---|---|---|
--receiver-object-ids | string[] | - | Receiver object IDs for Sui execution (e.g., 0xabc...). |
See Configuration for global options (--rpcs, --format, etc.).
Command Builder
Build your manual-exec command interactively:
Unknown command: manual-exec
Available commands: send, show, manual-exec
When to Use
Manual execution is needed when:
| Scenario | Description |
|---|---|
| Message stuck pending | DON hasn't executed it within expected timeframe |
| Previous execution failed | Need to retry with different gas parameters |
| Out-of-order execution blocked | Earlier message in sender queue failed |
Manual execution requires the message to be committed but not yet executed. Attempting to manually execute an already-executed message will fail.
Examples
Execute by transaction hash
ccip-cli manual-exec 0xafd36a0b99d5457e403c918194cb69cd070d991dcbadc99576acfce5020c0b6b \
--rpc https://eth-sepolia.example.com \
--rpc https://arb-sepolia.example.com \
--wallet ledger
Execute by message ID
When the CCIP API is available (default), you can pass a message ID instead of a transaction hash. This only requires a destination chain RPC:
ccip-cli manual-exec 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef \
--rpc https://arb-sepolia.example.com \
--wallet ledger
Override gas limit
ccip-cli manual-exec 0xabc123... \
--gas-limit 500000 \
--wallet ledger
Estimate and apply gas limit with margin
ccip-cli manual-exec 0xabc123... \
--estimate-gas-limit 15 \
--wallet ledger
Solana execution with buffer
For large messages on Solana:
ccip-cli manual-exec 0xabc123... \
--wallet ledger \
--gas-limit 500000 \
--force-buffer \
--clear-leftover-accounts
Sui execution with receiver objects
For Sui destinations that require receiver object IDs:
ccip-cli manual-exec 0xabc123... \
--wallet ledger \
--receiver-object-ids 0xabc... 0xdef...
Execution Flow
When given a transaction hash:
- Fetches the original request from the source chain
- Retrieves the commit report (verifications) from the destination chain
- Optionally estimates gas limit (when
--estimate-gas-limitis used) - Builds execution input (calculates merkle proof, fetches offchain token data like CCTP attestations)
- Loads wallet and submits the execution transaction to the destination chain
When given a message ID (with --api enabled, the default):
- Fetches execution inputs (proofs, verifications, offchain token data) from the CCIP API
- Optionally estimates gas limit (when
--estimate-gas-limitis used) - Loads wallet and submits the execution transaction to the destination chain
The message ID path is simpler because it delegates proof calculation to the API, removing the need for source chain RPC access.
Solana Considerations
Solana transactions have size limits. For large messages:
| Step | Option | Description |
|---|---|---|
| 1 | --force-buffer | Sends report in chunks |
| 2 | --force-lookup-table | Creates address lookup table for accounts |
| 3 | --clear-leftover-accounts | Cleans up from aborted attempts |
After successful execution, buffers auto-clear. Lookup tables require a grace period before deletion.
See Also
- show - Check message status before executing
- Configuration - Wallet setup
Exit Codes
| Code | Meaning |
|---|---|
0 | Success - execution transaction submitted |
1 | Error (network failure, execution failed, invalid arguments) |
Use in scripts:
ccip-cli manual-exec $TX_HASH --wallet ledger --format json || exit $?