Skip to content

Commit 70c631a

Browse files
committed
refactor(mcms): split chain helpers
1 parent 20dd834 commit 70c631a

7 files changed

Lines changed: 547 additions & 6 deletions

File tree

engine/cld/commands/mcms/chain_helpers.go

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66

7+
chainsel "github.com/smartcontractkit/chain-selectors"
78
"github.com/smartcontractkit/mcms"
89
"github.com/smartcontractkit/mcms/chainwrappers"
910
"github.com/smartcontractkit/mcms/sdk"
@@ -12,6 +13,15 @@ import (
1213
cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
1314
)
1415

16+
func newChainAccessor(cfg *forkConfig) *cldfmcmsadapters.ChainAccessAdapter {
17+
a := cldfmcmsadapters.Wrap(cfg.blockchains)
18+
return &a
19+
}
20+
21+
func selectorFamily(sel types.ChainSelector) (string, error) {
22+
return chainsel.GetSelectorFamily(uint64(sel))
23+
}
24+
1525
// getInspectorFromChainSelector returns an inspector for the given chain selector.
1626
func getInspectorFromChainSelector(cfg *forkConfig) (sdk.Inspector, error) {
1727
chainSelector := types.ChainSelector(cfg.chainSelector)
@@ -20,9 +30,28 @@ func getInspectorFromChainSelector(cfg *forkConfig) (sdk.Inspector, error) {
2030
return nil, fmt.Errorf("failed to get chain metadata from timelock proposal for chain selector %v", cfg.chainSelector)
2131
}
2232

23-
chainAccessor := cldfmcmsadapters.Wrap(cfg.blockchains)
33+
family, err := selectorFamily(chainSelector)
34+
if err != nil {
35+
return nil, fmt.Errorf("chain selector family: %w", err)
36+
}
2437

25-
return chainwrappers.BuildInspector(&chainAccessor, chainSelector, cfg.timelockProposal.Action, chainMetadata)
38+
acc := newChainAccessor(cfg)
39+
action := cfg.timelockProposal.Action
40+
41+
switch family {
42+
case chainsel.FamilyEVM:
43+
return buildEVMInspector(acc, action, chainSelector, chainMetadata)
44+
case chainsel.FamilySolana:
45+
return buildSolanaInspector(acc, action, chainSelector, chainMetadata)
46+
case chainsel.FamilyAptos:
47+
return buildAptosInspector(acc, action, chainSelector, chainMetadata)
48+
case chainsel.FamilySui:
49+
return buildSuiInspector(acc, action, chainSelector, chainMetadata)
50+
case chainsel.FamilyTon:
51+
return buildTonInspector(acc, action, chainSelector, chainMetadata)
52+
default:
53+
return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
54+
}
2655
}
2756

2857
// createExecutable creates an MCMS executable for the proposal.
@@ -73,9 +102,28 @@ func getExecutorWithChainOverride(cfg *forkConfig, chainSelector types.ChainSele
73102
return nil, fmt.Errorf("failed to get chain metadata from timelock proposal for chain selector %v", chainSelector)
74103
}
75104

76-
chainAccessor := cldfmcmsadapters.Wrap(cfg.blockchains)
105+
family, err := selectorFamily(chainSelector)
106+
if err != nil {
107+
return nil, fmt.Errorf("chain selector family: %w", err)
108+
}
77109

78-
return chainwrappers.BuildExecutor(&chainAccessor, chainSelector, encoder, cfg.timelockProposal.Action, chainMetadata)
110+
acc := newChainAccessor(cfg)
111+
action := cfg.timelockProposal.Action
112+
113+
switch family {
114+
case chainsel.FamilyEVM:
115+
return buildEVMExecutor(acc, action, chainSelector, encoder, chainMetadata)
116+
case chainsel.FamilySolana:
117+
return buildSolanaExecutor(acc, action, chainSelector, encoder, chainMetadata)
118+
case chainsel.FamilyAptos:
119+
return buildAptosExecutor(acc, action, chainSelector, encoder, chainMetadata)
120+
case chainsel.FamilySui:
121+
return buildSuiExecutor(acc, action, chainSelector, encoder, chainMetadata)
122+
case chainsel.FamilyTon:
123+
return buildTonExecutor(acc, action, chainSelector, encoder, chainMetadata)
124+
default:
125+
return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
126+
}
79127
}
80128

