Message Operations
resource: message — build a CCIP message and track its delivery
build
Builds the ABI-encoded Client.EVM2AnyMessage tuple and the tag-prefixed extraArgs
bytes a sender contract's ccipSend(...) call needs. Local, pure computation — no HTTP, no
RPC call. See CCIP Concepts for what these fields mean.
| Field | Type | Required | Description |
|---|---|---|---|
receiverAddress | text | ✓ Yes | Destination-chain recipient, 0x + 40 hex characters. |
payloadData | text | No | Arbitrary application payload, hex-encoded (0x... or bare hex). Omit for a pure token transfer. |
tokenAmounts | JSON array | No | [{"token":"0x...","amount":"1000000000000000000"}, ...]. Omit for a pure data message. |
feeToken | text | No | Fee token address. Omit/empty to pay in the native gas token. |
extraArgsVersion | select | No | v1 or genericV2 (default). See CCIP Concepts. |
gasLimit | number | No | Callback gas limit. Defaults to Chainlink's documented 200000. |
allowOutOfOrderExecution | boolean | No | Only meaningful for genericV2; ignored for v1. |
Example response:
{
"encodedMessage": "[\"0x...\",\"0x...\",[[\"0xToken\",\"1000000000000000000\"]],\"0x000...000\",\"0x181dcf10...\"]",
"extraArgsBytes": "0x181dcf10...",
"estimatedMessageId": ""
}
estimatedMessageId is always empty. The real CCIP messageId is
only assigned once ccipSend actually executes on-chain (a separate step, performed by the
Ethereum ExecutionNode). This operation cannot predict it in advance.
getStatus
Looks up a previously-sent message's delivery status. HTTP: GET /messages/{messageId} against
the CCIP API v2.
| Field | Type | Required | Description |
|---|---|---|---|
messageId | text | ✓ Yes | The CCIP message ID returned once ccipSend executed on-chain. |
Example response:
{
"messageId": "0xabc123...",
"executionState": "SUCCESS",
"sourceNetworkInfo": { "name": "ethereum-mainnet", "chainId": "1", "chainSelector": "5009297550715157269" },
"destNetworkInfo": { "name": "arbitrum-mainnet", "chainId": "42161", "chainSelector": "4949039107694359620" }
}
| executionState | Meaning |
|---|---|
UNTOUCHED | Not yet picked up on the destination chain. |
IN_PROGRESS | Being processed. |
SUCCESS | Delivered and executed successfully. |
FAILURE | Execution failed on the destination chain — see checkManualExecutionRequired below. |
Exact on-chain vocabulary, not remapped:
executionState is kept as the literal
on-chain MessageExecutionState enum name rather than translated to a BizFirst-specific term, so
it matches exactly what you'd see cross-referencing the CCIP Explorer.
checkManualExecutionRequired
Reports whether a message is eligible for manual re-execution. Derived from a
getStatus call internally — true exactly when
executionState == FAILURE.
| Field | Type | Required | Description |
|---|---|---|---|
messageId | text | ✓ Yes | Same message ID as getStatus. |
{ "manualExecutionRequired": true, "executionState": "FAILURE" }
Check only — does not perform manual execution. This operation tells you whether
re-execution is needed; it does not itself submit one. The real authorization/calldata shape for a manual
execution write was never confirmed during design review — see Roadmap.
getTokenTransferRateLimit
Prepares a call descriptor for reading a token's cross-chain transfer rate limit — not a resolved value, unlike every other operation on this page.
| Field | Type | Required | Description |
|---|---|---|---|
tokenAddress | text | ✓ Yes | Token contract address on the source chain. |
destinationChainSelector | text | ✓ Yes | CCIP chain selector of the destination chain (string — see Networks). |
{
"contractAddress": "0x...",
"functionName": "currentRateLimiterState",
"functionArgsJson": "[...]",
"rateLimitCapacity": null,
"rateLimitCurrent": null
}
No confirmed on-chain ABI. Unlike
router/isChainSupported/getFee,
no real TokenPool rate-limiter ABI was confirmed during design review, so this operation returns a
prepared contract address/function name/args descriptor rather than a resolved value —
rateLimitCapacity/rateLimitCurrent are typically null. Pass the
descriptor to the Ethereum ExecutionNode's own read-contract step to actually resolve it once the exact
getter is confirmed for your TokenPool version.