Skip to content

Commit d79a128

Browse files
committed
wip
1 parent 2780d31 commit d79a128

File tree

12 files changed

+389
-92
lines changed

12 files changed

+389
-92
lines changed

core/capabilities/ccip/ccipaptos/pluginconfig.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package ccipaptos
22

33
import (
44
chainsel "github.com/smartcontractkit/chain-selectors"
5+
56
"github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
67

78
"github.com/smartcontractkit/chainlink-common/pkg/logger"
@@ -11,7 +12,7 @@ import (
1112
)
1213

1314
// initializePluginConfig returns a PluginConfig for Aptos chains.
14-
func initializePluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodec) ccipcommon.PluginConfig {
15+
func initializePluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodecBundle) ccipcommon.PluginConfig {
1516
return ccipcommon.PluginConfig{
1617
CommitPluginCodec: NewCommitPluginCodecV1(),
1718
ExecutePluginCodec: NewExecutePluginCodecV1(extraDataCodec),

core/capabilities/ccip/ccipevm/pluginconfig.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package ccipevm
22

33
import (
44
chainsel "github.com/smartcontractkit/chain-selectors"
5+
56
"github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
67

78
"github.com/smartcontractkit/chainlink-common/pkg/logger"
@@ -13,7 +14,7 @@ import (
1314
const defaultCommitGasLimit = 500_000
1415

1516
// InitializePluginConfig returns a PluginConfig for EVM chains.
16-
func InitializePluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodec) ccipcommon.PluginConfig {
17+
func InitializePluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodecBundle) ccipcommon.PluginConfig {
1718
return ccipcommon.PluginConfig{
1819
CommitPluginCodec: NewCommitPluginCodecV1(),
1920
ExecutePluginCodec: NewExecutePluginCodecV1(extraDataCodec),

core/capabilities/ccip/ccipnoop/pluginconfig.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
)
99

1010
// NewPluginConfig returns a pluginConfig .
11-
func NewPluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodec) ccipcommon.PluginConfig {
11+
func NewPluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodecBundle) ccipcommon.PluginConfig {
1212
return ccipcommon.PluginConfig{
1313
CommitPluginCodec: NewCommitPluginCodecV1(),
1414
ExecutePluginCodec: NewExecutePluginCodecV1(extraDataCodec),

core/capabilities/ccip/ccipsolana/executecodec.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
agbinary "github.com/gagliardetto/binary"
1313
"github.com/gagliardetto/solana-go"
14+
1415
"github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/latest/ccip_offramp"
1516
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
1617
"github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
@@ -20,12 +21,12 @@ import (
2021
// Compatible with:
2122
// - "OffRamp 1.6.0-dev"
2223
type ExecutePluginCodecV1 struct {
23-
extraDataCodec ccipocr3.ExtraDataCodec
24+
extraDataCodec ccipocr3.ExtraDataCodecBundle
2425
}
2526

26-
func NewExecutePluginCodecV1(extraDataCodec ccipocr3.ExtraDataCodec) *ExecutePluginCodecV1 {
27+
func NewExecutePluginCodecV1(extraDataCodecBundle ccipocr3.ExtraDataCodecBundle) *ExecutePluginCodecV1 {
2728
return &ExecutePluginCodecV1{
28-
extraDataCodec: extraDataCodec,
29+
extraDataCodec: extraDataCodecBundle,
2930
}
3031
}
3132

core/capabilities/ccip/ccipsolana/pluginconfig.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package ccipsolana
22

33
import (
44
chainsel "github.com/smartcontractkit/chain-selectors"
5+
56
"github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
67

78
"github.com/smartcontractkit/chainlink-ccip/pkg/consts"
@@ -12,7 +13,7 @@ import (
1213
)
1314

1415
// InitializePluginConfig returns a pluginConfig for Solana chains.
15-
func InitializePluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodec) ccipcommon.PluginConfig {
16+
func InitializePluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodecBundle) ccipcommon.PluginConfig {
1617
return ccipcommon.PluginConfig{
1718
CommitPluginCodec: NewCommitPluginCodecV1(),
1819
ExecutePluginCodec: NewExecutePluginCodecV1(extraDataCodec),

core/capabilities/ccip/ccipton/pluginconfig.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package ccipton
22

33
import (
44
chainsel "github.com/smartcontractkit/chain-selectors"
5+
56
"github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
67
"github.com/smartcontractkit/chainlink-ton/pkg/ccip/codec"
78

@@ -10,7 +11,7 @@ import (
1011
)
1112

1213
// InitializePluginConfig returns a pluginConfig for TON chains.
13-
func InitializePluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodec) ccipcommon.PluginConfig {
14+
func InitializePluginConfig(lggr logger.Logger, extraDataCodec ccipocr3.ExtraDataCodecBundle) ccipcommon.PluginConfig {
1415
return ccipcommon.PluginConfig{
1516
AddressCodec: codec.NewAddressCodec(),
1617
CommitPluginCodec: codec.NewCommitPluginCodecV1(),
Lines changed: 4 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,9 @@
11
package common
22

33
import (
4-
"fmt"
5-
6-
chainsel "github.com/smartcontractkit/chain-selectors"
7-
8-
cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3"
4+
"github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
95
)
106

11-
// ExtraDataCodec is a map of chain family to SourceChainExtraDataCodec
12-
type ExtraDataCodec map[string]SourceChainExtraDataCodec
13-
14-
// DecodeExtraArgs reformats bytes into a chain agnostic map[string]any representation for extra args
15-
func (c ExtraDataCodec) DecodeExtraArgs(extraArgs cciptypes.Bytes, sourceChainSelector cciptypes.ChainSelector) (map[string]any, error) {
16-
if len(extraArgs) == 0 {
17-
// return empty map if extraArgs is empty
18-
return nil, nil
19-
}
20-
21-
family, err := chainsel.GetSelectorFamily(uint64(sourceChainSelector))
22-
if err != nil {
23-
return nil, fmt.Errorf("failed to get chain family for selector %d: %w", sourceChainSelector, err)
24-
}
25-
26-
codec, exist := c[family]
27-
if !exist {
28-
return nil, fmt.Errorf("unsupported family for extra args type %s", family)
29-
}
30-
31-
return codec.DecodeExtraArgsToMap(extraArgs)
32-
}
33-
34-
// DecodeTokenAmountDestExecData reformats bytes to chain-agnostic map[string]any for tokenAmount DestExecData field
35-
func (c ExtraDataCodec) DecodeTokenAmountDestExecData(destExecData cciptypes.Bytes, sourceChainSelector cciptypes.ChainSelector) (map[string]any, error) {
36-
if len(destExecData) == 0 {
37-
// return empty map if destExecData is empty
38-
return nil, nil
39-
}
40-
41-
family, err := chainsel.GetSelectorFamily(uint64(sourceChainSelector))
42-
if err != nil {
43-
return nil, fmt.Errorf("failed to get chain family for selector %d: %w", sourceChainSelector, err)
44-
}
45-
46-
codec, exist := c[family]
47-
if !exist {
48-
return nil, fmt.Errorf("unsupported family for extra args type %s", family)
49-
}
50-
51-
return codec.DecodeDestExecDataToMap(destExecData)
52-
}
7+
// ExtraDataCodecMap is a map of chain family to SourceChainExtraDataCodec
8+
// Deprecated: use ccipocr3.ExtraDataCodecMap or ExtraDataCodecRegistry to manage codecs instead
9+
type ExtraDataCodecMap = ccipocr3.ExtraDataCodecMap
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package common
2+
3+
import (
4+
"sync"
5+
6+
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
7+
)
8+
9+
// Ensure ExtraDataCodecRegistry implements the ExtraDataCodecBundle interface from chainlink-common
10+
var _ cciptypes.ExtraDataCodecBundle = (*ExtraDataCodecRegistry)(nil)
11+
12+
// ExtraDataCodecRegistry is a singleton registry that manages SourceChainExtraDataCodec instances
13+
// for different chain families. It implements the ExtraDataCodecBundle interface from chainlink-common
14+
// by delegating to the existing ExtraDataCodec implementation.
15+
type ExtraDataCodecRegistry struct {
16+
extraDataCodec cciptypes.ExtraDataCodecMap
17+
mu sync.RWMutex
18+
}
19+
20+
var (
21+
registryInstance *ExtraDataCodecRegistry
22+
registryOnce sync.Once
23+
)
24+
25+
type NoOpSourceChainExtraDataCodec struct{}
26+
27+
func (n NoOpSourceChainExtraDataCodec) DecodeExtraArgsToMap(extraArgs cciptypes.Bytes) (map[string]any, error) {
28+
return make(map[string]any), nil
29+
}
30+
31+
func (n NoOpSourceChainExtraDataCodec) DecodeDestExecDataToMap(destExecData cciptypes.Bytes) (map[string]any, error) {
32+
return make(map[string]any), nil
33+
}
34+
35+
// GetExtraDataCodecRegistry returns the singleton instance of ExtraDataCodecRegistry. This is only called
36+
// in core node.
37+
func GetExtraDataCodecRegistry() *ExtraDataCodecRegistry {
38+
registryOnce.Do(func() {
39+
registryInstance = &ExtraDataCodecRegistry{
40+
extraDataCodec: make(cciptypes.ExtraDataCodecMap),
41+
}
42+
})
43+
return registryInstance
44+
}
45+
46+
// RegisterFamily registers a chain family with a no-op SourceChainExtraDataCodec if not already registered.
47+
// This is used when we know which chain families we want to support but don't have a specific codec
48+
// implementation initialized for it yet. This should only be called from core node, not over gRPC.
49+
func (r *ExtraDataCodecRegistry) RegisterFamily(chainFamily string) {
50+
r.mu.Lock()
51+
defer r.mu.Unlock()
52+
if _, exists := r.extraDataCodec[chainFamily]; !exists {
53+
r.extraDataCodec[chainFamily] = NoOpSourceChainExtraDataCodec{}
54+
}
55+
}
56+
57+
// RegisterCodec registers a SourceChainExtraDataCodec for a specific chain family and is only called
58+
// within core node, not over gRPC.
59+
func (r *ExtraDataCodecRegistry) RegisterCodec(chainFamily string, codec SourceChainExtraDataCodec) {
60+
r.mu.Lock()
61+
defer r.mu.Unlock()
62+
r.extraDataCodec[chainFamily] = codec
63+
}
64+
65+
// DecodeExtraArgs can be called either over gRPC or not. It is used to decode extra args for a specific
66+
// source chain family
67+
func (r *ExtraDataCodecRegistry) DecodeExtraArgs(
68+
extraArgs cciptypes.Bytes,
69+
sourceChainSelector cciptypes.ChainSelector,
70+
) (map[string]any, error) {
71+
r.mu.RLock()
72+
defer r.mu.RUnlock()
73+
return r.extraDataCodec.DecodeExtraArgs(extraArgs, sourceChainSelector)
74+
}
75+
76+
// DecodeTokenAmountDestExecData can be called either over gRPC or not. It is used to decode dest exec
77+
// data for a specific source chain family.
78+
func (r *ExtraDataCodecRegistry) DecodeTokenAmountDestExecData(
79+
destExecData cciptypes.Bytes,
80+
sourceChainSelector cciptypes.ChainSelector,
81+
) (map[string]any, error) {
82+
r.mu.RLock()
83+
defer r.mu.RUnlock()
84+
return r.extraDataCodec.DecodeTokenAmountDestExecData(destExecData, sourceChainSelector)
85+
}

0 commit comments

Comments
 (0)