Skip to content

feat: multi-topic aptos sui, getLogs.typeAndVersions - #357

Merged
andrevmatos merged 17 commits into
mainfrom
feat/multi-topic-aptos-sui
Aug 18, 2026
Merged

andrevmatos merged 17 commits into
mainfrom
feat/multi-topic-aptos-sui

Conversation

@andrevmatos

@andrevmatos andrevmatos commented Aug 15, 2026 •

Copy link
Copy Markdown
Collaborator
  • LogFilter gets a typeAndVersions option, as an array of types or regexes to match logs contracts before emitting
  • Aptos, Sui can receive multiple topics in a single getLogs, and interleave them; Aptos also can ignore if address doesn't have some topic
  • USDCTokenPoolProxy v2 in EVM properly handle cctpV2Pool and output some more details in get-supported-tokens
  • EVM.getLogs can handle ambiguous (multiple signatures) topic names (like ConfigSet)
  • EVM can handle RPCs which limits the number of topics in getLogs, break the list and re-join
  • Solana: update to latest v2 contracts
  • TON: fix some shared masterchain blockNumber guard
  • Sui: almost complete implementation
    • get-supported-tokens / tokenPool methods
    • lane/offRamp discovery optimized and fixed
    • implemented getFee and sendMessage, send sui->* now working
    • fixed manual-exec
    • fixed getExecutionReceipts (send --wait)

@andrevmatos andrevmatos self-assigned this Aug 15, 2026
@andrevmatos
andrevmatos requested review from a team, PabloMansanet and aelmanaa as code owners August 15, 2026 02:59
@vercel

vercel Bot commented Aug 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
ccip-tools-ts Ready Ready Preview Aug 18, 2026 6:22pm

Request Review

@github-actions

Copy link
Copy Markdown

πŸ‘‹ andrevmatos, thanks for creating this pull request!

To help reviewers, please consider creating future PRs as drafts first. This allows you to self-review and make any final changes before notifying the team.

Once you're ready, you can mark it as "Ready for review" to request feedback. Thanks!

@github-actions

github-actions Bot commented Aug 15, 2026 •

Copy link
Copy Markdown

Coverage Report

β„Ή tests 1263
β„Ή suites 311
β„Ή pass 1263
β„Ή fail 0
β„Ή cancelled 0
β„Ή skipped 0
β„Ή todo 0
β„Ή duration_ms 236785.484991

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

βœ” src/commands/e2e-helpers.test.ts (128.604267ms)
Verbose mode enabled
β–Ά getCtx
  β–Ά output β€” always stdout
    βœ” output.write goes to stdout (1.892879ms)
    βœ” output.table goes to stdout (1.075936ms)
  βœ” output β€” always stdout (4.490933ms)
  β–Ά logger β€” always stderr
    βœ” logger.info goes to stderr (2.017812ms)
    βœ” logger.warn goes to stderr (0.393002ms)
    βœ” logger.error goes to stderr (0.408141ms)
  βœ” logger β€” always stderr (3.109077ms)
  β–Ά verbose mode
    βœ” logger.debug is a no-op when verbose is false (0.515141ms)
    βœ” logger.debug goes to stderr when verbose is true (2.189011ms)
  βœ” verbose mode (2.914984ms)
  β–Ά destroy signal
    βœ” returns a working destroy function (10.497811ms)
    βœ” calling destroy twice does not throw (0.590801ms)
  βœ” destroy signal (11.358405ms)
βœ” getCtx (22.9525ms)
β–Ά lane-latency command
  βœ” should output JSON format correctly (17.003961ms)
  βœ” should resolve chain IDs to chain selectors (3.914698ms)
  βœ” should use custom API URL when provided (4.833561ms)
  βœ” should output log format correctly (7.843182ms)
  βœ” should handle chain IDs as input (1.545392ms)
  βœ” should handle chain selectors as input (8.970554ms)
  βœ” should throw CCIPApiClientNotAvailableError when --no-api flag is set (1.218161ms)
  βœ” should work normally when --no-api flag is false (2.226831ms)
  βœ” should forward blockConfirmations to API URL (1.580967ms)
  βœ” should not include numOfBlocks when blockConfirmations is not provided (1.778565ms)
  β–Ά CCIP_API environment variable integration
    βœ” should respect CCIP_API=false environment variable (0.614216ms)
  βœ” CCIP_API environment variable integration (0.846569ms)
