@@ -112,26 +112,30 @@ func makeApply(feeRegistry *FeeAdapterRegistry, mcmsRegistry *changesets.MCMSRea
112112 return cldf.ChangesetOutput {}, fmt .Errorf ("no fee adapter found for chain family %s and version %s" , srcFamily , cfg .Version .String ())
113113 }
114114
115- // Retreieve correct contract Go bindings to use in sequence execution
116- if len (src .Settings ) == 0 {
117- return cldf.ChangesetOutput {}, fmt .Errorf ("no destination settings provided for selector %d" , src .Selector )
118- }
119- feeContractRef , err := adapter .GetFeeContractRef (e , src .Selector , src .Settings [0 ].Selector ) // feeContractRef is only used for verifying which GoBindings to use
120- if err != nil {
121- return cldf.ChangesetOutput {}, fmt .Errorf ("failed to get fee contract ref for src %d and dst %d: %w" , src .Selector , src .Settings [0 ].Selector , err )
122- }
123-
124- v := feeContractRef .Version
125- lookupVersion := semver .MustParse (fmt .Sprintf ("%d.%d.0" , v .Major (), v .Minor ()))
126-
127- updater , exists := feeRegistry .GetFeeAdapter (srcFamily , lookupVersion )
128- if ! exists {
129- return cldf.ChangesetOutput {}, fmt .Errorf ("no fee adapter found for chain family %s and version %s" , srcFamily , feeContractRef .Version .String ())
130- }
115+ // Build version-grouped settings: version -> settings map
116+ versionGroups := map [string ]struct {
117+ version * semver.Version
118+ adapter FeeAdapter
119+ settings map [uint64 ]map [string ]* TokenTransferFeeArgs
120+ }{}
131121
132122 settings := map [uint64 ]map [string ]* TokenTransferFeeArgs {}
133123 for _ , dst := range src .Settings {
134124
125+ feeContractRef , err := adapter .GetFeeContractRef (e , src .Selector , dst .Selector )
126+ if err != nil {
127+ return cldf.ChangesetOutput {}, fmt .Errorf ("failed to get fee contract ref for src %d and dst %d: %w" , src .Selector , src .Settings [0 ].Selector , err )
128+ }
129+
130+ // Normalize fee contract version to major.minor.0 for adapter lookup, as patch versions should not affect compatibility
131+ v := feeContractRef .Version
132+ lookupVersion := semver .MustParse (fmt .Sprintf ("%d.%d.0" , v .Major (), v .Minor ()))
133+
134+ updater , exists := feeRegistry .GetFeeAdapter (srcFamily , lookupVersion )
135+ if ! exists {
136+ return cldf.ChangesetOutput {}, fmt .Errorf ("no fee adapter found for chain family %s and version %s" , srcFamily , feeContractRef .Version .String ())
137+ }
138+
135139 settings [dst .Selector ] = map [string ]* TokenTransferFeeArgs {}
136140 for _ , feeCfg := range dst .Settings {
137141 if args , err := inferTokenTransferFeeArgs (adapter , e , src .Selector , dst .Selector , feeCfg ); err != nil {
@@ -140,23 +144,43 @@ func makeApply(feeRegistry *FeeAdapterRegistry, mcmsRegistry *changesets.MCMSRea
140144 settings [dst.Selector ][feeCfg.Address ] = args
141145 }
142146 }
147+
148+ versionKey := lookupVersion .String ()
149+ if _ , exists := versionGroups [versionKey ]; ! exists {
150+ versionGroups [versionKey ] = struct {
151+ version * semver.Version
152+ adapter FeeAdapter
153+ settings map [uint64 ]map [string ]* TokenTransferFeeArgs
154+ }{
155+ version : feeContractRef .Version ,
156+ adapter : updater ,
157+ settings : map [uint64 ]map [string ]* TokenTransferFeeArgs {},
158+ }
159+ }
160+
161+ // Process settings for this dst with its version's adapter
162+ versionGroups [versionKey ].settings [dst .Selector ] = settings [dst .Selector ]
143163 }
144164
145- report , err := cldf_ops .ExecuteSequence (
146- e .OperationsBundle ,
147- updater .SetTokenTransferFee (e ),
148- e .BlockChains ,
149- SetTokenTransferFeeSequenceInput {
150- Selector : src .Selector ,
151- Settings : settings ,
152- },
153- )
154- if err != nil {
155- return cldf.ChangesetOutput {}, fmt .Errorf ("failed to set token transfer fee config for selector %d: %w" , src .Selector , err )
165+ // Execute updates grouped by adapter version
166+ for _ , group := range versionGroups {
167+ report , err := cldf_ops .ExecuteSequence (
168+ e .OperationsBundle ,
169+ group .adapter .SetTokenTransferFee (e ),
170+ e .BlockChains ,
171+ SetTokenTransferFeeSequenceInput {
172+ Selector : src .Selector ,
173+ Settings : group .settings ,
174+ },
175+ )
176+ if err != nil {
177+ return cldf.ChangesetOutput {}, fmt .Errorf ("failed to set token transfer fee config for selector %d: %w" , src .Selector , err )
178+ }
179+
180+ batchOps = append (batchOps , report .Output .BatchOps ... )
181+ reports = append (reports , report .ExecutionReports ... )
156182 }
157183
158- batchOps = append (batchOps , report .Output .BatchOps ... )
159- reports = append (reports , report .ExecutionReports ... )
160184 }
161185
162186 return changesets .NewOutputBuilder (e , mcmsRegistry ).
0 commit comments