All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- SDK/CLI: Add
sourceTokenAddresssearch filter tosearchMessagesand--source-tokenCLI option for filtering messages by source token - CLI: Clean JSON output — data on stdout, diagnostics on stderr, single JSON envelope per command
- SDK/CLI: Add
--no-interactivemode to disable all prompts for AI agents and automation, with auto-detection of non-TTY stdin - SDK: add Fast Confirmation Rule (FCR) / SAFE finality support to CCIP v2.0 (preview) lanes:
LaneFeatures.MIN_BLOCK_CONFIRMATIONSrenamed toFINALITY_FAST;CUSTOM_BLOCK_CONFIRMATIONS_RATE_LIMITSrenamed toFAST_RATE_LIMITS; newFINALITY_SAFEkey addedGenericExtraArgsV3.blockConfirmations: numberreplaced withfinality: 'finalized' | 'safe' | number
- SDK: export
encodeFinality,decodeFinalityAllowed(), anddecodeFinalityRequested()for encoding/decoding the 4-byte finality field in v2.0 extraArgs
- SDK: Add
Chain.getTokenPrice({ router, token, destChainSelector })to fetch on-chain USD token prices from FeeQuoter (v1.6+) or PriceRegistry (v1.2/v1.5) — implemented for EVM, Solana, and Aptos. - CLI: Show fee tokens prices in
get-supported-tokens --fee-tokensoutput, enabled by default now (can be disabled with--no-fee-tokens, and shown alone with--only-fee-tokens)
- SDK: Add
EVMChain.getTotalFeesEstimatemethod, to provide a fee and tokens bps (v2.0) breakdown - CLI: add
search messagescommand to query CCIP messages via API with filters (sender, receiver, chains, manual-exec) and interactive result inspector - SDK: Breaking: remove
getMessagesForSender— useCCIPAPIClient.searchAllMessages({ sender })instead
- CLI: add shell completion support (
ccip-cli completion) for bash and zsh - SDK: add
CCIPAPIClient.searchMessageswith filters and cursor-based pagination,searchAllMessagesasync generator for automatic pagination, andAbortSignalsupport on all API methods - SDK:
Chain.estimateReceiveExecutioncan now take amessageIdand try to fetch messages details from API - SDK:
Chain.generateUnsignedExecuteandexecuteautomatically try toestimateReceiveExecutionif supported by dest chain and nogasLimitoverride is provided - CLI: add
--wallet hardhat:<name>and--wallet foundry:<name>keystore support for EVM
- SDK:
getFeeTokensnow supports CCIP v2.0 lanes (via FeeQuoter, same as v1.6) - SDK: implemented
CCIPAPIClient.getExecutionInput(messageId: string) - SDK:
dest.executeanddest.generateUnsignedExecutecan now execute directly from amessageId, without the need for an explicitsource.getExecutionInput - SDK:
Chainconstructors context can receive a string URL forapiClient - CLI: using all the above,
manual-execnow can receive amessageIdas positional argument (besidestxHash), and execute from CCIP-API's/execution-inputswithout needing a source RPC - SDK: add TokenPool v2 support to
getTokenPoolRemotes(customBlockConfirmations[Out|In]boundRateLimiterState) andgetTokenPoolConfig(minBlockConfirmations) - CLI: add
minBlockConfirmationsand[ftf]rate limiter state info toget-supported-tokenscommand output - CLI: add
send --extra/-x key=valueparam to pass arbitraryextraArgstosendmessages
- SDK:
getOffchainTokenDatanow uses CCTPv2 API for USDC transfers; can be called from eithersourceordest - SDK:
request.txdoesn't require all txlogsanymore;Log_type renamed toChainLog - SDK: Fix browser "Illegal invocation" error by binding
globalThis.fetchinCCIPAPIClientconstructor - CLI: allow passing
--api=<url>(CCIP-API still can be disabled with--no-apior--api=false)
- SDK: v2.0 support:
- new
Chain.getExecutionInputmethod, which consolidatesgetMessagesInBatch,calculateManualExecProofandgetOffchainTokenData - Breaking: rename
generateUnsignedExecuteReport,executeReporttogenerateUnsignedExecute,execute - Breaking:
generateUnsignedExecute,executereceivesinput: ExecutionInputinstead ofexecReport - Breaking: rename
Chain.getCommitReporttogetValidations - Breaking: deprecate
Chain.getCommitStoreForOffRamp: needed, available and used internally only inEVMChain;getVerifications(fkagetCommitReport) now receivesoffRampaddress instead ofcommitStore
- new
- SDK: Breaking: Reduce bundle size by eliminating cross-chain imports
- Move
DEFAULT_GAS_LIMITfromevm/const.tstoshared/constants.ts - Move BCS codecs and encoding utils to
shared/bcs-codecs.ts(shared by Aptos/Sui) - Remove
DEFAULT_APPROVE_GAS_LIMIT(unused) - Non-EVM chains no longer bundle EVM ABIs (~500KB savings per chain)
- Sui no longer bundles Aptos code (~300KB savings)
- Move
- API: make
CCIPAPIClient.fromUrlmemoized non-async - CLI: Support
messageIdfrom API inshowcommand
- SDK: Breaking: Move
allSupportedChainsto@chainlink/ccip-sdk/allentry point (fixes tree-shaking in esbuild/Bun/Parcel) - CLI: Add kebab-case aliases for multi-word commands (
manual-exec,get-supported-tokens,parse-bytes,parse-data) - CLI: Add
--fee-tokensflag togetSupportedTokenscommand to list fee tokens instead of transferable tokens - SDK: Breaking:
CCIPRequestnow includes optionalmetadata?: APICCIPRequestMetadatafield- API fields (
status,receiptTransactionHash,deliveryTime, etc.) moved undermetadata - Migration: Change
request.statustorequest.metadata?.status
- API fields (
- SDK: Breaking: Remove
APICCIPRequesttype - useCCIPRequestwithmetadatafield instead - SDK: Improve JSDoc for
RateLimiterState- clarify thatnullmeans rate limiting is disabled - SDK: Improve JSDoc for
getTokenPoolRemotesandTokenPoolRemote- clarify Record keys are chain names - SDK: Add named types
TokenPoolConfigandRegistryTokenConfigfor clearer IDE hints - SDK: Rename
getTokenPoolConfigstogetTokenPoolConfigfor consistency (returns single config) - SDK: Add
Chain.getTokenPoolRemotefor fetching single remote config by chainSelector - SDK: Fix
sleep()browser compatibility - use optional chaining for.unref()which is Node.js-only - SDK: Add
TOKEN_REMOTE_NOT_CONFIGUREDerror code for missing TokenPool remote chain configurations - SDK: Fix EVM
getTokenPoolRemotesto throwCCIPTokenPoolChainConfigNotFoundErrorwhen remote token is not configured - SDK: Fix Aptos
getTokenPoolRemotesto throwCCIPTokenPoolChainConfigNotFoundErrorwhen remote chain config is missing - TON: Full
sendsupport
- SDK:
Chain.getBalance()method for querying native and token balances (EVM, Solana, Aptos) - SDK: Solana
resolveATA()utility for ATA derivation with automatic SPL Token vs Token-2022 detection - CLI:
tokencommand for balance queries - SDK: fix EVM estimate gas for token transfers with balance slot!=0 (e.g. USDC)
- SDK: Add
NetworkTypeenum ('MAINNET' | 'TESTNET') andnetworkTypeproperty toNetworkInfo, in place ofisTestnetboolean - SDK: Selector generation scripts now validate
network_typepresence from upstream chain-selectors - CLI: Breaking:
send,getSupportedTokens, andtokencommands now use named arguments instead of positional (e.g.,send -s <source> -d <dest> -r <router>) - CLI: Breaking:
-ralias removed from global--rpcsoption (use--rpcinstead);-rnow used for--routerinsendcommand
- SDK: Browser compatibility - explicit
bufferdependency and imports for cross-platform support - CI: Added
publintand@arethetypeswrong/clivalidation for package exports - ESLint:
import/no-nodejs-modulesrule prevents Node.js-only imports in SDK - Docs: Cross-Platform Portability guidelines in CONTRIBUTING.md
- SDK: Populate default extraArgs for getFee, sendMessage methods, requiring minimal parameters to use these methods
- SDK:
CCIPAPIClientandChain.getLaneLatency()for querying lane delivery times via CCIP API - CLI:
lane-latency <source> <dest>command;--no-apiflag for decentralized mode - SDK:
MessageStatusenum for message lifecycle tracking - CLI:
show --waitdisplays status progression during message tracking - SDK: Rename
fetch*toget*for message methods (getMessagesInTx,getMessageById,getMessagesForSender) - SDK: Viem adapter via
@chainlink/ccip-sdk/viem- usefromViemClient()andviemWallet()for viem users - SDK:
getCCIPExplorerUrl()andgetCCIPExplorerLinks()for CCIP Explorer URL generation - CLI:
sendandshowcommands now display CCIP Explorer links for visual transaction tracking - SDK: Added
sideEffects: falseto package.json for improved tree-shaking support - SDK: Breaking: Rename
fetch*toget*for message methods (getMessagesInTx,getMessageById,getMessagesForSender,getAllMessagesInBatch,getOffchainTokenData,getCommitReport,getExecutionReceipts) - SDK: Breaking: Convert methods with >2 arguments (besides opts/ctx) to single destructured object argument (
getFee,generateUnsignedSendMessage,sendMessage,generateUnsignedExecuteReport,executeReport,getCommitReport,getExecutionReceipts,waitFinalized) - SDK: simplify
getExecutionReceiptsfilters (acceptmessageIdandsourceChainSelector, instead of wholerequest) - SDK:
executeReportresolves toCCIPExecution, instead of genericChainTransaction - SDK: rename
getAllMessagesInBatchtogetMessagesInBatch(for consistency with other method names) - SDK: migrate TONChain to TonClient (from TonClient4) and TON HTTP V2 endpoints (more common)
- CLI: implement Ledger hardwallet support for TON
- SDK:
Chain.getLogscan receivewatchboolean or cancel promise, to enter continuous logs fetching - SDK:
Chain.waitFinalitymethod to receive alogand wait for its tx to finalize - SDK:
Chain.isTxHashstatic method to typeguard chain-specific txHash string format - SDK:
isSupportedTxHashfunction exported to check any supported chain - CLI:
show --waitandsend --waitwaits for finality, commit and first execution of pending requests - CLI: RPC endpoint url racer now triggers chain-families on-demand
- CLI:
--rpcs/-rnow can split CSV strings - CLI: if
--walletis omitted and--rpcs-file=['./.env]has aUSER_KEY=orPRIVATE_KEY=variable, it will be used as wallet - SDK:
CCIPMessagelosesheader; properties now are merged tomessageroot (e.g.message.messageId)
Chain.sendMessagenow callsgetFeeby itself, if not provided; it also returns aCCIPRequest- Fix USDC/CCTP attestation fetching in Solana
CCIPRequestlosestimestampproperty, available intx.timestampinstead- Rename
Chain.listFeeTokenstogetFeeTokens, fix for v1.5 lanes - Move
fetchCCIPRequestsInTxfunction toChain.fetchRequestsInTxmethod - Move
fetchCCIPRequestByIdfunction toChain.fetchRequestByIdmethod; it now can optionally receive OnRamp address to narrow search, required in non-EVM chains (which can't scan the all addresses at once); cli'sshow --id-from-sourcereceives<address>@<network>onramp address format in these cases - Move
fetchAllMessagesInBatchfunction toChain.fetchAllMessagesInBatchmethod getWalletstatic and cached methods are removed;walletcompatible signer instance should be passed directly as option to the read-write methods,sendMessageandexecuteReport- Chains now expose
generateUnsignedSendMessageandgenerateUnsignedExecuteReport, which expose raw/unsigned tx data forsendMessageandexecuteReportrespectively, in case one needs to sign and broadcast manually - All methods which logs now may receive a
{ logger }context object, to inject a logger other thanconsole - Remove some more node-isms from SDK
- Major overhaul of the tool, split into ccip-sdk and ccip-cli packages
- SDK now exposes Chain family specific classes, with initial full support to EVM, Solana and Aptos
- NodeJS specific bits moved out of SDK and into the CLI, SDK now is environment agnostic
- CLI implements Ledger support for all 3 chains
- See each package's README for more details
- aptos: improved some utilities for Aptos chain family (#50)
- fix:
manualExec --sender-queuefor large queues (#51)
- fix: aptos messages decoding format (#43)
--sender-queue: set tx'--gas-limit(if provided) andnonce(#44)
- fix: decoding of very old v1.2 messages (#33)
- regression: change source addresses for EVMv1.6 calculateManualExecProof (#31)
- fix decoding of solana addresses in EVMv1.6 hasher (#30)
- fix zero-padding of source addresses on calculateManualExecProof (#29)
- fix an edge case for solana hasher (#28)
--wallet ledger:<n>supports an integer as wallet index on standard Ethereum derivation path (#24)- Fixes for Solana leafhasher (#27)
- Fix manualExec on old v1.2 lanes or <1.5 TokenPools (legacy sourceTokenData) (#18)
- Add
getSupportedTokenscommand to discover and validate tokens that can be transferred between chains using CCIP (#11) - Add support to CCIP v1.6 EVM lanes (#14)
- Add
decodeMessagepublic function, to decode a CCIPMessage from anything (byte-arrays, JSON string, decoded objects) - Add
origin(sender of transaction) field to pretty requests, commits and receipts output.
- Add
- Add Ledger hardware wallet (
--wallet ledger) support (#14)
- Allow
parseBytescommand to parse EVMExtraArgs bytearrays, both standalone and in structs (#7) - Support Lombard attestation for LBTC transfers (#8)
- Add public
recursiveParseErrorsfunction to lib, to return nested/inner ABI errors - Use it everywhere:
parseBytescommand, thrown exceptions, andprettyReceiptoutput of failed execs - Supports explicit
--fee-token 0x00...00for native fees (default if omitted) - Embeds and shows
--version|-Vin cli, with shortRev commit
- Small improvements to inner wrap errors in
parseBytescommand - Disclaimer in README
- Initial release
- Compatible with CCIP v1.2 - v1.5 lanes
- Initial commands:
show(default): shows info about a CCIP messagemanualExec: manually executes a CCIP messagesend: sends a CCIP message through provided routerparseData: utility to parse known EVM errors, calldata and events datalane: utility to query and show info and config about a laneestimateGas: utility to estimate gasLimit for a message's CCIPReceiver callback
- Run
npx @chainlink/ccip-tools-ts --helpto install with npm and see all options