βœ” lane-latency command (56.895598ms)
β–Ά e2e command lane EVM v1.5
  βœ” should show lane config Sepolia -> Fuji (v1.5) in JSON (6095.807994ms)
  βœ” should show lane config Sepolia -> Fuji (v1.5) in pretty format (5452.262373ms)
βœ” e2e command lane EVM v1.5 (11550.876469ms)
β–Ά e2e command lane EVM v2.0
  βœ” should show lane config Sepolia -> Fuji (v2.0) in JSON (2787.784206ms)
βœ” e2e command lane EVM v2.0 (2788.088845ms)
β–Ά e2e command lane EVM <-> Aptos (v1.6)
  βœ” should show lane config Sepolia -> Aptos (v1.6) (6075.280054ms)
  βœ” should show lane config Aptos -> Sepolia (v1.6) (3729.960805ms)
βœ” e2e command lane EVM <-> Aptos (v1.6) (9805.713299ms)
β–Ά e2e command lane EVM <-> Solana (v1.6)
  βœ” should show lane config Sepolia -> Solana (v1.6) (4745.028726ms)
  βœ” should show lane config Solana -> Sepolia (v1.6) (5259.807573ms)
βœ” e2e command lane EVM <-> Solana (v1.6) (10005.278934ms)
β–Ά e2e command lane EVM <-> TON (v1.6)
  βœ” should show lane config TON -> Sepolia (v1.6) (25918.003818ms)
  βœ” should show lane config Sepolia -> TON (v1.6) (14351.922281ms)
βœ” e2e command lane EVM <-> TON (v1.6) (40270.319621ms)
β–Ά selectRequest non-interactive behavior
  βœ” returns the single request without prompting (1.103708ms)
  βœ” returns the request matching logIndex (0.27393ms)
  βœ” throws CCIPInteractiveRequiredError for multiple requests without logIndex (2.404834ms)
βœ” selectRequest non-interactive behavior (5.799613ms)
β–Ά CCIPInteractiveRequiredError
  βœ” has correct code and is not transient (0.399094ms)
  βœ” uses default recovery when none provided (0.361514ms)
  βœ” preserves context fields (0.240328ms)
βœ” CCIPInteractiveRequiredError (1.26574ms)
β–Ά preprocessArgv TTY auto-detection
  βœ” --interactive flag is defined in globalOpts (1.113415ms)
βœ” preprocessArgv TTY auto-detection (1.286819ms)
β–Ά search messages command
  βœ” should throw CCIPApiClientNotAvailableError when --no-api flag is set (2.696076ms)
  βœ” should output JSON format correctly (12.537504ms)
  βœ” should pass sender filter to API (2.987079ms)
  βœ” should pass receiver filter to API (2.814086ms)
  βœ” should resolve source chain to selector (4.230737ms)
  βœ” should resolve dest chain to selector (2.44568ms)
  βœ” should pass manual-exec-only filter to API (2.82129ms)
  βœ” should treat limit 0 as unlimited (7.34825ms)
  βœ” should respect limit parameter (7.218487ms)
  βœ” should warn when no results found (1.043936ms)
  βœ” should use custom API URL when provided (3.278823ms)
  βœ” should warn on negative limit and fall back to default (2.033291ms)
  βœ” should output log format (1.817638ms)
