Skip to content

feat(sdk): add pre-send destination-liquidity preflight that mandatorily simulates the destination pool's releaseOrMint for token transfers - #301

Merged
andrevmatos merged 3 commits into
mainfrom
evm-dest-simulate-pool
Aug 5, 2026
Merged

feat(sdk): add pre-send destination-liquidity preflight that mandatorily simulates the destination pool's releaseOrMint for token transfers#301
andrevmatos merged 3 commits into
mainfrom
evm-dest-simulate-pool

Conversation

@aelmanaa

@aelmanaa aelmanaa commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

This pull request introduces significant improvements to the gas estimation documentation and SDK, particularly around pre-send validation and error handling for CCIP transfers. The main focus is on clarifying and enhancing how estimateReceiveExecution not only estimates gas but also validates transfer executability on the destination chain, helping developers avoid stuck transfers. Additionally, new error types and lower-level simulation primitives are documented and implemented, and the guides are reorganized to highlight these features.

Documentation and Guide Improvements:

  • Added a new guide, pre-send-validation.mdx, detailing how estimateReceiveExecution validates that a transfer can execute on the destination chain before sending, including error handling and lower-level simulation primitives.
  • Updated gas-estimation.mdx to clarify that on EVM chains, estimateReceiveExecution simulates ccipReceive and returns gas units, while on Solana it estimates compute units; also documented that the method validates executability and throws errors if the transfer would be stuck. [1] [2]
  • Improved tables and descriptions in gas-estimation.mdx for consistency and clarity, including error and method reference tables. [1] [2] [3]
  • Added the new "Pre-Send Validation" guide to the SDK sidebar for better discoverability.

SDK and Error Handling Enhancements:

  • Introduced new error codes and exports for destination pool preflight checks: CCIPDestExecutionRevertError and CCIPDestSimulationUnavailableError, improving error reporting when a transfer would fail on the destination. [1] [2]
  • Extended the Chain class with a new simulateLockOrBurn method, allowing simulation of source pool logic to obtain accurate data for destination pool validation.
  • Updated the validation logic in the SDK to allow more flexible message input and removed redundant liquidity checks from the chain-level preflight, as these are now handled by destination simulation. [1] [2] [3]

…ily simulates the destination pool's releaseOrMint for token transfers, blocks on any revert with one typed error carrying the raw revert, and ships exhaustive native pool-error ABI coverage
@aelmanaa
aelmanaa requested review from a team and PabloMansanet as code owners July 15, 2026 19:23
@vercel

vercel Bot commented Jul 15, 2026

Copy link
Copy Markdown

You must have Developer access to commit code to Chainlink Labs on Vercel. If you contact an administrator and receive Developer access, commit again to see your changes.

Learn more: https://vercel.com/docs/accounts/team-members-and-roles/access-roles#team-level-roles

@aelmanaa
aelmanaa requested a review from andrevmatos July 16, 2026 08:32
Comment thread ccip-sdk/src/evm/simulate.ts Outdated
Comment thread ccip-sdk/src/evm/dest-liquidity.fork.test.ts

@andrevmatos andrevmatos left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: request changes

Destination releaseOrMint simulation is the right primitive for liquidity, lockbox, rate-limit, RMN, mint-authority, and pool-hook checks. But the message this PR reconstructs is not always the message the OnRamp will emit — it can both falsely approve and falsely block sends. Findings below are inline where the code is in the diff; three cross-cutting items are here in the body.

🔴 Default CLI sends abort on CCIPDestSimulationUnavailableError (ccip-cli/src/commands/send.ts:382, not in diff)

Gas estimation runs by default (estimateGasLimit == null || > -100), and the catch rethrows everything except CCIPMethodUnsupportedError. CCIPDestSimulationUnavailableError is explicitly the inconclusive case (no dest RPC / transport failure) — per the stated design goal ("error only when a definitive condition is met"), the default policy should be warn and continue, reserving failure for definitive on-chain verdicts or explicit --estimate-gas-limit / --only-estimate.

🟡 Pre-existing, worth fixing in this PR or as follow-up: receiver finality lookup (ccip-sdk/src/evm/index.ts:2687, not in diff)

The finality check queries the receiver contract directly and defaults permissively ({finalityDepth: 1, finalitySafe: true}) on any error, while the OffRamp defaults non-v2 receivers to wait-for-finality and composes receiver/pool/lane defaults. OffRamp.getCCVsForMessage(bytes) exists precisely for offchain use and is the canonical resolver — prefer it. (This block pre-exists the PR, so not a regression; flagged because this PR is the right pipeline to route it through.)