81129
// getTimelockExecutorWithChainOverride returns a timelock executor for the given chain selector.
@@ -85,7 +133,26 @@ func getTimelockExecutorWithChainOverride(cfg *forkConfig, chainSelector types.C
85133
return nil, fmt.Errorf("failed to get chain metadata from timelock proposal for chain selector %v", chainSelector)
86134
}
87135

88-
chainAccessor := cldfmcmsadapters.Wrap(cfg.blockchains)
136+
family, err := selectorFamily(chainSelector)
137+
if err != nil {
138+
return nil, fmt.Errorf("chain selector family: %w", err)
139+
}
89140

90-
return chainwrappers.BuildTimelockExecutor(&chainAccessor, chainSelector, cfg.timelockProposal.Action, chainMetadata)
141+
acc := newChainAccessor(cfg)
142+
action := cfg.timelockProposal.Action
143+
144+
switch family {
145+
case chainsel.FamilyEVM:
146+
return buildEVMTimelockExecutor(acc, action, chainSelector, chainMetadata)
147+
case chainsel.FamilySolana:
148+
return buildSolanaTimelockExecutor(acc, action, chainSelector, chainMetadata)
149+
case chainsel.FamilyAptos:
150+
return buildAptosTimelockExecutor(acc, action, chainSelector, chainMetadata)
151+
case chainsel.FamilySui:
152+
return buildSuiTimelockExecutor(acc, action, chainSelector, chainMetadata)
153+
case chainsel.FamilyTon:
154+
return buildTonTimelockExecutor(acc, action, chainSelector, chainMetadata)
155+
default:
156+
return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
157+
}
91158
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package mcms
2+
3+
import (
4+
"github.com/smartcontractkit/mcms/chainwrappers"
5+
"github.com/smartcontractkit/mcms/sdk"
6+
mcmsaptos "github.com/smartcontractkit/mcms/sdk/aptos"
7+
"github.com/smartcontractkit/mcms/types"
8+
9+
cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
10+
)
11+
12+
// aptosRoleFromProposal maps the timelock action to the Aptos MCMS role. Use this (or extend it)
13+
// when CLDF needs Aptos-specific role logic without going through chainwrappers.
14+
func aptosRoleFromProposal(action types.TimelockAction) (mcmsaptos.TimelockRole, error) {
15+
return mcmsaptos.AptosRoleFromAction(action)
16+
}
17+
18+
func buildAptosInspector(
19+
acc *cldfmcmsadapters.ChainAccessAdapter,
20+
action types.TimelockAction,
21+
chainSelector types.ChainSelector,
22+
chainMetadata types.ChainMetadata,
23+
) (sdk.Inspector, error) {
24+
if _, err := aptosRoleFromProposal(action); err != nil {
25+
return nil, err
26+
}
27+
28+
return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
29+
}
30+
31+
func buildAptosExecutor(
32+
acc *cldfmcmsadapters.ChainAccessAdapter,
33+
action types.TimelockAction,
34+
chainSelector types.ChainSelector,
35+
encoder sdk.Encoder,
36+
chainMetadata types.ChainMetadata,
37+
) (sdk.Executor, error) {
38+
if _, err := aptosRoleFromProposal(action); err != nil {
39+
return nil, err
40+
}
41+
42+
return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
43+
}
44+
45+
func buildAptosTimelockExecutor(
46+
acc *cldfmcmsadapters.ChainAccessAdapter,
47+
action types.TimelockAction,
48+
chainSelector types.ChainSelector,
49+
chainMetadata types.ChainMetadata,
50+
) (sdk.TimelockExecutor, error) {
51+
if _, err := aptosRoleFromProposal(action); err != nil {
52+
return nil, err
53+
}
54+
55+
return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
56+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package mcms
2+
3+
import (
4+
"github.com/smartcontractkit/mcms/chainwrappers"
5+
"github.com/smartcontractkit/mcms/sdk"
6+
"github.com/smartcontractkit/mcms/types"
7+
8+
cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
9+
)
10+
11+
func buildEVMInspector(
12+
acc *cldfmcmsadapters.ChainAccessAdapter,
13+
action types.TimelockAction,
14+
chainSelector types.ChainSelector,
15+
chainMetadata types.ChainMetadata,
16+
) (sdk.Inspector, error) {
17+
return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
18+
}
19+
20+
func buildEVMExecutor(
21+
acc *cldfmcmsadapters.ChainAccessAdapter,
22+
action types.TimelockAction,
23+
chainSelector types.ChainSelector,
24+
encoder sdk.Encoder,
25+
chainMetadata types.ChainMetadata,
26+
) (sdk.Executor, error) {
27+
return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
28+
}
29+
30+
func buildEVMTimelockExecutor(
31+
acc *cldfmcmsadapters.ChainAccessAdapter,
32+
action types.TimelockAction,
33+
chainSelector types.ChainSelector,
34+
chainMetadata types.ChainMetadata,
35+
) (sdk.TimelockExecutor, error) {
36+
return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
37+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package mcms
2+
3+
import (
4+
"github.com/smartcontractkit/mcms/chainwrappers"
5+
"github.com/smartcontractkit/mcms/sdk"
6+
"github.com/smartcontractkit/mcms/types"
7+
8+
cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
9+
)
10+
11+
func buildSolanaInspector(
12+
acc *cldfmcmsadapters.ChainAccessAdapter,
13+
action types.TimelockAction,
14+
chainSelector types.ChainSelector,
15+
chainMetadata types.ChainMetadata,
16+
) (sdk.Inspector, error) {
17+
return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
18+
}
19+
20+
func buildSolanaExecutor(
21+
acc *cldfmcmsadapters.ChainAccessAdapter,
22+
action types.TimelockAction,
23+
chainSelector types.ChainSelector,
24+
encoder sdk.Encoder,
25+
chainMetadata types.ChainMetadata,
26+
) (sdk.Executor, error) {
27+
return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
28+
}
29+
30+
func buildSolanaTimelockExecutor(
31+
acc *cldfmcmsadapters.ChainAccessAdapter,
32+
action types.TimelockAction,
33+
chainSelector types.ChainSelector,
34+
chainMetadata types.ChainMetadata,
35+
) (sdk.TimelockExecutor, error) {
36+
return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
37+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package mcms
2+
3+
import (
4+
"github.com/smartcontractkit/mcms/chainwrappers"
5+
"github.com/smartcontractkit/mcms/sdk"
6+
mcmssui "github.com/smartcontractkit/mcms/sdk/sui"
7+
"github.com/smartcontractkit/mcms/types"
8+
9+
cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
10+
)
11+
12+
// suiMetadataFromProposal parses Sui-specific fields from MCMS chain metadata.
13+
func suiMetadataFromProposal(metadata types.ChainMetadata) (mcmssui.AdditionalFieldsMetadata, error) {
14+
return mcmssui.SuiMetadata(metadata)
15+
}
16+
17+
func buildSuiInspector(
18+
acc *cldfmcmsadapters.ChainAccessAdapter,
19+
action types.TimelockAction,
20+
chainSelector types.ChainSelector,
21+
chainMetadata types.ChainMetadata,
22+
) (sdk.Inspector, error) {
23+
if _, err := suiMetadataFromProposal(chainMetadata); err != nil {
24+
return nil, err
25+
}
26+
27+
return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
28+
}
29+
30+
func buildSuiExecutor(
31+
acc *cldfmcmsadapters.ChainAccessAdapter,
32+
action types.TimelockAction,
33+
chainSelector types.ChainSelector,
34+
encoder sdk.Encoder,
35+
chainMetadata types.ChainMetadata,
36+
) (sdk.Executor, error) {
37+
if _, err := suiMetadataFromProposal(chainMetadata); err != nil {
38+
return nil, err
39+
}
40+
41+
return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
42+
}
43+
44+
func buildSuiTimelockExecutor(
45+
acc *cldfmcmsadapters.ChainAccessAdapter,
46+
action types.TimelockAction,
47+
chainSelector types.ChainSelector,
48+
chainMetadata types.ChainMetadata,
49+
) (sdk.TimelockExecutor, error) {
50+
if _, err := suiMetadataFromProposal(chainMetadata); err != nil {
51+
return nil, err
52+
}
53+
54+
return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
55+
}

0 commit comments

Comments
 (0)