βœ” search messages command (55.638487ms)
β–Ά e2e command show EVM
  β–Ά pretty format (default)
    βœ” should show complete CCIP transaction details EVM to EVM (8132.101832ms)
  βœ” pretty format (default) (8133.491003ms)
  β–Ά json format
    βœ” should output a single valid JSON envelope with all expected fields (8650.555954ms)
  βœ” json format (8650.96649ms)
  β–Ά log format
    βœ” should output in log format with object assignments (7356.863472ms)
  βœ” log format (7357.328138ms)
  β–Ά verbose flag
    βœ” should work with verbose flag enabled (10239.320949ms)
  βœ” verbose flag (10239.63749ms)
  β–Ά error handling
    βœ” should handle invalid transaction hash gracefully (28699.480997ms)
    βœ” should require transaction hash argument (1699.616012ms)
  βœ” error handling (30399.547658ms)
  βœ” should show complete CCIP transaction details EVM to Aptos (12339.790071ms)
  βœ” should show complete CCIP transaction details EVM to Solana (7881.156801ms)
  βœ” should show EVM to Solana v2 OffRamp execution without verifications (3682.902504ms)
βœ” e2e command show EVM (88686.489715ms)
β–Ά e2e command show Solana
  βœ” should show complete CCIP transaction details Solana to EVM (8528.584801ms)
βœ” e2e command show Solana (8528.823816ms)
β–Ά e2e command show Aptos
  βœ” should show complete CCIP transaction details Aptos to EVM (7713.385054ms)
βœ” e2e command show Aptos (7713.677267ms)
οΉ£ e2e command show TON (0.06413ms) # SKIP
β–Ά formatCCIPError
  βœ” should return null for non-CCIPError instances (1.23329ms)
  βœ” should format CCIPError with code and message (0.529377ms)
  βœ” should include help section with recovery hint (0.189604ms)
  βœ” should include note section for transient errors (0.247672ms)
  βœ” should include retry timing for transient errors with retryAfterMs (0.465548ms)
  βœ” should not include note section for permanent errors (0.275073ms)
  βœ” should format error with structured output (0.263011ms)
  βœ” should include stack trace when verbose is true (0.388034ms)
  βœ” should not include stack trace when verbose is false (0.243144ms)
βœ” formatCCIPError (5.623176ms)
β–Ά yieldResolved
  βœ” throws if a promise rejects while the generator is paused after a yield (10.762409ms)
βœ” yieldResolved (11.06787ms)
β–Ά canton/signer
  β–Ά Ed25519TransactionSigner constructor
    βœ” constructs with a valid 64-char hex seed (4.261266ms)
    βœ” constructs with a 0x-prefixed seed (0.688194ms)
    βœ” throws when seed is too short (0.615487ms)
    βœ” throws when seed is too long (0.18781ms)
    βœ” throws when seed contains non-hex characters (0.191337ms)
    βœ” computes the correct Canton fingerprint (0.987392ms)
    βœ” produces different fingerprints for different seeds (0.871004ms)
  βœ” Ed25519TransactionSigner constructor (9.633614ms)
  β–Ά Ed25519TransactionSigner.sign()
    βœ” returns a PartySignatures structure (1.245042ms)
    βœ” includes the correct party ID (0.688424ms)
    βœ” produces a signature with correct properties (0.567137ms)
    βœ” produces a valid Ed25519 signature (64 bytes) (1.021294ms)
    βœ” produces a cryptographically valid signature (1.529302ms)
    βœ” produces different signatures for different hashes (1.315823ms)
    βœ” produces different signatures for different signers (same hash) (0.807807ms)
    βœ” handles empty hash (edge case) (0.437896ms)
  βœ” Ed25519TransactionSigner.sign() (8.347035ms)
  β–Ά Ed25519TransactionSigner.getFingerprint()
    βœ” returns the fingerprint computed during construction (0.6381ms)
    βœ” returns a 68-character hex string (0.398463ms)
  βœ” Ed25519TransactionSigner.getFingerprint() (1.167888ms)
  β–Ά Integration: multiple signers with same party
    βœ” allows multiple signers for the same party with different keys (0.825289ms)
  βœ” Integration: multiple signers with same party (0.923482ms)
