Skip to content

Commit ab058dd

Browse files
committed
Add map from version -> adapter / input for batching sequences to execute
1 parent 3289612 commit ab058dd

File tree

1 file changed

+53
-29
lines changed

1 file changed

+53
-29
lines changed

deployment/fees/set_token_transfer_fee.go

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)