Skip to content

Commit 05e1308

Browse files
committed
CCIP - Create chain accessor factory
1 parent 9f25766 commit 05e1308

File tree

24 files changed

+229
-27
lines changed

24 files changed

+229
-27
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ccipaptos
2+
3+
import (
4+
"github.com/smartcontractkit/chainlink-ccip/pkg/chainaccessor"
5+
"github.com/smartcontractkit/chainlink-ccip/pkg/contractreader"
6+
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
7+
"github.com/smartcontractkit/chainlink-common/pkg/logger"
8+
"github.com/smartcontractkit/chainlink-common/pkg/loop"
9+
"github.com/smartcontractkit/chainlink-common/pkg/types"
10+
)
11+
12+
// AptosChainAccessorFactory implements cciptypes.ChainAccessorFactory for Aptos chains.
13+
type AptosChainAccessorFactory struct{}
14+
15+
// NewChainAccessor creates a new chain accessor to be used for Aptos chains.
16+
func (f AptosChainAccessorFactory) NewChainAccessor(
17+
lggr logger.Logger,
18+
_ loop.Relayer,
19+
chainSelector cciptypes.ChainSelector,
20+
contractReader types.ContractReader,
21+
contractWriter types.ContractWriter,
22+
addrCodec cciptypes.AddressCodec,
23+
) (cciptypes.ChainAccessor, error) {
24+
return chainaccessor.NewDefaultAccessor(
25+
lggr,
26+
chainSelector,
27+
contractreader.NewExtendedContractReader(contractReader),
28+
contractWriter,
29+
addrCodec,
30+
)
31+
}