βœ” canton/signer (21.065824ms)
β–Ά fetchChainsFromRpcs
  βœ” lets duplicate tx-hash race endpoints query before aborting losers (14.165746ms)
  βœ” chainGetter: returns chain from first winning endpoint and destroys late arrivals (52.34289ms)
  βœ” chainGetter: resolves a pending request once the endpoint connects (Branch 2) (20.739015ms)
  βœ” chainGetter: rejects with CCIPRpcNotFoundError when all endpoints fail to connect (2.141083ms)
  βœ” chainGetter: rejects immediately with CCIPRpcNotFoundError once family is already exhausted (0.735852ms)
  βœ” txHash: rejects with CCIPTransactionNotFoundError when tx not on any chain (1.043215ms)
  βœ” txHash: Branch-4 (txOnlyRacer) is destroyed via catch when it loses the tx race (10.553981ms)
  βœ” txHash: chain connecting after txFoundIn is set is immediately destroyed without calling getTransaction (24.235154ms)
  βœ” txHash: Branch-2 chain given to a pending chainGetter is NOT destroyed when it cannot find the tx (16.07167ms)
  βœ” txFoundIn shared across families: SVM txOnlyRacer is destroyed after EVM wins (39.329743ms)
βœ” fetchChainsFromRpcs (184.161777ms)
β–Ά isCantonLedgerUrl
  βœ” matches Canton JSON Ledger API paths (0.18223ms)
  βœ” does not match EVM JSON-RPC URLs (0.093114ms)
βœ” isCantonLedgerUrl (0.40738ms)
β–Ά filterEndpointsForFamily
  βœ” gives Canton only ledger URLs (0.148347ms)
  βœ” gives EVM only non-ledger URLs (0.104084ms)
βœ” filterEndpointsForFamily (0.344763ms)
β–Ά resolveRouter
  βœ” returns explicit CLI -r for any source family (0.210001ms)
  βœ” returns undefined for EVM source without -r (0.083827ms)
βœ” resolveRouter (0.391149ms)
β–Ά resolveCliIndexer
  βœ” prefers explicit CLI --indexer values (0.181017ms)
  βœ” falls back to canton-config indexerUrl when the lane involves Canton (0.111297ms)
  βœ” does not fall back to canton-config indexerUrl for EVM-only lanes (0.089507ms)
  βœ” returns undefined when neither CLI nor config provides an indexer (0.083065ms)
βœ” resolveCliIndexer (0.613474ms)
β–Ά resolveCliRouter
  βœ” prefers explicit CLI -r on Canton source (0.166511ms)
  βœ” prefers explicit CLI -r on EVM source even when canton-config has senderInstanceId (0.085099ms)
  βœ” falls back to canton-config senderInstanceId for Canton source (0.081261ms)
  βœ” does not fall back to senderInstanceId for EVM source (0.073978ms)
