fix(ccip/sui): link upgraded offramp against upgraded ccip pkg#22016
Closed
fix(ccip/sui): link upgraded offramp against upgraded ccip pkg#22016
Conversation
Contributor
|
✅ No conflicts with other open PRs targeting |
This was referenced Apr 14, 2026
Contributor
|
I see you updated files related to
|
0d3d806 to
074a87a
Compare
Two independent bugs compound into a config-digest cache poisoning + on-chain commit tx revert, manifesting as intermittent 20-min timeouts in Test_CCIP_Upgrade_EVM2Sui and Test_CCIP_Upgrade_CommonPkg_EVM2Sui. 1. upgradeSuiOffRamp compiled offramp v2 with "ccip": state.CCIPAddress (v1 pkg). Sui Move captures linkage at compile time, so offramp v2 dispatched fee_quoter::update_prices into the v1 fee_quoter (VERSION=2). After BlockVersion(fee_quoter, v=2), commit reports carrying price updates aborted on verify_function_allowed and the whole tx reverted. Intermittent because OCR commit rounds decide per-report whether to include price updates. Fix: point ccip at CCIPMockV2PackageId and supply original_ccip_pkg = CCIPAddress for Sui's upgrade validator. 2. The Sui chain-reader config mapped MethodNameGetARM to Move function rmn_remote::get_arm, which does not exist in chainlink-sui (rmn_remote lives inside the CCIP package, no proxy indirection). Every config-refresh batch failed with FunctionNotFound, and chainlink-ccip's DefaultAccessor.GetAllConfigsLegacy replaces the whole ChainConfigSnapshot with zeros on any sub-read error, caching it as a valid result. offRampConfigDigest came back as 0x0, the commit plugin self-rejected every report via ShouldAcceptAttestedReport. Fix: synthesize the response via ResponseFromInputs:["package_id"] — on Sui the correct "ARM address" is the latest CCIP package id. Empirically validated: 6 consecutive CI passes of both tests with this fix; A alone was previously red with the digest=0x0 cache-poison signature. A workaround that seeded Sui fee_quoter prices after upgrade was tested and proven inert, then dropped. Closes CORE-2414.
67ed406 to
2785b88
Compare
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.





Summary
Resolves intermittent 20-min timeouts in
Test_CCIP_Upgrade_EVM2SuiandTest_CCIP_Upgrade_CommonPkg_EVM2Sui((sui) timed out after waiting for commit report). Two Sui-specific bugs independently gate commit-report delivery; both must be fixed together.Issue 1 — offramp v2 linked against v1 ccip pkg
upgradeSuiOffRampcompiled offramp v2 with"ccip": state.CCIPAddress(v1 pkg) in the named-address map. Sui Move captures linkage at compile time, so offramp v2 dispatchedfee_quoter::update_pricesinto the v1 fee_quoter (VERSION=2). AfterBlockVersion(fee_quoter, v=2), commit reports carrying price updates aborted onverify_function_allowedand the whole tx reverted. The flake surfaces because OCR decides per-round whether to include price updates — empty-price rounds committed cleanly, price-carrying rounds reverted.Fix: point
ccipatCCIPMockV2PackageId. Supplyoriginal_ccip_pkg: CCIPAddressso Sui's upgrade validator accepts the dep swap (Published.tomloriginal-id must match on-chain).Issue 2 —
RMNProxy.GetARMreferences a Move function that doesn't existThe Sui chain-reader config mapped
MethodNameGetARMto Move functionrmn_remote::get_arm, which is not defined inchainlink-sui/contracts/ccip/ccip/sources/rmn_remote.move. On Suirmn_remotelives inside the CCIP package — there is no proxy indirection, so there's noget_armto call.Every config-refresh batch failed on the RMN leg.
chainlink-ccip'sDefaultAccessor.GetAllConfigsLegacycatches that error, replaces the entireChainConfigSnapshotwith a zero-valued struct, and returns nil;configPollerV2caches it as if successful.GetOffRampConfigDigestthen returns0x0, the commit plugin self-rejects every report atcommit/report.go:221, and nothing transmits.Fix:
ResponseFromInputs: []string{"package_id"}on theGetARMbinding synthesizes the response via chainlink-sui's existingexecuteFunctionshort-circuit — the correct "ARM address" on Sui is the latest CCIP package id sincermn_remotelives there.Evidence (pre-fix failing log)
integration-tests/smoke/ccip/logs/2026-04-14T22-18-10_Test_CCIP_Upgrade_EVM2Sui.log:default_accessor.go:115 "failed to process standard chain config results" err="... get_arm: FunctionNotFound in command 0"config_poller_v2.go:464caching snapshot withConfigDigest=0x000…0"my config digest doesn't match offramp's config digest"warning immediately followsofframp::latest_config_detailsreturned the correct digest0x000acd0c35…— confirming the0x0is cache-poisoning, not a contract issueSubmitTransactioncalls on the Sui chain writer across the 22-min runCI
Previously red with the digest-zero signature. Post-fix: 6 consecutive CI runs of both tests green.
P(6 passes | 50% flake rate) = 1.6%— empirical null rejected.Follow-up (out of scope)
chainlink-ccip/pkg/chainaccessor/config_processors.gois fail-fast across all reads in the dest-chain batch — one broken view zeros the wholeChainConfigSnapshot, exposing every non-EVM family to the same fragility. Worth a separate PR to isolate per-contract failures.Closes CORE-2414.