Missing destination gates (the original ask's dest-only v2 conditions)

  1. OffRamp lane gates are never checked. The pool-direct simulation bypasses the OffRamp, so nothing validates OffRamp.getSourceChainConfig(sourceSelector): isEnabled, RMN verification state, and whether the sending OnRamp is in the OffRamp's allowed onRamps list. A message on a disabled lane or from a non-allowed ramp passes this preflight and strands. This is a cheap view call with the already-resolved offRamp, and a definitive on-chain condition → should block.
  2. Required CCVs / executors are not honored. Pool getRequiredCCVs, receiver-required CCVs, and lane defaults are never compared against the user's ccvs extraArgs. OffRamp.getCCVsForMessage returns required/optional/threshold for offchain use — but it takes the encoded message, so it only becomes trustworthy after the message-construction fixes inline below (destTokenAmount, tokenArgs, tokenReceiver, preserved emitted fields).

Suggested landing order

  1. The "blocks valid sends" class: offchain-data pools false-block (simulate.ts:159), probe error swallow (simulate.ts:141), CLI policy (send.ts:382).
  2. The "simulates the wrong message" class: destTokenAmount (gas.ts:283), preserved emitted fields (gas.ts:270), tokenArgs/tokenReceiver (simulate.ts:322, index.ts:2531).
  3. Error-model fixes: source-revert swallow (gas.ts:289), non-EVM liquidity fallback (chain.ts), typed-error misclassification (index.ts:2471), transient-set fix (simulate.ts:48).
  4. Missing gates: OffRamp source-config check, then CCV check via getCCVsForMessage; docs reframe (pre-send-validation.mdx) last.

Required check ownership (proposed)

Stage Checks that belong there
Source chain Router/lane enabled, RMN, sender allowlist, source pool registration/remote config, outbound rate/capacity, finality support, source pool required CCVs, fee/balance/approval
Destination chain OffRamp source enabled + allowed OnRamp, receiver finality, receiver/pool/lane CCV requirements, pool compatibility, source-pool wiring, inbound rate/capacity, lockbox liquidity, mint authority, RMN, pool hooks
Post-send/manual exec Exact emitted amount, source pool data, token receiver, offchain token data, verifier results, receiver execution
Inconclusive pre-send Future attestations/proofs, executor liveness, concurrent state changes, future receiver state

Validation note: this is a static trace against the diff (61cd778..HEAD) and the contracts in chainlink-ccip (OnRamp.sol, OffRamp.sol, LombardTokenPool.sol, CCTPThroughCCVTokenPool.sol). The current tests encode two of the assumptions flagged here (gross amount = message amount; decimals fallback after failed source simulation), so green CI does not cover these paths — please add cases for fee-charging pools, CCTP-v1/Lombard-v1 lanes, and post-send/manual-exec inputs.

Comment thread ccip-sdk/src/evm/simulate.ts
Comment thread ccip-sdk/src/evm/simulate.ts Outdated
Comment thread ccip-sdk/src/gas.ts Outdated
Comment thread ccip-sdk/src/gas.ts
Comment thread ccip-sdk/src/gas.ts
Comment thread ccip-sdk/src/chain.ts
Comment thread ccip-sdk/src/evm/index.ts
Comment thread ccip-sdk/src/evm/simulate.ts Outdated
Comment thread ccip-sdk/src/evm/const.ts Outdated
Comment thread ccip-api-ref/docs-sdk/guides/pre-send-validation.mdx Outdated
…s report preflight unavailable, post-fee/post-send message fidelity, typed source-pool revert, restored generic liquidity layer + OffRamp lane gates, unified transient taxonomy, error-only pool ABIs, CLI warns on inconclusive preflight, docs reframe
@aelmanaa
aelmanaa requested a review from andrevmatos August 3, 2026 20:18
andrevmatos
andrevmatos previously approved these changes Aug 4, 2026

@andrevmatos andrevmatos left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good job!

Resolve three add/add conflicts:
- ccip-sdk/src/evm/index.ts: union the ../gas.ts import (EstimateMessageInput +
  GetRequiredCCVsMessage/GetRequiredCCVsResult); keep both new method blocks —
  main's getRequiredCCVs() override and this branch's destination-pool
  simulation methods.
- ccip-sdk/src/index.ts: keep main's getRequiredCCVs + its type re-exports
  alongside this branch's ./evm/simulate.ts export block.

main's rewrite of the estimateReceiveExecution finality gate (now delegating to
getRequiredCCVs) auto-merged and is preserved.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown

Coverage Report

ℹ tests 1161
ℹ suites 292
ℹ pass 1161
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 198539.862353

> @chainlink/ccip-cli@1.10.3 test
> node --test

✔ src/commands/e2e-helpers.test.ts (102.083879ms)
Verbose mode enabled
▶ getCtx
  ▶ output — always stdout
    ✔ output.write goes to stdout (1.802119ms)
    ✔ output.table goes to stdout (1.104651ms)
  ✔ output — always stdout (4.353441ms)
  ▶ logger — always stderr
    ✔ logger.info goes to stderr (0.961432ms)
    ✔ logger.warn goes to stderr (0.585046ms)
    ✔ logger.error goes to stderr (0.596899ms)
  ✔ logger — always stderr (2.43765ms)
  ▶ verbose mode
    ✔ logger.debug is a no-op when verbose is false (1.279038ms)
    ✔ logger.debug goes to stderr when verbose is true (1.869334ms)
  ✔ verbose mode (3.660392ms)
  ▶ destroy signal
    ✔ returns a working destroy function (16.00264ms)
    ✔ calling destroy twice does not throw (0.61348ms)
  ✔ destroy signal (16.933085ms)
✔ getCtx (28.477958ms)
▶ lane-latency command
  ✔ should output JSON format correctly (17.950412ms)
  ✔ should resolve chain IDs to chain selectors (2.444653ms)
  ✔ should use custom API URL when provided (2.126957ms)
  ✔ should output log format correctly (2.405831ms)
  ✔ should handle chain IDs as input (2.583232ms)
  ✔ should handle chain selectors as input (1.862932ms)
  ✔ should throw CCIPApiClientNotAvailableError when --no-api flag is set (1.325195ms)
  ✔ should work normally when --no-api flag is false (1.742036ms)
  ✔ should forward blockConfirmations to API URL (1.575483ms)
  ✔ should not include numOfBlocks when blockConfirmations is not provided (1.484143ms)
  ▶ CCIP_API environment variable integration
    ✔ should respect CCIP_API=false environment variable (0.956543ms)
  ✔ CCIP_API environment variable integration (1.387471ms)
✔ lane-latency command (39.491535ms)
▶ e2e command lane EVM v1.5
  ✔ should show lane config Sepolia -> Fuji (v1.5) in JSON (5284.481584ms)
  ✔ should show lane config Sepolia -> Fuji (v1.5) in pretty format (4935.080116ms)
✔ e2e command lane EVM v1.5 (10222.463026ms)
▶ e2e command lane EVM v2.0
  ✔ should show lane config Sepolia -> Fuji (v2.0) in JSON (2423.30073ms)
✔ e2e command lane EVM v2.0 (2423.608031ms)
▶ e2e command lane EVM <-> Aptos (v1.6)
  ✔ should show lane config Sepolia -> Aptos (v1.6) (4063.680898ms)
  ✔ should show lane config Aptos -> Sepolia (v1.6) (4666.988478ms)
✔ e2e command lane EVM <-> Aptos (v1.6) (8731.103941ms)
▶ e2e command lane EVM <-> Solana (v1.6)
  ✔ should show lane config Sepolia -> Solana (v1.6) (5572.417832ms)
  ✔ should show lane config Solana -> Sepolia (v1.6) (2992.74237ms)
✔ e2e command lane EVM <-> Solana (v1.6) (8565.646995ms)
▶ e2e command lane EVM <-> TON (v1.6)
  ✔ should show lane config TON -> Sepolia (v1.6) (65467.583417ms)
  ✔ should show lane config Sepolia -> TON (v1.6) (14367.017925ms)
✔ e2e command lane EVM <-> TON (v1.6) (79834.978489ms)
▶ selectRequest non-interactive behavior
  ✔ returns the single request without prompting (1.140799ms)
  ✔ returns the request matching logIndex (0.190096ms)
  ✔ throws CCIPInteractiveRequiredError for multiple requests without logIndex (1.657026ms)