βœ” resolveCliRouter (0.572417ms)
β„Ή tests 113
β„Ή suites 38
β„Ή pass 113
β„Ή fail 0
β„Ή cancelled 0
β„Ή skipped 0
β„Ή todo 0
β„Ή duration_ms 109255.750135
---------------------------------------|---------|----------|---------|---------|-------------------
File                                   | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------------------------------|---------|----------|---------|---------|-------------------
All files                              |   76.73 |    78.28 |   65.78 |   76.73 |                   
 ccip-cli/src                          |   90.42 |    59.25 |      75 |   90.42 |                   
  index.ts                             |   90.42 |    59.25 |      75 |   90.42 | ...73-174,180-185 
 ccip-cli/src/commands                 |      51 |    71.32 |      60 |      51 |                   
  index.ts                             |     100 |      100 |     100 |     100 |                   
  lane-latency.ts                      |   70.49 |    83.33 |   33.33 |   70.49 | ...,70-77,113-120 
  lane.ts                              |   85.89 |    68.42 |     100 |   85.89 | ...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.39 |    73.12 |   92.85 |   87.39 | ...99-609,617-625 
 ccip-cli/src/commands/search          |   52.61 |    76.19 |    12.5 |   52.61 |                   
  messages.ts                          |   52.61 |    76.19 |    12.5 |   52.61 | ...28-250,252-287 
 ccip-cli/src/providers                |   58.87 |     86.2 |   32.72 |   58.87 |                   
  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.27 |    82.14 |      90 |   84.27 | ...30-131,289-337 
  solana.ts                            |   47.44 |      100 |       0 |   47.44 | ...02-103,112-137 
  sui.ts                               |    49.5 |      100 |       0 |    49.5 | ...57-258,267-301 
  ton.ts                               |   15.03 |      100 |       0 |   15.03 | 24-153            
 ccip-sdk/src                          |   94.99 |    87.13 |   92.59 |   94.99 |                   
  chain.ts                             |   96.14 |       80 |   84.37 |   96.14 | ...2305,2338-2339 
  commits.ts                           |    90.9 |    77.41 |     100 |    90.9 | ...06,115-118,120 
  execution.ts                         |   86.26 |    81.81 |     100 |   86.26 | ...79-186,192-199 
  explorer.ts                          |     100 |      100 |     100 |     100 |                   
  extra-args.ts                        |     100 |    89.47 |     100 |     100 | 225,260,297,312   
  fetch.ts                             |   98.05 |    93.49 |   97.43 |   98.05 | ...23-724,967-969 
  gas.ts                               |   85.17 |    86.04 |      75 |   85.17 | ...83-294,403-452 
  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                          |   84.64 |    76.92 |     100 |   84.64 | ...18-227,236-237 
  requests.ts                          |   95.28 |    91.01 |     100 |   95.28 | ...39-640,665-670 
  supported-chains.ts                  |     100 |      100 |     100 |     100 |                   
  types.ts                             |     100 |      100 |     100 |     100 |                   
  utils.ts                             |    99.2 |    95.97 |     100 |    99.2 | ...12,217-218,220 
 ccip-sdk/src/api                      |   93.22 |    83.44 |   94.73 |   93.22 |                   
  index.ts                             |   93.22 |    83.44 |   94.73 |   93.22 | ...92-895,898-901 
 ccip-sdk/src/aptos                    |   66.65 |    76.82 |    62.9 |   66.65 |                   
  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.95 |    74.52 |   66.66 |   66.95 | ...1016,1020-1031 
  logs.ts                              |   93.03 |    78.26 |      80 |   93.03 | ...89,333,406-417 
  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.7 |    76.56 |   31.66 |    44.7 |                   
  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.54 |     60.6 |   12.82 |   33.54 | ...2535,2538-2540 
  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 |   74.81 |    69.35 |    55.1 |   74.81 |                   
  acs.ts                               |   87.36 |     69.1 |      90 |   87.36 | ...20,568,606-607 
  eds.ts                               |   54.34 |      100 |       0 |   54.34 | ...86-393,397-402 
 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.14 |    76.49 |   54.47 |   89.14 |                   
  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.73 |    72.85 |   51.96 |   86.73 | ...3588,3611-3620 
  utils.ts                             |   94.44 |    81.48 |     100 |   94.44 | 15,17,22,24       
 ccip-sdk/src/evm                      |   91.54 |    81.82 |   92.92 |   91.54 |                   
  const.ts                             |   98.66 |    92.85 |     100 |   98.66 | 122-123           
  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.75 |    79.85 |   90.41 |   85.75 | ...2622,2777-2808 
  logs.ts                              |   99.09 |    91.05 |      90 |   99.09 | 69-70,75-76       
  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                   |   85.04 |    83.95 |   82.35 |   85.04 |                   
  bcs-codecs.ts                        |    78.7 |    60.86 |   66.66 |    78.7 | ...37-247,255-264 
  codec.ts                             |   94.17 |    92.98 |     100 |   94.17 | 135-136,174-182   
  constants.ts                         |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/solana                   |   76.48 |     71.3 |    82.4 |   76.48 |                   
  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 
  extra-args.ts                        |   58.07 |       75 |      60 |   58.07 | 84-120,130-188    
  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                             |   80.37 |    77.47 |    84.9 |   80.37 | ...2079,2083-2116 
  logs.ts                              |   69.59 |    62.16 |     100 |   69.59 | ...28-129,139-140 
  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 
  signatures-cache.ts                  |   79.78 |    69.23 |    87.5 |   79.78 | ...51-260,274-275 
  types.ts                             |     100 |      100 |     100 |     100 |                   
  utils.ts                             |   77.44 |    64.17 |   81.25 |   77.44 | ...54-556,588-603 
 ccip-sdk/src/sui                      |    64.7 |    63.33 |   74.75 |    64.7 |                   
  discovery.ts                         |   47.49 |    48.27 |      60 |   47.49 | ...32-780,783-817 
  events.ts                            |   71.91 |    65.33 |    90.9 |   71.91 | ...23-436,463-474 
  exec.ts                              |   30.71 |      100 |       0 |   30.71 | 37-89,101-153     
  hasher.ts                            |   98.18 |    66.66 |     100 |   98.18 | 34,50             
  index.ts                             |    68.9 |    61.16 |   74.57 |    68.9 | ...2094,2110-2111 
  objects.ts                           |   55.24 |       84 |   83.33 |   55.24 | ...57-313,324-467 
  types.ts                             |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/sui/manuallyExec         |   53.36 |       75 |      50 |   53.36 |                   
  encoder.ts                           |    83.9 |    66.66 |     100 |    83.9 | 51-58,73-77,82    
  index.ts                             |   33.82 |      100 |       0 |   33.82 | 47-136            
 ccip-sdk/src/ton                      |   81.39 |    78.25 |   81.11 |   81.39 |                   
  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                             |   80.38 |    75.24 |   71.15 |   80.38 | ...1622,1629-1630 
  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 