core/capabilities/ccip/ccipaptos/pluginconfig.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func initializePluginConfig(lggr logger.Logger, extraDataCodec ccipcommon.ExtraD
1919
GasEstimateProvider: NewGasEstimateProvider(),
2020
RMNCrypto: nil,
2121
ContractTransmitterFactory: ocrimpls.NewAptosContractTransmitterFactory(extraDataCodec),
22+
ChainAccessorFactory: AptosChainAccessorFactory{},
2223
ChainRW: ChainCWProvider{},
2324
ExtraDataCodec: ExtraDataDecoder{},
2425
AddressCodec: AddressCodec{},
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ccipevm
2+
3+
import (
4+
"github.com/smartcontractkit/chainlink-ccip/pkg/chainaccessor"
5+
"github.com/smartcontractkit/chainlink-ccip/pkg/contractreader"
6+
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
7+
"github.com/smartcontractkit/chainlink-common/pkg/logger"
8+
"github.com/smartcontractkit/chainlink-common/pkg/loop"
9+
"github.com/smartcontractkit/chainlink-common/pkg/types"
10+
)
11+
12+
// EVMChainAccessorFactory implements cciptypes.ChainAccessorFactory for EVM chains.
13+
type EVMChainAccessorFactory struct{}
14+
15+
// NewChainAccessor creates a new chain accessor to be used for EVM chains.
16+
func (f EVMChainAccessorFactory) NewChainAccessor(
17+
lggr logger.Logger,
18+
_ loop.Relayer,
19+
chainSelector cciptypes.ChainSelector,
20+
contractReader types.ContractReader,
21+
contractWriter types.ContractWriter,
22+
addrCodec cciptypes.AddressCodec,
23+
) (cciptypes.ChainAccessor, error) {
24+
return chainaccessor.NewDefaultAccessor(
25+
lggr,
26+
chainSelector,
27+
contractreader.NewExtendedContractReader(contractReader),
28+
contractWriter,
29+
addrCodec,
30+
)
31+
}

core/capabilities/ccip/ccipevm/pluginconfig.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func InitializePluginConfig(lggr logger.Logger, extraDataCodec ccipcommon.ExtraD
2121
GasEstimateProvider: NewGasEstimateProvider(extraDataCodec),
2222
RMNCrypto: NewEVMRMNCrypto(logger.Sugared(lggr).Named(chainsel.FamilyEVM).Named("RMNCrypto")),
2323
ContractTransmitterFactory: ocrimpls.NewEVMContractTransmitterFactory(extraDataCodec),
24+
ChainAccessorFactory: EVMChainAccessorFactory{},
2425
ChainRW: ChainCWProvider{},
2526
ExtraDataCodec: ExtraDataDecoder{},
2627
AddressCodec: AddressCodec{},
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ccipsolana
2+
3+
import (
4+
"github.com/smartcontractkit/chainlink-ccip/pkg/chainaccessor"
5+
"github.com/smartcontractkit/chainlink-ccip/pkg/contractreader"
6+
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
7+
"github.com/smartcontractkit/chainlink-common/pkg/logger"
8+
"github.com/smartcontractkit/chainlink-common/pkg/loop"
9+
"github.com/smartcontractkit/chainlink-common/pkg/types"
10+
)
11+
12+
// SolanaChainAccessorFactory implements cciptypes.ChainAccessorFactory for Solana chains.
13+
type SolanaChainAccessorFactory struct{}
14+
15+
// NewChainAccessor creates a new chain accessor to be used for Solana chains.
16+
func (f SolanaChainAccessorFactory) NewChainAccessor(
17+
lggr logger.Logger,
18+
_ loop.Relayer,
19+
chainSelector cciptypes.ChainSelector,
20+
contractReader types.ContractReader,
21+
contractWriter types.ContractWriter,
22+
addrCodec cciptypes.AddressCodec,
23+
) (cciptypes.ChainAccessor, error) {
24+
return chainaccessor.NewDefaultAccessor(
25+
lggr,
26+
chainSelector,
27+
contractreader.NewExtendedContractReader(contractReader),
28+
contractWriter,
29+
addrCodec,
30+
)
31+
}

core/capabilities/ccip/ccipsolana/pluginconfig.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func InitializePluginConfig(lggr logger.Logger, extraDataCodec ccipcommon.ExtraD
2121
RMNCrypto: nil,
2222
ContractTransmitterFactory: ocrimpls.NewSVMContractTransmitterFactory(extraDataCodec),
2323
AddressCodec: AddressCodec{},
24+
ChainAccessorFactory: SolanaChainAccessorFactory{},
2425
ChainRW: ChainRWProvider{},
2526
ExtraDataCodec: ExtraDataDecoder{},
2627
PriceOnlyCommitFn: consts.MethodCommitPriceOnly,
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package ccipton
2+
3+
import (
4+
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
5+
"github.com/smartcontractkit/chainlink-common/pkg/logger"
6+
"github.com/smartcontractkit/chainlink-common/pkg/loop"
7+
"github.com/smartcontractkit/chainlink-common/pkg/types"
8+
)
9+
10+
// TONChainAccessorFactory implements cciptypes.ChainAccessorFactory for TON chains.
11+
type TONChainAccessorFactory struct{}
12+
13+
// NewChainAccessor creates a new chain accessor to be used for TON chains.
14+
func (f TONChainAccessorFactory) NewChainAccessor(
15+
lggr logger.Logger,
16+
relayer loop.Relayer,
17+
chainSelector cciptypes.ChainSelector,
18+
_ types.ContractReader,
19+
_ types.ContractWriter,
20+
addrCodec cciptypes.AddressCodec,
21+
) (cciptypes.ChainAccessor, error) {
22+
// TODO(NONEVM-1460): Implement TON chain accessor using TONService from relayer.
23+
panic("implement me")
24+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package common
2+
3+
import (
4+
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
5+
"github.com/smartcontractkit/chainlink-common/pkg/logger"
6+
"github.com/smartcontractkit/chainlink-common/pkg/loop"
7+
"github.com/smartcontractkit/chainlink-common/pkg/types"
8+
)
9+
10+
type ChainAccessorFactory interface {
11+
NewChainAccessor(
12+
lggr logger.Logger,
13+
relayer loop.Relayer,
14+
chainSelector cciptypes.ChainSelector,
15+
contractReader types.ContractReader,
16+
contractWriter types.ContractWriter,
17+
addrCodec cciptypes.AddressCodec,
18+
) (cciptypes.ChainAccessor, error)
19+
}

core/capabilities/ccip/common/pluginconfig.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
88
"github.com/smartcontractkit/chainlink-common/pkg/logger"
9+
910
cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
1011
)
1112

@@ -18,6 +19,7 @@ type PluginConfig struct {
1819
GasEstimateProvider cciptypes.EstimateProvider
1920
RMNCrypto cciptypes.RMNCrypto
2021
ContractTransmitterFactory cctypes.ContractTransmitterFactory
22+
ChainAccessorFactory ChainAccessorFactory
2123
// PriceOnlyCommitFn optional method override for price only commit reports.
2224
PriceOnlyCommitFn string
2325
ChainRW ChainRWProvider

core/capabilities/ccip/oraclecreator/plugin.go

Lines changed: 67 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,12 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c
184184
return nil, fmt.Errorf("failed to create readers and writers: %w", err)
185185
}
186186

187+
// Create chain accessors
188+
chainAccessors, err := i.createChainAccessors(contractReaders, chainWriters, pluginServices)
189+
if err != nil {
190+
return nil, fmt.Errorf("failed to create chain accessors: %w", err)
191+
}
192+
187193
// build the onchain keyring. it will be the signing key for the destination chain family.
188194
keybundle, ok := i.ocrKeyBundles[destChainFamily]
189195
if !ok {
@@ -211,7 +217,19 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c
211217

212218
// TODO: Extract the correct transmitter address from the destsFromAccount
213219
factory, transmitter, err := i.createFactoryAndTransmitter(
214-
donID, config, destRelayID, contractReaders, chainWriters, destChainWriter, destFromAccounts, publicConfig, destChainID, pluginServices.PluginConfig, offrampAddrStr)
220+
donID,
221+
config,
222+
destRelayID,
223+
chainAccessors,
224+
contractReaders,
225+
chainWriters,
226+
destChainWriter,
227+
destFromAccounts,
228+
publicConfig,
229+
destChainID,
230+
pluginServices.PluginConfig,
231+
offrampAddrStr,
232+
)
215233
if err != nil {
216234
return nil, fmt.Errorf("failed to create factory and transmitter: %w", err)
217235
}
@@ -268,6 +286,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter(
268286
donID uint32,
269287
config cctypes.OCR3ConfigWithMeta,
270288
destRelayID types.RelayID,
289+
chainAccessors map[cciptypes.ChainSelector]cciptypes.ChainAccessor,
271290
contractReaders map[cciptypes.ChainSelector]types.ContractReader,
272291
chainWriters map[cciptypes.ChainSelector]types.ContractWriter,
273292
destChainWriter types.ContractWriter,
@@ -309,6 +328,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter(
309328
AddrCodec: i.addressCodec,
310329
HomeChainReader: i.homeChainReader,
311330
HomeChainSelector: i.homeChainSelector,
331+
ChainAccessors: chainAccessors,
312332
ContractReaders: contractReaders,
313333
ContractWriters: chainWriters,
314334
RmnPeerClient: rmnPeerClient,
@@ -360,6 +380,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter(
360380
HomeChainReader: i.homeChainReader,
361381
TokenDataEncoder: pluginConfig.TokenDataEncoder,
362382
EstimateProvider: pluginConfig.GasEstimateProvider,
383+
ChainAccessors: chainAccessors,
363384
ContractReaders: contractReaders,
364385
ContractWriters: chainWriters,
365386
})
@@ -400,6 +421,33 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter(
400421
return factory, transmitter, nil
401422
}
402423

424+
func (i *pluginOracleCreator) createChainAccessors(
425+
contractReaders map[cciptypes.ChainSelector]types.ContractReader,
426+
chainWriters map[cciptypes.ChainSelector]types.ContractWriter,
427+
pluginServices ccipcommon.PluginServices,
428+
) (map[cciptypes.ChainSelector]cciptypes.ChainAccessor, error) {
429+
chainAccessors := make(map[cciptypes.ChainSelector]cciptypes.ChainAccessor)
430+
for relayID, relayer := range i.relayers {
431+
chainSelector, err := getChainSelectorFromRelayID(relayID)
432+
if err != nil {
433+
return nil, fmt.Errorf("failed to get chain selector from relay ID %s: %w", relayID, err)
434+
}
435+
chainAccessor, err := pluginServices.PluginConfig.ChainAccessorFactory.NewChainAccessor(
436+
i.lggr,
437+
relayer,
438+
chainSelector,
439+
contractReaders[chainSelector],
440+
chainWriters[chainSelector],
441+
pluginServices.AddrCodec,
442+
)
443+
if err != nil {
444+
return nil, fmt.Errorf("failed to create chain accessor for relay ID %s: %w", relayID, err)
445+
}
446+
chainAccessors[chainSelector] = chainAccessor
447+
}
448+
return chainAccessors, nil
449+
}
450+
403451
func (i *pluginOracleCreator) getTransmitterFromPublicConfig(publicConfig ocr3confighelper.PublicConfig) (ocrtypes.Account, error) {
404452
var myIndex = -1
405453
for idx, identity := range publicConfig.OracleIdentities {
@@ -460,14 +508,13 @@ func (i *pluginOracleCreator) createReadersAndWriters(
460508
contractReaders := make(map[cciptypes.ChainSelector]types.ContractReader)
461509
chainWriters := make(map[cciptypes.ChainSelector]types.ContractWriter)
462510
for relayID, relayer := range i.relayers {
463-
chainID := relayID.ChainID
464-
relayChainFamily := relayID.Network
465-
chainDetails, err1 := chainsel.GetChainDetailsByChainIDAndFamily(chainID, relayChainFamily)
466-
chainSelector := cciptypes.ChainSelector(chainDetails.ChainSelector)
511+
chainSelector, err1 := getChainSelectorFromRelayID(relayID)
467512
if err1 != nil {
468-
return nil, nil, fmt.Errorf("failed to get chain selector from chain ID %s: %w", chainID, err1)
513+
return nil, nil, fmt.Errorf("failed to get chain selector from chain ID %s: %w", relayID.ChainID, err1)
469514
}
470515

516+
chainID := relayID.ChainID
517+
relayChainFamily := relayID.Network
471518
cr, err1 := crcw.GetChainReader(ctx, ccipcommon.ChainReaderProviderOpts{
472519
Lggr: i.lggr,
473520
Relayer: relayer,
@@ -521,6 +568,20 @@ func (i *pluginOracleCreator) createReadersAndWriters(
521568
return contractReaders, chainWriters, nil
522569
}
523570

571+
func getChainSelectorFromRelayID(relayID types.RelayID) (cciptypes.ChainSelector, error) {
572+
chainDetails, err1 := chainsel.GetChainDetailsByChainIDAndFamily(relayID.ChainID, relayID.Network)
573+
if err1 != nil {
574+
return cciptypes.ChainSelector(0), fmt.Errorf(
575+
"failed to get chain details for chain ID %s and family %s: %w",
576+
relayID.ChainID,
577+
relayID.Network,
578+
err1,
579+
)
580+
}
581+
chainSelector := cciptypes.ChainSelector(chainDetails.ChainSelector)
582+
return chainSelector, nil
583+
}
584+
524585
func decodeAndValidateOffchainConfig(
525586
pluginType cctypes.PluginType,
526587
publicConfig ocr3confighelper.PublicConfig,

0 commit comments

Comments
 (0)