✔ selectRequest non-interactive behavior (4.457688ms)
▶ CCIPInteractiveRequiredError
  ✔ has correct code and is not transient (0.361026ms)
  ✔ uses default recovery when none provided (0.408595ms)
  ✔ preserves context fields (0.25569ms)
✔ CCIPInteractiveRequiredError (1.308844ms)
▶ preprocessArgv TTY auto-detection
  ✔ --interactive flag is defined in globalOpts (0.254638ms)
✔ preprocessArgv TTY auto-detection (0.414888ms)
▶ search messages command
  ✔ should throw CCIPApiClientNotAvailableError when --no-api flag is set (2.50733ms)
  ✔ should output JSON format correctly (13.805982ms)
  ✔ should pass sender filter to API (4.792425ms)
  ✔ should pass receiver filter to API (4.278351ms)
  ✔ should resolve source chain to selector (5.358896ms)
  ✔ should resolve dest chain to selector (2.627997ms)
  ✔ should pass manual-exec-only filter to API (6.162974ms)
  ✔ should treat limit 0 as unlimited (6.941383ms)
  ✔ should respect limit parameter (6.906878ms)
  ✔ should warn when no results found (1.330956ms)
  ✔ should use custom API URL when provided (2.462838ms)
  ✔ should warn on negative limit and fall back to default (1.713222ms)
  ✔ should output log format (2.097843ms)
✔ search messages command (63.10191ms)
▶ e2e command show EVM
  ▶ pretty format (default)
    ✔ should show complete CCIP transaction details EVM to EVM (6465.25791ms)
  ✔ pretty format (default) (6466.798823ms)
  ▶ json format
    ✔ should output a single valid JSON envelope with all expected fields (6279.245179ms)
  ✔ json format (6279.644468ms)
  ▶ log format
    ✔ should output in log format with object assignments (5764.316177ms)
  ✔ log format (5764.614525ms)
  ▶ verbose flag
    ✔ should work with verbose flag enabled (6777.193209ms)
  ✔ verbose flag (6777.627174ms)
  ▶ error handling
    ✔ should handle invalid transaction hash gracefully (6614.520682ms)
    ✔ should require transaction hash argument (1683.29625ms)
  ✔ error handling (8298.230508ms)
  ✔ should show complete CCIP transaction details EVM to Aptos (13600.992203ms)
  ✔ should show complete CCIP transaction details EVM to Solana (5566.781205ms)
  ✔ should show EVM to Solana v2 OffRamp execution without verifications (4466.348273ms)
✔ e2e command show EVM (57224.389195ms)
▶ e2e command show Solana
  ✔ should show complete CCIP transaction details Solana to EVM (13188.671213ms)
✔ e2e command show Solana (13188.910722ms)
▶ e2e command show Aptos
  ✔ should show complete CCIP transaction details Aptos to EVM (6855.26883ms)
✔ e2e command show Aptos (6855.537233ms)
﹣ e2e command show TON (0.125696ms) # SKIP
▶ formatCCIPError
  ✔ should return null for non-CCIPError instances (1.741775ms)
  ✔ should format CCIPError with code and message (0.775053ms)
  ✔ should include help section with recovery hint (0.325761ms)
  ✔ should include note section for transient errors (0.360416ms)
  ✔ should include retry timing for transient errors with retryAfterMs (0.580178ms)
  ✔ should not include note section for permanent errors (0.259928ms)
  ✔ should format error with structured output (0.30362ms)
  ✔ should include stack trace when verbose is true (0.52294ms)
  ✔ should not include stack trace when verbose is false (1.720485ms)
✔ formatCCIPError (8.858838ms)
▶ yieldResolved
  ✔ throws if a promise rejects while the generator is paused after a yield (20.579244ms)