---------------------------------------|---------|----------|---------|---------|-------------------

- Aptos, Sui: receive support for multiple topics/event handlers in
LogFilter.topics/getLogs
- getLogs LogFilter receives a new option `typesAndVersions`, which can
be an array of strings or regexes, calls `typeAndVersion` on the
`log.address`, and match against given set, yielding logs only if
matching
allows e.g. passing a set of topics/handlers to a set of addresses, and
getting the relevant from each
The later gets exactly (no more `precision` uncertainty interval) the
first block at or after a given timestamp, which is the precise
`startBlock` to get anything that happened at or after that point in
time
andrevmatos and others added 5 commits August 15, 2026 22:27
The dest-side loop was nested inside itself: an inner `for (const offRamp of
destOffRamps)` shadowed the outer binding and re-iterated every candidate,
calling getOnRampsForOffRamp again without the surrounding try/catch β€” so a
single offRamp with no valid source chain config propagated out of discovery
instead of being skipped.

Flatten it back to one loop, and compare ramp addresses through a helper which
ignores formatting differences (Sui/Aptos `::module` suffixes, hex padding,
case) so a match isn't missed on non-EVM lanes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sui has no usable on-chain ramp registry. `ccip_router::RouterState` maps dest
chain selectors to onramps but is left unconfigured on the public deployments
(both testnet router packages have an empty `on_ramp_package_ids`), and it is
not reachable from the ccip package anyway; `CCIPObjectRef.package_ids` only
tracks the ccip package's own versions; and neither ramp's state references the
other. The one thing both ramps agree on is the ccip package, which each
reports from `get_ccip_package_id`.

So use it as the anchor, for two things:

Discovery. Ramps are recovered from transactions which can only belong to one
deployment, newest first, each naming its ramp in `<pkg>::<module>::*` events
and PTB calls: `ccip::onramp_state_helper` calls for the onramp (every
`ccip_send` builds its `TokenTransferParams` there, so this matches sends and
nothing else), and the deployment's `CCIPObjectRef` as an input object for the
offramp. This needs no ownership, publish or upgrade history, so it works on
RPCs which prune them β€” where the previous path could not enumerate anything.

