Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 26 additions & 7 deletions chains/evm/deployment/v1_5_0/adapters/fees.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
evmseq "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_5_0/sequences"
"github.com/smartcontractkit/chainlink-ccip/chains/evm/gobindings/generated/v1_5_0/evm_2_evm_onramp"
"github.com/smartcontractkit/chainlink-ccip/deployment/fees"
datastore_utils "github.com/smartcontractkit/chainlink-ccip/deployment/utils/datastore"
"github.com/smartcontractkit/chainlink-ccip/deployment/utils/sequences"
cldf_chain "github.com/smartcontractkit/chainlink-deployments-framework/chain"
"github.com/smartcontractkit/chainlink-deployments-framework/datastore"
Expand Down Expand Up @@ -161,23 +162,39 @@ func (a *FeesAdapter) cacheOnRampAddress(e cldf.Environment, src uint64, dst uin
return nil
}

func (a *FeesAdapter) getOnRampAddress(e cldf.Environment, src uint64, dst uint64) (common.Address, error) {
func (a *FeesAdapter) GetFeeContractRef(e cldf.Environment, src uint64, dst uint64) (datastore.AddressRef, error) {
err := a.cacheOnRampAddress(e, src, dst)
if err != nil {
return common.Address{}, fmt.Errorf("failed to cache OnRamp address for src %d and dst %d: %w", src, dst, err)
return datastore.AddressRef{}, fmt.Errorf("failed to cache OnRamp address for src %d and dst %d: %w", src, dst, err)
}

maybeAddr := a.getOnRampAddressInCache(src, dst)
if maybeAddr == nil {
return common.Address{}, fmt.Errorf("impossible state reached - OnRamp address for src %d and dst %d not found in cache after caching", src, dst)
return datastore.AddressRef{}, fmt.Errorf("impossible state reached - OnRamp address for src %d and dst %d not found in cache after caching", src, dst)
}

cacheAddr := *maybeAddr
if cacheAddr == (common.Address{}) {
return common.Address{}, fmt.Errorf("no OnRamp address found for src %d and dst %d", src, dst)
return datastore.AddressRef{}, fmt.Errorf("no OnRamp address found for src %d and dst %d", src, dst)
}

return cacheAddr, nil
filter := datastore.AddressRef{
Type: datastore.ContractType(onramp.ContractType),
Address: cacheAddr.Hex(),
ChainSelector: src,
}
feecontractref, err := datastore_utils.FindAndFormatRef(
e.DataStore,
filter,
src,
datastore_utils.FullRef,
)

if err != nil {
return datastore.AddressRef{}, fmt.Errorf("failed to find FeeQuoter address ref for chain selector %d: %w", src, err)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return datastore.AddressRef{}, fmt.Errorf("failed to find FeeQuoter address ref for chain selector %d: %w", src, err)
return datastore.AddressRef{}, fmt.Errorf("failed to find EVM2EVMOnRamp address ref for chain selector %d: %w", src, err)

}

return feecontractref, nil
}

func (a *FeesAdapter) GetDefaultTokenTransferFeeConfig(src uint64, dst uint64) fees.TokenTransferFeeArgs {
Expand All @@ -190,11 +207,12 @@ func (a *FeesAdapter) GetOnchainTokenTransferFeeConfig(e cldf.Environment, src u
return fees.TokenTransferFeeArgs{}, fmt.Errorf("chain with selector %d not defined", src)
}

onRampAddr, err := a.getOnRampAddress(e, src, dst)
onRampRef, err := a.GetFeeContractRef(e, src, dst)
if err != nil {
return fees.TokenTransferFeeArgs{}, fmt.Errorf("failed to get OnRamp address for src %d and dst %d: %w", src, dst, err)
}

onRampAddr := common.HexToAddress(onRampRef.Address)
onRamp, err := evm_2_evm_onramp.NewEVM2EVMOnRamp(onRampAddr, chain.Client)
if err != nil {
return fees.TokenTransferFeeArgs{}, fmt.Errorf("failed to instantiate OnRamp contract at address %s on chain selector %d: %w", onRampAddr.Hex(), src, err)
Expand Down Expand Up @@ -232,10 +250,11 @@ func (a *FeesAdapter) SetTokenTransferFee(e cldf.Environment) *operations.Sequen
src := input.Selector

for dst, dstCfg := range input.Settings {
onRampAddr, err := a.getOnRampAddress(e, src, dst)
onRampRef, err := a.GetFeeContractRef(e, src, dst)
if err != nil {
return sequences.OnChainOutput{}, fmt.Errorf("failed to get OnRamp address for src %d and dst %d: %w", src, dst, err)
}
onRampAddr := common.HexToAddress(onRampRef.Address)

updatesByChain := onramp.SetTokenTransferFeeConfigInput{}
for rawTokenAddress, feeCfg := range dstCfg {
Expand Down
121 changes: 72 additions & 49 deletions chains/evm/deployment/v1_6_0/adapters/fees.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
evmseq "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_0/sequences"
"github.com/smartcontractkit/chainlink-ccip/chains/evm/gobindings/generated/v1_6_3/fee_quoter"
"github.com/smartcontractkit/chainlink-ccip/deployment/fees"
datastore_utils "github.com/smartcontractkit/chainlink-ccip/deployment/utils/datastore"
"github.com/smartcontractkit/chainlink-ccip/deployment/utils/sequences"
cldf_chain "github.com/smartcontractkit/chainlink-deployments-framework/chain"
"github.com/smartcontractkit/chainlink-deployments-framework/datastore"
Expand All @@ -29,13 +30,31 @@ func NewFeesAdapter(evmAdapter *evmseq.EVMAdapter) *FeesAdapter {
}
}

func (a *FeesAdapter) getFeeQuoterAddress(ds datastore.DataStore, src uint64) (common.Address, error) {
func (a *FeesAdapter) GetFeeContractRef(e cldf.Environment, src uint64, dst uint64) (datastore.AddressRef, error) {
ds := e.DataStore
fqAddr, err := a.evm.GetFQAddress(ds, src)
if err != nil {
return common.Address{}, fmt.Errorf("failed to get FeeQuoter address for chain selector %d: %w", src, err)
return datastore.AddressRef{}, fmt.Errorf("failed to get FeeQuoter address for chain selector %d: %w", src, err)
}

return common.BytesToAddress(fqAddr), nil
filter := datastore.AddressRef{
Type: datastore.ContractType(fqops.ContractType),
Address: common.BytesToAddress(fqAddr).Hex(),
ChainSelector: src,
}
feecontractref, err := datastore_utils.FindAndFormatRef(
ds,
filter,
src,
datastore_utils.FullRef,
)

if err != nil {
return datastore.AddressRef{}, fmt.Errorf("failed to find FeeQuoter address ref for chain selector %d: %w", src, err)

}

return feecontractref, nil
}

func (a *FeesAdapter) GetDefaultTokenTransferFeeConfig(src uint64, dst uint64) fees.TokenTransferFeeArgs {
Expand All @@ -48,11 +67,12 @@ func (a *FeesAdapter) GetOnchainTokenTransferFeeConfig(e cldf.Environment, src u
return fees.TokenTransferFeeArgs{}, fmt.Errorf("chain with selector %d not defined", src)
}

fqAddr, err := a.getFeeQuoterAddress(e.DataStore, src)
fqRef, err := a.GetFeeContractRef(e, src, dst)
if err != nil {
return fees.TokenTransferFeeArgs{}, fmt.Errorf("failed to get FeeQuoter address for chain selector %d: %w", src, err)
}

fqAddr := common.HexToAddress(fqRef.Address)
fq, err := fee_quoter.NewFeeQuoter(fqAddr, chain.Client)
if err != nil {
return fees.TokenTransferFeeArgs{}, fmt.Errorf("failed to instantiate FeeQuoter contract at address %s on chain selector %d: %w", fqAddr.Hex(), src, err)
Expand Down Expand Up @@ -89,62 +109,65 @@ func (a *FeesAdapter) SetTokenTransferFee(e cldf.Environment) *operations.Sequen
var result sequences.OnChainOutput
src := input.Selector

fqAddr, err := a.getFeeQuoterAddress(e.DataStore, src)
fqRef, err := a.GetFeeContractRef(e, src, 0) // dst is not needed to get the fee quoter address in 1.6
if err != nil {
return sequences.OnChainOutput{}, fmt.Errorf("failed to get FeeQuoter address for chain selector %d: %w", src, err)
}

updatesByChain := fqops.ApplyTokenTransferFeeConfigUpdatesArgs{}
for dst, dstCfg := range input.Settings {
var tokensToUseDefaultFeeConfigs []fqops.TokenTransferFeeConfigRemoveArgs
var tokenTransferFeeConfigs []fqops.TokenTransferFeeConfigSingleTokenArgs
for rawTokenAddress, feeCfg := range dstCfg {
if !common.IsHexAddress(rawTokenAddress) {
return sequences.OnChainOutput{}, fmt.Errorf("invalid token address for src %d and dst %d: %s", src, dst, rawTokenAddress)
fqAddr := common.HexToAddress(fqRef.Address)

updatesByChain := fqops.ApplyTokenTransferFeeConfigUpdatesArgs{}
for dst, dstCfg := range input.Settings {

Comment on lines +120 to +121
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

small nit: is it possible to revert the formatting changes on this so the diff is smaller? For context, sometimes when debugging we need to look at past PRs to see where the issue got introduced and having a smaller diff always helps!

var tokensToUseDefaultFeeConfigs []fqops.TokenTransferFeeConfigRemoveArgs
var tokenTransferFeeConfigs []fqops.TokenTransferFeeConfigSingleTokenArgs
for rawTokenAddress, feeCfg := range dstCfg {
if !common.IsHexAddress(rawTokenAddress) {
return sequences.OnChainOutput{}, fmt.Errorf("invalid token address for src %d and dst %d: %s", src, dst, rawTokenAddress)
}

token := common.HexToAddress(rawTokenAddress)
if feeCfg == nil {
tokensToUseDefaultFeeConfigs = append(
tokensToUseDefaultFeeConfigs,
fqops.TokenTransferFeeConfigRemoveArgs{
DestChainSelector: dst,
Token: token,
},
)
} else {
tokenTransferFeeConfigs = append(
tokenTransferFeeConfigs,
fqops.TokenTransferFeeConfigSingleTokenArgs{
Token: token,
TokenTransferFeeConfig: fqops.TokenTransferFeeConfig{
DestBytesOverhead: feeCfg.DestBytesOverhead,
DestGasOverhead: feeCfg.DestGasOverhead,
MinFeeUSDCents: feeCfg.MinFeeUSDCents,
MaxFeeUSDCents: feeCfg.MaxFeeUSDCents,
IsEnabled: feeCfg.IsEnabled,
DeciBps: feeCfg.DeciBps,
},
},
)
}
}

token := common.HexToAddress(rawTokenAddress)
if feeCfg == nil {
tokensToUseDefaultFeeConfigs = append(
tokensToUseDefaultFeeConfigs,
fqops.TokenTransferFeeConfigRemoveArgs{
DestChainSelector: dst,
Token: token,
},
)
} else {
tokenTransferFeeConfigs = append(
tokenTransferFeeConfigs,
fqops.TokenTransferFeeConfigSingleTokenArgs{
Token: token,
TokenTransferFeeConfig: fqops.TokenTransferFeeConfig{
DestBytesOverhead: feeCfg.DestBytesOverhead,
DestGasOverhead: feeCfg.DestGasOverhead,
MinFeeUSDCents: feeCfg.MinFeeUSDCents,
MaxFeeUSDCents: feeCfg.MaxFeeUSDCents,
IsEnabled: feeCfg.IsEnabled,
DeciBps: feeCfg.DeciBps,
},
},
)
if len(tokensToUseDefaultFeeConfigs) > 0 {
updatesByChain.TokensToUseDefaultFeeConfigs = append(updatesByChain.TokensToUseDefaultFeeConfigs, tokensToUseDefaultFeeConfigs...)
}
}

if len(tokensToUseDefaultFeeConfigs) > 0 {
updatesByChain.TokensToUseDefaultFeeConfigs = append(updatesByChain.TokensToUseDefaultFeeConfigs, tokensToUseDefaultFeeConfigs...)
if len(tokenTransferFeeConfigs) > 0 {
updatesByChain.TokenTransferFeeConfigArgs = append(updatesByChain.TokenTransferFeeConfigArgs, fqops.TokenTransferFeeConfigArgs{
TokenTransferFeeConfigs: tokenTransferFeeConfigs,
DestChainSelector: dst,
})
}
}

if len(tokenTransferFeeConfigs) > 0 {
updatesByChain.TokenTransferFeeConfigArgs = append(updatesByChain.TokenTransferFeeConfigArgs, fqops.TokenTransferFeeConfigArgs{
TokenTransferFeeConfigs: tokenTransferFeeConfigs,
DestChainSelector: dst,
})
if len(updatesByChain.TokensToUseDefaultFeeConfigs) == 0 && len(updatesByChain.TokenTransferFeeConfigArgs) == 0 {
return result, nil
}
}

if len(updatesByChain.TokensToUseDefaultFeeConfigs) == 0 && len(updatesByChain.TokenTransferFeeConfigArgs) == 0 {
return result, nil
}

result, err = sequences.RunAndMergeSequence(b, chains,
evmseq.FeeQuoterApplyTokenTransferFeeConfigUpdatesSequence,
Expand Down
8 changes: 3 additions & 5 deletions chains/evm/deployment/v1_6_0/sequences/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ var ConfigurePingPongSequence = operations.NewSequence(
)

// GetFeeQuoterAddress returns the address of the fee quoter contract for a given chain selector.
// there may be multiple fee quoter addresses for a chain selector, so we return the one with the latest version below 1.7.0
// there may be multiple fee quoter addresses for a chain selector, so we return the one with the latest version
// (the next major version on or after 1.6.0).
func GetFeeQuoterAddress(addresses []datastore.AddressRef, chainSelector uint64) (datastore.AddressRef, error) {
var refs []datastore.AddressRef
Expand All @@ -164,13 +164,11 @@ func GetFeeQuoterAddress(addresses []datastore.AddressRef, chainSelector uint64)
}
}
latestVersion := semver.MustParse("1.6.0")
tooHighVersion := semver.MustParse("1.7.0")
// tooHighVersion := semver.MustParse("1.7.0") -- to unblock prod-testnet, skip the upper bound of the check
feeQRef := datastore.AddressRef{}
for _, ref := range refs {
v := ref.Version
// we want the latest version below 1.7.0
if v.GreaterThanEqual(latestVersion) &&
v.LessThan(tooHighVersion) {
if v.GreaterThanEqual(latestVersion) {
latestVersion = v
feeQRef = ref
}
Expand Down
Loading
Loading