Skip to content
Closed
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
3 changes: 3 additions & 0 deletions ccv/chains/evm/deployment/v1_7_0/adapters/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
adapters1_6 "github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_0/adapters"

"github.com/smartcontractkit/chainlink-ccip/deployment/deploy"
ccvadapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters"
)

func init() {
Expand All @@ -22,4 +23,6 @@ func init() {
laneMigratorReg := deploy.GetLaneMigratorRegistry()
laneMigratorReg.RegisterRampUpdater(chainsel.FamilyEVM, semver.MustParse("1.7.0"), &LaneMigrator{})
laneMigratorReg.RegisterRouterUpdater(chainsel.FamilyEVM, semver.MustParse("1.2.0"), &adapters1_2.RouterUpdater{})

ccvadapters.GetTokenVerifierConfigRegistry().Register(chainsel.FamilyEVM, &EVMTokenVerifierConfigAdapter{})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package adapters

import (
"fmt"

"github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/operations/cctp_verifier"
"github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/operations/lombard_verifier"
onrampoperations "github.com/smartcontractkit/chainlink-ccip/ccv/chains/evm/deployment/v1_7_0/operations/onramp"
"github.com/smartcontractkit/chainlink-ccip/chains/evm/deployment/v1_6_0/operations/rmn_remote"
dsutil "github.com/smartcontractkit/chainlink-ccip/deployment/utils/datastore"
ccvadapters "github.com/smartcontractkit/chainlink-ccip/deployment/v1_7_0/adapters"
"github.com/smartcontractkit/chainlink-deployments-framework/datastore"
)

type EVMTokenVerifierConfigAdapter struct{}

var _ ccvadapters.TokenVerifierConfigAdapter = (*EVMTokenVerifierConfigAdapter)(nil)

func (a *EVMTokenVerifierConfigAdapter) ResolveTokenVerifierAddresses(
ds datastore.DataStore,
chainSelector uint64,
cctpQualifier string,
lombardQualifier string,
) (*ccvadapters.TokenVerifierChainAddresses, error) {
toAddress := func(ref datastore.AddressRef) (string, error) { return ref.Address, nil }

onRampAddr, err := dsutil.FindAndFormatRef(ds, datastore.AddressRef{
Type: datastore.ContractType(onrampoperations.ContractType),
}, chainSelector, toAddress)
if err != nil {
return nil, fmt.Errorf("failed to get on ramp address for chain %d: %w", chainSelector, err)
}

rmnRemoteAddr, err := dsutil.FindAndFormatRef(ds, datastore.AddressRef{
Type: datastore.ContractType(rmn_remote.ContractType),
}, chainSelector, toAddress)
if err != nil {
return nil, fmt.Errorf("failed to get rmn remote address for chain %d: %w", chainSelector, err)
}

result := &ccvadapters.TokenVerifierChainAddresses{
OnRampAddress: onRampAddr,
RMNRemoteAddress: rmnRemoteAddr,
}

cctpVerifierAddr, cctpVerifierErr := dsutil.FindAndFormatRef(ds, datastore.AddressRef{
Type: datastore.ContractType(cctp_verifier.ContractType),
Qualifier: cctpQualifier,
}, chainSelector, toAddress)

cctpResolverAddr, cctpResolverErr := dsutil.FindAndFormatRef(ds, datastore.AddressRef{
Type: datastore.ContractType(cctp_verifier.ResolverType),
Qualifier: cctpQualifier,
}, chainSelector, toAddress)

if (cctpVerifierErr == nil) != (cctpResolverErr == nil) {
return nil, fmt.Errorf(
"chain %d: cctp verifier and resolver must both exist or both be absent (verifier error: %v, resolver error: %v)",
chainSelector, cctpVerifierErr, cctpResolverErr,
)
}

if cctpVerifierErr == nil {
result.CCTPVerifierAddress = cctpVerifierAddr
result.CCTPVerifierResolverAddress = cctpResolverAddr
}

lombardResolverAddr, lombardResolverErr := dsutil.FindAndFormatRef(ds, datastore.AddressRef{
Type: datastore.ContractType(lombard_verifier.ResolverType),
Qualifier: lombardQualifier,
}, chainSelector, toAddress)

if lombardResolverErr == nil {
result.LombardVerifierResolverAddress = lombardResolverAddr
}

return result, nil
}
79 changes: 79 additions & 0 deletions deployment/v1_7_0/adapters/token_verifier_config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package adapters

import (
"fmt"
"sync"

chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/chainlink-deployments-framework/datastore"
)

type TokenVerifierChainAddresses struct {
OnRampAddress string
RMNRemoteAddress string
CCTPVerifierAddress string
CCTPVerifierResolverAddress string
LombardVerifierResolverAddress string
}

type TokenVerifierConfigAdapter interface {
ResolveTokenVerifierAddresses(
ds datastore.DataStore,
chainSelector uint64,
cctpQualifier string,
lombardQualifier string,
) (*TokenVerifierChainAddresses, error)
}

type TokenVerifierConfigRegistry struct {
mu sync.Mutex
adapters map[string]TokenVerifierConfigAdapter
}

var (
singletonTokenVerifierConfigRegistry *TokenVerifierConfigRegistry
tokenVerifierConfigRegistryOnce sync.Once
)

func NewTokenVerifierConfigRegistry() *TokenVerifierConfigRegistry {
return &TokenVerifierConfigRegistry{
adapters: make(map[string]TokenVerifierConfigAdapter),
}
}

func GetTokenVerifierConfigRegistry() *TokenVerifierConfigRegistry {
tokenVerifierConfigRegistryOnce.Do(func() {
singletonTokenVerifierConfigRegistry = NewTokenVerifierConfigRegistry()
})
return singletonTokenVerifierConfigRegistry
}

func (r *TokenVerifierConfigRegistry) Register(family string, a TokenVerifierConfigAdapter) {
if a == nil {
return
}
r.mu.Lock()
defer r.mu.Unlock()
if _, exists := r.adapters[family]; !exists {
r.adapters[family] = a
}
}

func (r *TokenVerifierConfigRegistry) Get(family string) (TokenVerifierConfigAdapter, bool) {
r.mu.Lock()
defer r.mu.Unlock()
a, ok := r.adapters[family]
return a, ok
}

func (r *TokenVerifierConfigRegistry) GetByChain(chainSelector uint64) (TokenVerifierConfigAdapter, error) {
family, err := chainsel.GetSelectorFamily(chainSelector)
if err != nil {
return nil, fmt.Errorf("failed to get chain family for selector %d: %w", chainSelector, err)
}
adapter, ok := r.Get(family)
if !ok {
return nil, fmt.Errorf("no token verifier config adapter registered for chain family %q", family)
}
return adapter, nil
}
Loading
Loading