✔ yieldResolved (20.93995ms)
▶ canton/signer
  ▶ Ed25519TransactionSigner constructor
    ✔ constructs with a valid 64-char hex seed (3.837715ms)
    ✔ constructs with a 0x-prefixed seed (0.385472ms)
    ✔ throws when seed is too short (0.568246ms)
    ✔ throws when seed is too long (0.239238ms)
    ✔ throws when seed contains non-hex characters (0.197149ms)
    ✔ computes the correct Canton fingerprint (0.919013ms)
    ✔ produces different fingerprints for different seeds (1.368306ms)
  ✔ Ed25519TransactionSigner constructor (8.896238ms)
  ▶ Ed25519TransactionSigner.sign()
    ✔ returns a PartySignatures structure (1.124338ms)
    ✔ includes the correct party ID (0.55424ms)
    ✔ produces a signature with correct properties (0.653195ms)
    ✔ produces a valid Ed25519 signature (64 bytes) (0.703709ms)
    ✔ produces a cryptographically valid signature (1.465066ms)
    ✔ produces different signatures for different hashes (0.53863ms)
    ✔ produces different signatures for different signers (same hash) (0.691226ms)
    ✔ handles empty hash (edge case) (0.447749ms)
  ✔ Ed25519TransactionSigner.sign() (6.725088ms)
  ▶ Ed25519TransactionSigner.getFingerprint()
    ✔ returns the fingerprint computed during construction (0.387816ms)
    ✔ returns a 68-character hex string (0.36272ms)
  ✔ Ed25519TransactionSigner.getFingerprint() (0.900939ms)
  ▶ Integration: multiple signers with same party
    ✔ allows multiple signers for the same party with different keys (0.80595ms)
  ✔ Integration: multiple signers with same party (0.893876ms)
✔ canton/signer (18.122566ms)
▶ fetchChainsFromRpcs
  ✔ lets duplicate tx-hash race endpoints query before aborting losers (14.491168ms)
  ✔ chainGetter: returns chain from first winning endpoint and destroys late arrivals (51.338067ms)
  ✔ chainGetter: resolves a pending request once the endpoint connects (Branch 2) (21.59795ms)
  ✔ chainGetter: rejects with CCIPRpcNotFoundError when all endpoints fail to connect (1.79232ms)
  ✔ chainGetter: rejects immediately with CCIPRpcNotFoundError once family is already exhausted (0.618329ms)
  ✔ txHash: rejects with CCIPTransactionNotFoundError when tx not on any chain (0.91218ms)
  ✔ txHash: Branch-4 (txOnlyRacer) is destroyed via catch when it loses the tx race (11.043013ms)
  ✔ txHash: chain connecting after txFoundIn is set is immediately destroyed without calling getTransaction (23.844362ms)
  ✔ txHash: Branch-2 chain given to a pending chainGetter is NOT destroyed when it cannot find the tx (12.971067ms)
  ✔ txFoundIn shared across families: SVM txOnlyRacer is destroyed after EVM wins (34.472197ms)
✔ fetchChainsFromRpcs (175.486665ms)
▶ isCantonLedgerUrl
  ✔ matches Canton JSON Ledger API paths (0.174537ms)
  ✔ does not match EVM JSON-RPC URLs (0.091902ms)
✔ isCantonLedgerUrl (0.478046ms)
▶ filterEndpointsForFamily
  ✔ gives Canton only ledger URLs (0.138951ms)
  ✔ gives EVM only non-ledger URLs (0.107712ms)
✔ filterEndpointsForFamily (0.328436ms)
▶ resolveRouter
  ✔ returns explicit CLI -r for any source family (0.190858ms)
  ✔ returns undefined for EVM source without -r (0.083427ms)
✔ resolveRouter (0.385402ms)
▶ resolveCliIndexer
  ✔ prefers explicit CLI --indexer values (0.172954ms)
  ✔ falls back to canton-config indexerUrl when the lane involves Canton (0.10141ms)
  ✔ does not fall back to canton-config indexerUrl for EVM-only lanes (0.084458ms)
  ✔ returns undefined when neither CLI nor config provides an indexer (0.081063ms)
✔ resolveCliIndexer (0.563687ms)
▶ resolveCliRouter
  ✔ prefers explicit CLI -r on Canton source (0.127449ms)
  ✔ prefers explicit CLI -r on EVM source even when canton-config has senderInstanceId (0.080992ms)
  ✔ falls back to canton-config senderInstanceId for Canton source (0.077846ms)
  ✔ does not fall back to senderInstanceId for EVM source (0.073578ms)