The deployer-ownership scan stays as a last resort, but is no longer primary:
shared testnet deployer keys own hundreds of objects across unrelated
deployments (150 OwnerCaps / 35 offramp packages on sui-testnet), so it costs a
page-walk plus a probe per candidate, and finds nothing once ownership moves to
MCMS. It is also cheaper now β€” a small `*Pointer`-type lookup per package
instead of a full module ABI fetch, and it stops at the first ccip match.

Router handle. The ccip state object is what both ramps report as `router`, and
every router-taking API accepts it (or a ramp, or a bare package id, resolved
through `resolveCcipStateAddress`). That makes the address printed for one
direction usable as `--router` for the other, which is what the EVM lanes
already do.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both configs returned a handful of ad-hoc fields. Report what the contracts
actually expose, mirroring the EVM shape and the field names the base
OnRampConfig/OffRampConfig interfaces ask subclasses for.

Fields come from the ramps' state objects directly β€” one `getObject` returns the
whole struct, and a `VecMap` field brings all its entries with it β€” which also
replaces the hand-rolled BCS offset parsing that read the offramp's source chain
config through a devInspect view call.

onRamp: chainSelector, feeQuoter/rmnRemote/nonceManager/tokenAdminRegistry,
feeAggregator, allowlistAdmin, owner, allowlistEnabled, allowedSenders,
destRouter, sequenceNumber, expectedNextSequenceNumber, feeQuoterConfig,
rmnRemoteConfig. offRamp: the same ccip modules plus
permissionlessExecutionThresholdSeconds, latestPriceSequenceNumber, owner,
isEnabled, minSeqNr, isRmnVerificationDisabled, rmnRemoteConfig.

Three things worth noting about the mapping:

- rmn_remote/nonce_manager/token_admin_registry/fee_quoter are not separate
  contracts. The ramps' `create_static_config`/`create_dynamic_config` hardcode
  `@ccip` for all four, since each is a module of the ccip package, so they are
  reported as `<ccipPkg>::<module>` and cost no RPC.
- the onramp's per-dest `router` is the *remote* chain's router, so it is
  reported as `destRouter`; `router` stays this deployment's handle.
- there is no `getARM()` to unwrap into a separate `rmn` as on EVM β€” Sui has no
  RMNProxy, so `ccip::rmn_remote` is itself the RMN (chainlink-sui's own relayer
  tests note the Move function does not exist). What EVM reaches through that
  indirection is reported as `rmnRemoteConfig` instead: the versioned config and
  the curse state.

An unconfigured source chain now raises CCIPSourceChainUnsupportedError instead
of reporting zeroes, which the contract's own getter returns as a default.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
discoverOffRamp matches the onRamp it was asked about against the onRamp each
candidate dest offRamp accepts, with `===`. That only holds if both sides are
formatted the same way, and they were not: the parameter is normalized with
decodeOnRampAddress (which appends `::onramp` for Sui/Aptos package addresses),
while four of the five getOffRampConfig implementations decoded their stored
onRamp with plain decodeAddress β€” Solana even shadowed the canonical helper with
a local of the same name that called decodeAddress.

For an EVM source the two are identical, which is why this stayed hidden. It
bites when the source is Sui or Aptos and the dest is any non-EVM chain: the
dest reports a bare package id, the parameter carries `::onramp`, and a lane
which exists fails to resolve.

Fix it where the addresses are produced, so every family returns the canonical
form and the comparison stays a plain equality.

Also report the (destOnRamp, offRamp, accepts) triplets considered in
CCIPOffRampNotFoundError. When a lane is half-wired β€” the dest's offRamp pairs
with a different source onRamp than the one asked about, as happens with an
abandoned deployment β€” that pairing is the whole answer, and it was previously
only visible with debug logging enabled.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
aelmanaa
aelmanaa previously approved these changes Aug 18, 2026
@andrevmatos
andrevmatos merged commit c69ae36 into main Aug 18, 2026
13 checks passed
@andrevmatos
andrevmatos deleted the feat/multi-topic-aptos-sui branch August 18, 2026 19:09

This branch was successfully deployed

1 active deployment
Preview β€” 7e9a3306 Deployed Aug 18, 2026 by vercel[bot]
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.

3 participants