fix(ccip/sui): resolve RMNProxy.GetARM and seed fee_quoter prices after upgrade#22022
Closed
fix(ccip/sui): resolve RMNProxy.GetARM and seed fee_quoter prices after upgrade#22022
Conversation
…er upgrade Two independent failures cascade through the same chainaccessor batch-refresh path and zero-out the offramp OCR3 config digest, causing the CCIP commit plugin to self-reject its own reports (commit/report.go:222 "my config digest doesn't match offramp's"), making Test_CCIP_Upgrade_EVM2Sui and Test_CCIP_Upgrade_CommonPkg_EVM2Sui flaky on Sui. X. RMNProxy.GetARM → FunctionNotFound Sui chainreader config mapped MethodNameGetARM to Move function rmn_remote::get_arm, which doesn't exist in chainlink-sui's rmn_remote.move. Every refresh cycle hit FunctionNotFound in the RMN leg of the batch. On Sui the rmn_remote module lives inside the CCIP package, so the correct "ARM address" is the latest CCIP package id. Use ResponseFromInputs:["package_id"] to synthesize that response without touching chainlink-sui or Move source. Y. Sui fee_quoter has no dest-chain gas / token price state after upgrade AddLane(EVM→Sui) seeds the EVM-side fee_quoter only. No helper writes usd_per_unit_gas_by_dest_chain[EVM selector] or usd_per_token[Sui LINK] on the Sui side, so the commit plugin's observation reads abort EUnknownDestChainSelector(3) / EUnknownToken(4) from fee_quoter::*_internal. Seed those tables via FeeQuoterUpdatePricesWithOwnerCapOp against the post-upgrade (unblocked) CCIP package immediately after upgradeCCIP in both failing tests. Both failures share the batch-refresh fail-fast behavior in chainaccessor/config_processors.go: a single read error returns a zero-valued OfframpConfig, poisoning the config-digest cache. Fixing either alone still leaves the other to trigger the zero-digest cascade, so both must land together.
Contributor
|
I see you updated files related to
|
Contributor
|
✅ No conflicts with other open PRs targeting |
Collaborator
Author
|
Merging into #22016 to keep the Sui upgrade-test fix in one place. |
|
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
Fixes two independent failures in
Test_CCIP_Upgrade_EVM2SuiandTest_CCIP_Upgrade_CommonPkg_EVM2Suithat cascade through the same chainaccessor batch-refresh path and zero out the offramp OCR3 config digest, causing the CCIP commit plugin to self-reject its own reports (commit/report.go:222— "my config digest doesn't match offramp's").Root causes
X —
RMNProxy.GetARM→FunctionNotFoundSui chainreader config (
core/capabilities/ccip/configs/sui/contract_reader.go:98-101) mapsMethodNameGetARMto Move functionrmn_remote::get_arm, which does not exist inchainlink-sui/contracts/ccip/ccip/sources/rmn_remote.move(grep confirms zero definitions). Every refresh cycle fails on the RMN leg of the dest-chain batch inchainlink-ccip/pkg/chainaccessor/default_accessor.go:150-214, fail-fast processed atconfig_processors.go:107-168, returning zero-valuedOfframpConfig{}—ConfigDigest = [32]byte{}.On Sui the
rmn_remotemodule lives inside the CCIP package; the correct "ARM address" is the latest CCIP package id. Fix:ResponseFromInputs: []string{"package_id"}synthesizes that value viachainlink-suichainreader's existingexecuteFunctionplumbing (relayer/chainreader/reader/chainreader.go:927-942), no Move source change, no dep bump.Y — Sui fee_quoter price tables empty for EVM dest
AddLane(from=EVM, to=Sui)populates EVM-side fee_quoter only (deployment/ccip/changeset/testhelpers/test_helpers_solana_v0_1_0.go:943-1012— nocase chainsel.FamilySui:on thetoFamilyswitch). Sui-sideusd_per_unit_gas_by_dest_chain[EVM selector]andusd_per_token[LINK]stay empty. Commit plugin observation aborts every cycle withEUnknownDestChainSelector(3)(fee_quoter.move:1578-1581) andEUnknownToken(4)(fee_quoter.move:1569-1571). In isolation these are tolerated warnings, but in the same batch as X they compound into the same zero-digest cascade.Fix: seed via
FeeQuoterUpdatePricesWithOwnerCapOpimmediately afterupgradeCCIP(so the write targets the post-upgrade, unblocked package). Values mirrorSendSuiCCIPRequestintest_sui_helpers.go:145-168.Why both need to land together
Both reads live in the same batch in
chainaccessor.prepareDestChainRequest.processOfframpResults/processStandardChainConfigResultsare fail-fast: one bad sibling zeros the wholeOfframpConfig→ cached zero digest → plugin self-rejects → no commit txs → 22-min timeout. Fixing X alone leaves Y to trigger the same cascade (and vice versa).Evidence
Failing job 71358465085 (PR #22016 latest), log at
integration-tests/smoke/ccip/logs/2026-04-14T22-18-10_Test_CCIP_Upgrade_EVM2Sui.log:000acd0c35…) — proves read path isn't broken at the contract level.offRampConfigDigest: 0x0000…0000from poller cache → rejects own report.default_accessor.go:115errors repeat for full 22 min:get_arm: FunctionNotFoundandget_dest_chain_gas_price: EUnknownDestChainSelector.SubmitTransaction/signAndExecuteon Sui chain writer through test lifetime.Scope
core/capabilities/ccip/configs/sui/contract_reader.go— 3 linesintegration-tests/smoke/ccip/ccip_sui_upgrade_test.go— new helperseedSuiFeeQuoterForRemote, called afterupgradeCCIPin the two failing testsgo vet ./...andgo test -run=XXX -count=1 ./smoke/ccip/...clean.Relationship to #22016
Independent fix. #22016 addresses offramp→fee_quoter linkage on the commit-tx submission path (necessary to unblock transmission once reports start being produced). This PR unblocks report production in the first place. Land order doesn't matter; both are needed for the tests to go green.
Test plan
Test_CCIP_Upgrade_EVM2SuipassesTest_CCIP_Upgrade_CommonPkg_EVM2SuipassesTest_CCIP_Messaging_EVM2Sui,Test_CCIP_Upgrade_Sui2EVM,Test_CCIP_Upgrade_NoBlock_EVM2SuiResponseFromInputs:["package_id"]return the correct address for downstream RMNRemote binding (expected: yes — RMNRemote reads bind to the same CCIP package)