Skip to content

Commit 68b3b3b

Browse files
authored
Merge branch 'main' into fix/set-token-transfer-fee-fq2.0
2 parents 1f6e7d1 + f588f8d commit 68b3b3b

File tree

7 files changed

+67
-45
lines changed

7 files changed

+67
-45
lines changed

chains/evm/deployment/v1_6_0/sequences/token_and_pools.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ func (a *EVMAdapter) ConfigureTokenForTransfersSequence() *cldf_ops.Sequence[tok
5252
if !common.IsHexAddress(input.TokenPoolAddress) {
5353
return sequences.OnChainOutput{}, fmt.Errorf("token pool address %q is not a valid hex address", input.TokenPoolAddress)
5454
}
55-
if !common.IsHexAddress(input.RegistryAddress) {
56-
return sequences.OnChainOutput{}, fmt.Errorf("registry address %q is not a valid hex address", input.RegistryAddress)
57-
}
5855

5956
tpAddr := common.HexToAddress(input.TokenPoolAddress)
6057
if tpAddr == (common.Address{}) {

chains/evm/deployment/v2_0_0/adapters/feequoterupdater.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,23 @@ func (fqu FeeQuoterUpdater[FeeQUpdateArgs]) SequenceFeeQuoterInputCreation() *cl
2929
if !ok {
3030
return zero, fmt.Errorf("chain with selector %d not found in environment", input.ChainSelector)
3131
}
32-
// get the FeeQuoterUpdateOutput from both v1.6.0 and v1.5.0 sequences and combine them to create the input for the fee quoter update sequence
33-
report, err := cldf_ops.ExecuteSequence(b, fqseq.CreateFeeQuoterUpdateInputFromV16x, chain, input)
34-
if err != nil {
35-
return zero, fmt.Errorf("failed to create FeeQuoterUpdateInput from v1.6.0: %w", err)
36-
}
37-
output16 := report.Output
38-
39-
report15, err := cldf_ops.ExecuteSequence(b, fqseq.CreateFeeQuoterUpdateInputFromV150, chain, input)
40-
if err != nil {
41-
return zero, fmt.Errorf("failed to create FeeQuoterUpdateInput from v1.5.0: %w", err)
32+
var output16, output15 fqseq.FeeQuoterUpdate
33+
for _, version := range input.PreviousVersions {
34+
switch version.String() {
35+
case "1.6.0":
36+
report, err := cldf_ops.ExecuteSequence(b, fqseq.CreateFeeQuoterUpdateInputFromV16x, chain, input)
37+
if err != nil {
38+
return zero, fmt.Errorf("failed to create FeeQuoterUpdateInput from v1.6.0: %w", err)
39+
}
40+
output16 = report.Output
41+
case "1.5.0":
42+
report15, err := cldf_ops.ExecuteSequence(b, fqseq.CreateFeeQuoterUpdateInputFromV150, chain, input)
43+
if err != nil {
44+
return zero, fmt.Errorf("failed to create FeeQuoterUpdateInput from v1.5.0: %w", err)
45+
}
46+
output15 = report15.Output
47+
}
4248
}
43-
output15 := report15.Output
4449
// combine the outputs from both sequences to create the input for the fee quoter update sequence
4550
out, err := fqseq.MergeFeeQuoterUpdateOutputs(output16, output15)
4651
if err != nil {

chains/evm/deployment/v2_0_0/sequences/fee_quoter.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,27 @@ var (
519519
// output16 takes precedence and output15 fills in only missing entries.
520520
func MergeFeeQuoterUpdateOutputs(output16, output15 FeeQuoterUpdate) (FeeQuoterUpdate, error) {
521521
result := output16
522+
empty16, err := output16.IsEmpty()
523+
if err != nil {
524+
return FeeQuoterUpdate{}, fmt.Errorf("failed to check if output16 is empty: %w", err)
525+
}
526+
empty15, err := output15.IsEmpty()
527+
if err != nil {
528+
return FeeQuoterUpdate{}, fmt.Errorf("failed to check if output15 is empty: %w", err)
529+
}
522530

531+
if empty16 && empty15 {
532+
return FeeQuoterUpdate{}, nil
533+
}
534+
535+
// if output16 is empty, we can just return output15
536+
if empty16 {
537+
return output15, nil
538+
}
539+
// if output15 is empty, we can just return output16
540+
if empty15 {
541+
return output16, nil
542+
}
523543
// ConstructorArgs: use output15 if output16 is empty
524544
if IsConstructorArgsEmpty(result.ConstructorArgs) {
525545
result.ConstructorArgs = output15.ConstructorArgs

chains/evm/deployment/v2_0_0/sequences/sequence_fee_quoter_input_creation_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,10 @@ func TestSequenceFeeQuoterInputCreation(t *testing.T) {
821821
if chainSelector == 5009297550715157269 {
822822
input.RemoteChainSelectors = []uint64{15971525489660198786}
823823
}
824+
input.PreviousVersions = []*semver.Version{
825+
semver.MustParse("1.5.0"),
826+
semver.MustParse("1.6.0"),
827+
}
824828
// Execute the sequence
825829
report, err := cldf_ops.ExecuteSequence(
826830
e.OperationsBundle,

deployment/deploy/feequoterupdater.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,12 @@ type AdditionalFeeQuoterConfig struct {
4444
}
4545

4646
type FeeQuoterUpdateInput struct {
47-
ChainSelector uint64
48-
ExistingAddresses []datastore.AddressRef
47+
ChainSelector uint64
48+
ExistingAddresses []datastore.AddressRef
49+
// PreviousVersions lists the supported config-importer / lane versions that
50+
// should be consulted when deriving the FeeQuoter configuration for this chain.
51+
// It does NOT refer to previous FeeQuoter contract deployment versions.
52+
PreviousVersions []*semver.Version
4953
RemoteChainSelectors []uint64
5054
AdditionalConfig *AdditionalFeeQuoterConfig
5155
ContractMeta []datastore.ContractMetadata
@@ -330,6 +334,7 @@ func updateFeeQuoterApply() func(cldf.Environment, UpdateFeeQuoterInput) (cldf.C
330334
RemoteChainSelectors: perChainInput.RemoteChainSelectors,
331335
TimelockAddress: timelockAddr,
332336
AdditionalConfig: perChainInput.FeeQuoterConfig,
337+
PreviousVersions: configImporterVersions,
333338
})
334339
if err != nil {
335340
return cldf.ChangesetOutput{}, fmt.Errorf("failed to create FeeQuoterUpdateInput for chain %d: %w", chainSel, err)

deployment/tokens/configure_tokens_for_transfers.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,16 @@ func processTokenConfigForChain(e deployment.Environment, cfg map[uint64]TokenTr
8686
if err != nil {
8787
return nil, nil, nil, fmt.Errorf("failed to resolve token pool ref on chain with selector %d: %w", selector, err)
8888
}
89-
registry, err := datastore_utils.FindAndFormatRef(e.DataStore, token.RegistryRef, selector, datastore_utils.FullRef)
90-
if err != nil {
91-
return nil, nil, nil, fmt.Errorf("failed to resolve registry ref on chain with selector %d: %w", selector, err)
89+
90+
var registryAddr string
91+
if datastore_utils.IsAddressRefEmpty(token.RegistryRef) {
92+
e.Logger.Warnf("Registry ref is empty for chain selector %d. We will rely on the underlying adapter to resolve this field.", selector)
93+
} else {
94+
if registry, err := datastore_utils.FindAndFormatRef(e.DataStore, token.RegistryRef, selector, datastore_utils.FullRef); err != nil {
95+
return nil, nil, nil, fmt.Errorf("failed to resolve registry ref on chain with selector %d: %w", selector, err)
96+
} else {
97+
registryAddr = registry.Address
98+
}
9299
}
93100

94101
family, err := chain_selectors.GetSelectorFamily(selector)
@@ -129,7 +136,7 @@ func processTokenConfigForChain(e deployment.Environment, cfg map[uint64]TokenTr
129136
TokenPoolAddress: tokenPool.Address,
130137
RemoteChains: remoteChains,
131138
ExternalAdmin: token.ExternalAdmin,
132-
RegistryAddress: registry.Address,
139+
RegistryAddress: registryAddr,
133140
TokenRef: token.TokenRef,
134141
PoolType: tokenPool.Type.String(),
135142
ExistingDataStore: e.DataStore,

integration-tests/deployment/tokens_and_token_pools_test.go

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ func TestTokensAndTokenPools(t *testing.T) {
480480
TokenExpansionInputPerChain: map[uint64]tokensapi.TokenExpansionInputPerChain{
481481
evmA.Chain.Selector: {
482482
SkipOwnershipTransfer: true, // https://smartcontract-it.atlassian.net/browse/NONEVM-2902
483-
TokenPoolVersion: v1_6_0,
483+
TokenPoolVersion: v1_6_0,
484484
TokenTransferConfig: &tokensapi.TokenTransferConfig{
485485
ChainSelector: evmA.Chain.Selector,
486486
TokenPoolRef: datastore.AddressRef{
@@ -489,10 +489,7 @@ func TestTokensAndTokenPools(t *testing.T) {
489489
Type: datastore.ContractType(evmTokenPoolType),
490490
Version: v1_5_1,
491491
},
492-
RegistryRef: datastore.AddressRef{
493-
ChainSelector: evmA.Chain.Selector,
494-
Address: evmA.TAR.Address().Hex(),
495-
},
492+
RegistryRef: datastore.AddressRef{}, // inferred
496493
RemoteChains: map[uint64]tokensapi.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]{
497494
evmB.Chain.Selector: {
498495
OutboundRateLimiterConfig: defaultRL,
@@ -502,7 +499,7 @@ func TestTokensAndTokenPools(t *testing.T) {
502499
},
503500
evmB.Chain.Selector: {
504501
SkipOwnershipTransfer: true, // https://smartcontract-it.atlassian.net/browse/NONEVM-2902
505-
TokenPoolVersion: v1_6_0,
502+
TokenPoolVersion: v1_6_0,
506503
TokenTransferConfig: &tokensapi.TokenTransferConfig{
507504
ChainSelector: evmB.Chain.Selector,
508505
TokenPoolRef: datastore.AddressRef{
@@ -511,10 +508,7 @@ func TestTokensAndTokenPools(t *testing.T) {
511508
Type: datastore.ContractType(evmTokenPoolType),
512509
Version: v1_5_1,
513510
},
514-
RegistryRef: datastore.AddressRef{
515-
ChainSelector: evmB.Chain.Selector,
516-
Address: evmB.TAR.Address().Hex(),
517-
},
511+
RegistryRef: datastore.AddressRef{}, // inferred
518512
RemoteChains: map[uint64]tokensapi.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]{
519513
evmA.Chain.Selector: {
520514
OutboundRateLimiterConfig: defaultRL,
@@ -804,11 +798,7 @@ func TestTokensAndTokenPools(t *testing.T) {
804798
ChainSelector: solbnm.Chain.Selector,
805799
Address: tokenAddr.Address,
806800
},
807-
RegistryRef: datastore.AddressRef{
808-
ChainSelector: solbnm.Chain.Selector,
809-
Address: routerProgramId.String(),
810-
Version: v1_6_0,
811-
},
801+
RegistryRef: datastore.AddressRef{}, // inferred
812802
RemoteChains: map[uint64]tokensapi.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]{
813803
evmA.Chain.Selector: {
814804
OutboundRateLimiterConfig: defaultRL,
@@ -821,7 +811,7 @@ func TestTokensAndTokenPools(t *testing.T) {
821811
},
822812
evmA.Chain.Selector: {
823813
SkipOwnershipTransfer: true, // https://smartcontract-it.atlassian.net/browse/NONEVM-2902
824-
TokenPoolVersion: v1_6_0,
814+
TokenPoolVersion: v1_6_0,
825815
TokenTransferConfig: &tokensapi.TokenTransferConfig{
826816
ChainSelector: evmA.Chain.Selector,
827817
TokenPoolRef: datastore.AddressRef{
@@ -830,10 +820,7 @@ func TestTokensAndTokenPools(t *testing.T) {
830820
Type: datastore.ContractType(evmTokenPoolType),
831821
Version: v1_5_1,
832822
},
833-
RegistryRef: datastore.AddressRef{
834-
ChainSelector: evmA.Chain.Selector,
835-
Address: evmA.TAR.Address().Hex(),
836-
},
823+
RegistryRef: datastore.AddressRef{}, // inferred
837824
RemoteChains: map[uint64]tokensapi.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]{
838825
solbnm.Chain.Selector: {
839826
OutboundRateLimiterConfig: defaultRL,
@@ -843,7 +830,7 @@ func TestTokensAndTokenPools(t *testing.T) {
843830
},
844831
evmB.Chain.Selector: {
845832
SkipOwnershipTransfer: true, // https://smartcontract-it.atlassian.net/browse/NONEVM-2902
846-
TokenPoolVersion: v1_6_0,
833+
TokenPoolVersion: v1_6_0,
847834
TokenTransferConfig: &tokensapi.TokenTransferConfig{
848835
ChainSelector: evmB.Chain.Selector,
849836
TokenPoolRef: datastore.AddressRef{
@@ -852,10 +839,7 @@ func TestTokensAndTokenPools(t *testing.T) {
852839
Type: datastore.ContractType(evmTokenPoolType),
853840
Version: v1_5_1,
854841
},
855-
RegistryRef: datastore.AddressRef{
856-
ChainSelector: evmB.Chain.Selector,
857-
Address: evmB.TAR.Address().Hex(),
858-
},
842+
RegistryRef: datastore.AddressRef{}, // inferred
859843
RemoteChains: map[uint64]tokensapi.RemoteChainConfig[*datastore.AddressRef, datastore.AddressRef]{
860844
solbnm.Chain.Selector: {
861845
OutboundRateLimiterConfig: defaultRL,

0 commit comments

Comments
 (0)