✔ resolveCliRouter (0.484147ms)
ℹ tests 113
ℹ suites 38
ℹ pass 113
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 110061.976434
---------------------------------------|---------|----------|---------|---------|-------------------
File                                   | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------------------------------|---------|----------|---------|---------|-------------------
All files                              |   77.15 |    78.68 |   64.94 |   77.15 |                   
 ccip-cli/src                          |   90.16 |    59.25 |      75 |   90.16 |                   
  index.ts                             |   90.16 |    59.25 |      75 |   90.16 | ...68-169,175-180 
 ccip-cli/src/commands                 |   51.06 |    73.68 |   61.66 |   51.06 |                   
  index.ts                             |     100 |      100 |     100 |     100 |                   
  lane-latency.ts                      |   72.56 |     90.9 |   33.33 |   72.56 | ...,63-70,105-111 
  lane.ts                              |   85.25 |       70 |     100 |   85.25 | ...34-137,141-143 
  manual-exec.ts                       |   20.34 |      100 |       0 |   20.34 | ...39-149,151-347 
  parse.ts                             |   57.14 |      100 |       0 |   57.14 | 46-50,57-64,66-91 
  search.ts                            |   81.25 |      100 |       0 |   81.25 | 24-29             
  send.ts                              |   13.18 |      100 |       0 |   13.18 | ...03-231,233-546 
  show.ts                              |   75.62 |    63.75 |     100 |   75.62 | ...15-318,398-400 
  supported-tokens.ts                  |      17 |      100 |       0 |      17 | ...59-332,334-347 
  token.ts                             |    22.9 |      100 |       0 |    22.9 | ...3,60-67,69-131 
  types.ts                             |     100 |      100 |     100 |     100 |                   
  utils.ts                             |   87.67 |     76.5 |   96.42 |   87.67 | ...99-609,617-625 
 ccip-cli/src/commands/search          |   49.19 |    82.85 |    12.5 |   49.19 |                   
  messages.ts                          |   49.19 |    82.85 |    12.5 |   49.19 | ...89-211,213-248 
 ccip-cli/src/providers                |   61.41 |    87.17 |      45 |   61.41 |                   
  aptos.ts                             |   51.47 |      100 |       0 |   51.47 | ...,95-96,105-136 
  canton.ts                            |   85.71 |    96.29 |      90 |   85.71 | 185-203,254-273   
  evm.ts                               |    36.3 |      100 |       0 |    36.3 | ...69-104,116-168 
  index.ts                             |   84.86 |    83.52 |      90 |   84.86 | 130-131,289-337   
  solana.ts                            |   47.44 |      100 |       0 |   47.44 | ...02-103,112-137 
  sui.ts                               |   64.28 |      100 |       0 |   64.28 | 10-14             
  ton.ts                               |   15.03 |      100 |       0 |   15.03 | 24-153            
 ccip-sdk/src                          |   94.79 |    86.25 |   92.64 |   94.79 |                   
  chain.ts                             |   96.05 |     77.1 |   84.37 |   96.05 | ...2249,2282-2283 
  commits.ts                           |    90.9 |    74.19 |     100 |    90.9 | ...06,115-118,120 
  execution.ts                         |   87.04 |    81.81 |     100 |   87.04 | ...76-183,189-196 
  explorer.ts                          |     100 |      100 |     100 |     100 |                   
  extra-args.ts                        |     100 |    89.47 |     100 |     100 | 225,260,297,312   
  fetch.ts                             |   98.08 |    93.43 |   97.14 |   98.08 | ...95-596,672-673 
  gas.ts                               |   85.16 |    85.18 |      80 |   85.16 | ...96-307,416-465 
  http-status.ts                       |     100 |      100 |     100 |     100 |                   
  index.ts                             |     100 |      100 |     100 |     100 |                   
  messages.ts                          |    79.2 |    46.15 |      40 |    79.2 | ...99-310,314-327 
  networks.ts                          |     100 |      100 |     100 |     100 |                   
  offchain.ts                          |   87.13 |    78.04 |     100 |   87.13 | ...18-227,236-237 
  requests.ts                          |   95.22 |    91.12 |     100 |   95.22 | ...31-632,657-662 
  supported-chains.ts                  |     100 |      100 |     100 |     100 |                   
  types.ts                             |     100 |      100 |     100 |     100 |                   
  utils.ts                             |   97.05 |    93.22 |     100 |   97.05 | ...90-391,645-653 
 ccip-sdk/src/api                      |   94.31 |    84.78 |   94.73 |   94.31 |                   
  index.ts                             |   94.31 |    84.78 |   94.73 |   94.31 | ...39-842,845-848 
 ccip-sdk/src/aptos                    |   62.43 |    69.94 |   61.01 |   62.43 |                   
  exec.ts                              |   29.31 |      100 |       0 |   29.31 | 18-58             
  hasher.ts                            |   75.89 |       80 |   66.66 |   75.89 | 17-36,50-56       
  index.ts                             |    66.5 |    77.35 |   64.28 |    66.5 | ...1008,1012-1023 
  logs.ts                              |   86.86 |    52.72 |   85.71 |   86.86 | ...08-214,216-227 
  send.ts                              |    25.6 |      100 |       0 |    25.6 | ...2,63-80,93-125 
  token.ts                             |   23.75 |       75 |     100 |   23.75 | 35-156            
  types.ts                             |   65.97 |      100 |       0 |   65.97 | 26-33,65-89       
 ccip-sdk/src/canton                   |   44.72 |    76.56 |   31.66 |   44.72 |                   
  amount.ts                            |   92.59 |       70 |     100 |   92.59 | 22-23             
  ccv-addresses.ts                     |     100 |    91.07 |     100 |     100 | 13,30,64,67       
  defaults.ts                          |   99.28 |    90.24 |     100 |   99.28 | 93                
  events.ts                            |   45.74 |     52.5 |   23.52 |   45.74 | ...13-525,531-540 
  index.ts                             |    33.5 |     60.6 |   12.82 |    33.5 | ...2517,2520-2522 
  types.ts                             |   95.34 |      100 |      50 |   95.34 | 55-62             
  update-id.ts                         |   98.11 |    88.88 |     100 |   98.11 | 52                
 ccip-sdk/src/canton/client            |   56.53 |     61.9 |   20.58 |   56.53 |                   
  client.ts                            |   54.67 |       60 |   20.58 |   54.67 | ...16-735,750-770 
  index.ts                             |     100 |      100 |     100 |     100 |                   
 ...dk/src/canton/explicit-disclosures |   75.11 |    69.35 |    55.1 |   75.11 |                   
  acs.ts                               |   87.36 |     69.1 |      90 |   87.36 | ...20,568,606-607 
  eds.ts                               |   54.79 |      100 |       0 |   54.79 | ...79-386,390-395 
 ccip-sdk/src/canton/token-metadata    |   62.64 |      100 |       0 |   62.64 |                   
  client.ts                            |   62.64 |      100 |       0 |   62.64 | 104-163,170-174   
 ...dk/src/canton/transfer-instruction |    53.4 |      100 |       0 |    53.4 |                   
  client.ts                            |    53.4 |      100 |       0 |    53.4 | 97-180,187-191    
 ccip-sdk/src/errors                   |   89.26 |     74.9 |   54.13 |   89.26 |                   
  CCIPError.ts                         |     100 |      100 |     100 |     100 |                   
  codes.ts                             |     100 |      100 |     100 |     100 |                   
  index.ts                             |     100 |      100 |     100 |     100 |                   
  pure.ts                              |     100 |       75 |     100 |     100 | 32                
  recovery.ts                          |     100 |      100 |     100 |     100 |                   
  specialized.ts                       |   86.86 |    70.73 |   51.58 |   86.86 | ...3544,3567-3576 
  utils.ts                             |   94.44 |    81.48 |     100 |   94.44 | 15,17,22,24       
 ccip-sdk/src/evm                      |   91.37 |    81.38 |   93.57 |   91.37 |                   
  const.ts                             |     100 |      100 |     100 |     100 |                   
  errors.ts                            |   91.98 |    81.57 |     100 |   91.98 | ...85,239-242,247 
  extra-args.ts                        |   94.47 |    61.01 |     100 |   94.47 | ...11-212,328-340 
  fork.test.data.ts                    |     100 |      100 |     100 |     100 |                   
  gas.ts                               |   98.19 |    63.15 |     100 |   98.19 | 90-91,93          
  hasher.ts                            |     100 |     92.3 |     100 |     100 | 135               
  index.ts                             |   85.65 |    79.45 |   90.41 |   85.65 | ...2596,2753-2784 
  logs.ts                              |   98.84 |    91.75 |     100 |   98.84 | 65-66,71-72       
  messageCodec.ts                      |     100 |      100 |     100 |     100 |                   
  messages.ts                          |     100 |      100 |     100 |     100 |                   
  offchain.ts                          |    87.5 |    71.42 |     100 |    87.5 | 13-14             
  simulate.ts                          |     100 |    94.91 |     100 |     100 | 109-111,425       
  types.ts                             |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/evm/viem                 |   79.76 |    90.62 |   69.23 |   79.76 |                   
  client-adapter.ts                    |     100 |       90 |     100 |     100 | 48,74             
  index.ts                             |     100 |      100 |     100 |     100 |                   
  wallet-adapter.ts                    |   63.09 |     90.9 |   55.55 |   63.09 | ...91-124,131-157 
 ccip-sdk/src/hasher                   |   94.29 |    78.94 |     100 |   94.29 |                   
  common.ts                            |     100 |      100 |     100 |     100 |                   
  hasher.ts                            |     100 |    66.66 |     100 |     100 | 19                
  index.ts                             |     100 |      100 |     100 |     100 |                   
  merklemulti.ts                       |   93.43 |       78 |     100 |   93.43 | ...06-307,315-316 
 ccip-sdk/src/shared                   |   90.29 |    76.92 |     100 |   90.29 |                   
  bcs-codecs.ts                        |   90.15 |       75 |     100 |   90.15 | 75-87             
  constants.ts                         |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/solana                   |    75.8 |       70 |   81.05 |    75.8 |                   
  cleanup.ts                           |   26.95 |    66.66 |   33.33 |   26.95 | ...59-101,114-227 
  exec.ts                              |   69.11 |    62.96 |   66.66 |   69.11 | ...69-473,513-514 
  fork.test.data.ts                    |     100 |      100 |     100 |     100 |                   
  gas.ts                               |   92.02 |    68.57 |     100 |   92.02 | ...,80-89,169-170 
  hasher.ts                            |   96.49 |    81.81 |     100 |   96.49 | 64-67             
  index.ts                             |   77.85 |    74.55 |   81.13 |   77.85 | ...1942,1946-1979 
  logs.ts                              |   65.54 |    66.66 |     100 |   65.54 | ...28-129,134-141 
  offchain.ts                          |     100 |      100 |     100 |     100 |                   
  patchBorsh.ts                        |   78.31 |       50 |     100 |   78.31 | ...47,65-66,72-78 
  send.ts                              |    77.6 |    33.33 |      80 |    77.6 | ...52-360,403-442 
  types.ts                             |     100 |      100 |     100 |     100 |                   
  utils.ts                             |   77.44 |     64.7 |   81.25 |   77.44 | ...54-556,588-603 
 ccip-sdk/src/sui                      |   64.64 |    68.83 |    58.2 |   64.64 |                   
  discovery.ts                         |    62.9 |    55.26 |   66.66 |    62.9 | ...77-299,303-337 
  events.ts                            |   92.85 |    61.11 |      90 |   92.85 | ...32-236,285-296 
  exec.ts                              |   32.19 |      100 |       0 |   32.19 | 37-89,101-146     
  hasher.ts                            |   98.18 |    66.66 |     100 |   98.18 | 34,50             
  index.ts                             |   64.69 |    75.29 |   46.15 |   64.69 | ...66-867,871-872 
  objects.ts                           |    43.1 |    82.14 |   71.42 |    43.1 | ...43-194,205-348 
 ccip-sdk/src/sui/manuallyExec         |   54.12 |       75 |      50 |   54.12 |                   
  encoder.ts                           |    83.9 |    66.66 |     100 |    83.9 | 51-58,73-77,82    
  index.ts                             |   34.35 |      100 |       0 |   34.35 | 46-131            
 ccip-sdk/src/ton                      |   81.12 |    78.66 |   81.11 |   81.12 |                   
  exec.ts                              |     100 |      100 |     100 |     100 |                   
  extra-args.ts                        |   98.66 |    72.72 |     100 |   98.66 | 156-157,222       
  hasher.ts                            |   78.07 |    77.77 |      75 |   78.07 | 100-108,156-187   
  index.ts                             |   79.84 |    75.91 |   71.15 |   79.84 | ...1574,1581-1582 
  logs.ts                              |     100 |    94.54 |     100 |     100 | 74-79,111         
  send.ts                              |   95.52 |    66.66 |     100 |   95.52 | 37-44,188         
  types.ts                             |   91.24 |    81.25 |     100 |   91.24 | ...61-63,71-74,92 
  utils.ts                             |    63.1 |    78.57 |    90.9 |    63.1 | ...37-395,397-400 
---------------------------------------|---------|----------|---------|---------|-------------------

@andrevmatos
andrevmatos merged commit 3081da4 into main Aug 5, 2026
11 of 12 checks passed
@andrevmatos
andrevmatos deleted the evm-dest-simulate-pool branch August 5, 2026 09:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants