Portal Community

1. Send a Cross-Chain Token Transfer, End to End

Build a CCIP message, check the fee, then hand off to the Ethereum ExecutionNode to actually send it.

  1. Chainlink node: resource=router, operation=getFee, with your receiverAddress, tokenAmounts, and destinationChainSelector — confirm feeAmount is acceptable
  2. Chainlink node: resource=message, operation=build, same fields — get encodedMessage and extraArgsBytes
  3. Ethereum node: contract-write step calling ccipSend(destinationChainSelector, message) on the source chain's Router, using the previous step's output as the tuple argument, sending feeAmount as msg.value (native fee) or approving it first (ERC-20 fee)
  4. Capture the returned messageId from the transaction receipt for step 2 below
Why getFee before build: checking the fee first lets you branch (e.g. to an insufficient-balance error path) before spending gas building and sending a message you can't afford.

2. Poll a Sent Message Until It Delivers

  1. Store the messageId from Example 1 somewhere the workflow can re-read it (a variable, a queued job).
  2. On a schedule/retry loop: Chainlink node, resource=message, operation=getStatus, messageId={{messageId}}
  3. Condition node: branch on executionStateSUCCESS → continue; FAILURE → go to Example 3; otherwise → wait and retry
Tip: Space polls a few minutes apart — cross-chain finality on CCIP is not instant, and the lane/getLatency operation (Example 4) can tell you roughly how long to expect.

3. Detect and Flag a Failed Delivery for Manual Execution

  1. Chainlink node: resource=message, operation=checkManualExecutionRequired, messageId={{messageId}}
  2. Condition node: manualExecutionRequired == true
  3. If true, route to an alert/notification branch for a human to investigate and manually re-execute via the CCIP Explorer — this node cannot submit the manual execution itself (see Roadmap).

4. Check Lane Health Before Sending

  1. Chainlink node: resource=router, operation=isChainSupported, network={{sourceNetwork}}, destinationChainSelector={{destSelector}} — guard against sending to an unsupported chain
  2. Chainlink node: resource=lane, operation=getLatency, same selectors — show the user an expected delivery time estimate
  3. Chainlink node: resource=lane, operation=getRiskManagementStatus, chainSelector={{destSelector}} — warn (don't necessarily block) if the status isn't NORMAL

5. Convert a Chain Identifier Before Calling Another Node

A user picks a chain by its familiar native chain ID (e.g. 42161 for Arbitrum); a downstream Chainlink operation needs the CCIP chain selector instead.

  1. Chainlink node: resource=router, operation=convertChainSelector, nativeChainId={{userSelectedChainId}}
  2. Pass the returned chainSelector into any operation on this page that expects one.