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
52 changes: 46 additions & 6 deletions engine/cld/commands/mcms/chain_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"fmt"

chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/mcms"
"github.com/smartcontractkit/mcms/chainwrappers"
"github.com/smartcontractkit/mcms/sdk"
Expand All @@ -12,6 +13,15 @@ import (
cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
)

func newChainAccessor(cfg *forkConfig) *cldfmcmsadapters.ChainAccessAdapter {
a := cldfmcmsadapters.Wrap(cfg.blockchains)
return &a
}

func selectorFamily(sel types.ChainSelector) (string, error) {
return chainsel.GetSelectorFamily(uint64(sel))
}

// getInspectorFromChainSelector returns an inspector for the given chain selector.
func getInspectorFromChainSelector(cfg *forkConfig) (sdk.Inspector, error) {
chainSelector := types.ChainSelector(cfg.chainSelector)
Expand All @@ -20,9 +30,19 @@ func getInspectorFromChainSelector(cfg *forkConfig) (sdk.Inspector, error) {
return nil, fmt.Errorf("failed to get chain metadata from timelock proposal for chain selector %v", cfg.chainSelector)
}

chainAccessor := cldfmcmsadapters.Wrap(cfg.blockchains)
family, err := selectorFamily(chainSelector)
if err != nil {
return nil, fmt.Errorf("chain selector family: %w", err)
}

acc := newChainAccessor(cfg)
action := cfg.timelockProposal.Action

return chainwrappers.BuildInspector(&chainAccessor, chainSelector, cfg.timelockProposal.Action, chainMetadata)
if build, ok := chainFamilyInspectorBuilders[family]; ok {
return build(acc, action, chainSelector, chainMetadata)
}

return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
}

// createExecutable creates an MCMS executable for the proposal.
Expand Down Expand Up @@ -73,9 +93,19 @@ func getExecutorWithChainOverride(cfg *forkConfig, chainSelector types.ChainSele
return nil, fmt.Errorf("failed to get chain metadata from timelock proposal for chain selector %v", chainSelector)
}

chainAccessor := cldfmcmsadapters.Wrap(cfg.blockchains)
family, err := selectorFamily(chainSelector)
if err != nil {
return nil, fmt.Errorf("chain selector family: %w", err)
}

acc := newChainAccessor(cfg)
action := cfg.timelockProposal.Action

return chainwrappers.BuildExecutor(&chainAccessor, chainSelector, encoder, cfg.timelockProposal.Action, chainMetadata)
if build, ok := chainFamilyExecutorBuilders[family]; ok {
return build(acc, action, chainSelector, encoder, chainMetadata)
}

return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
}

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

chainAccessor := cldfmcmsadapters.Wrap(cfg.blockchains)
family, err := selectorFamily(chainSelector)
if err != nil {
return nil, fmt.Errorf("chain selector family: %w", err)
}

acc := newChainAccessor(cfg)
action := cfg.timelockProposal.Action

if build, ok := chainFamilyTimelockExecutorBuilders[family]; ok {
return build(acc, action, chainSelector, chainMetadata)
}

return chainwrappers.BuildTimelockExecutor(&chainAccessor, chainSelector, cfg.timelockProposal.Action, chainMetadata)
return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
}
66 changes: 66 additions & 0 deletions engine/cld/commands/mcms/chain_helpers_aptos.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package mcms

import (
chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/mcms/chainwrappers"
"github.com/smartcontractkit/mcms/sdk"
mcmsaptos "github.com/smartcontractkit/mcms/sdk/aptos"
"github.com/smartcontractkit/mcms/types"

cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
)

func init() {
registerChainFamilyBuilders(
chainsel.FamilyAptos,
buildAptosInspector,
buildAptosExecutor,
buildAptosTimelockExecutor,
)
}

// aptosRoleFromProposal maps the timelock action to the Aptos MCMS role. Use this (or extend it)
// when CLDF needs Aptos-specific role logic without going through chainwrappers.
func aptosRoleFromProposal(action types.TimelockAction) (mcmsaptos.TimelockRole, error) {
return mcmsaptos.AptosRoleFromAction(action)
}

func buildAptosInspector(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.Inspector, error) {
if _, err := aptosRoleFromProposal(action); err != nil {
return nil, err
}

return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
}

func buildAptosExecutor(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
encoder sdk.Encoder,
chainMetadata types.ChainMetadata,
) (sdk.Executor, error) {
if _, err := aptosRoleFromProposal(action); err != nil {
return nil, err
}

return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
}

func buildAptosTimelockExecutor(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.TimelockExecutor, error) {
if _, err := aptosRoleFromProposal(action); err != nil {
return nil, err
}

return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
}
47 changes: 47 additions & 0 deletions engine/cld/commands/mcms/chain_helpers_evm.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package mcms

import (
chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/mcms/chainwrappers"
"github.com/smartcontractkit/mcms/sdk"
"github.com/smartcontractkit/mcms/types"

cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
)

func init() {
registerChainFamilyBuilders(
chainsel.FamilyEVM,
buildEVMInspector,
buildEVMExecutor,
buildEVMTimelockExecutor,
)
}

func buildEVMInspector(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.Inspector, error) {
return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
}

func buildEVMExecutor(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
encoder sdk.Encoder,
chainMetadata types.ChainMetadata,
) (sdk.Executor, error) {
return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
}

func buildEVMTimelockExecutor(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.TimelockExecutor, error) {
return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
}
54 changes: 54 additions & 0 deletions engine/cld/commands/mcms/chain_helpers_registry.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package mcms

import (
"fmt"

"github.com/smartcontractkit/mcms/sdk"
"github.com/smartcontractkit/mcms/types"

cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
)

type chainInspectorBuilder func(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.Inspector, error)

type chainExecutorBuilder func(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
encoder sdk.Encoder,
chainMetadata types.ChainMetadata,
) (sdk.Executor, error)

type chainTimelockExecutorBuilder func(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.TimelockExecutor, error)

var (
chainFamilyInspectorBuilders = map[string]chainInspectorBuilder{}
chainFamilyExecutorBuilders = map[string]chainExecutorBuilder{}
chainFamilyTimelockExecutorBuilders = map[string]chainTimelockExecutorBuilder{}
)

// registerChainFamilyBuilders wires one chain family's builders into the dispatch maps.
// Call from init() in each chain_helpers_<family>.go file.
func registerChainFamilyBuilders(
family string,
inspector chainInspectorBuilder,
executor chainExecutorBuilder,
timelockExecutor chainTimelockExecutorBuilder,
) {
if _, dup := chainFamilyInspectorBuilders[family]; dup {
panic(fmt.Sprintf("mcms: duplicate chain family registration: %q", family))
}
chainFamilyInspectorBuilders[family] = inspector
chainFamilyExecutorBuilders[family] = executor
chainFamilyTimelockExecutorBuilders[family] = timelockExecutor
}
47 changes: 47 additions & 0 deletions engine/cld/commands/mcms/chain_helpers_solana.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package mcms

import (
chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/mcms/chainwrappers"
"github.com/smartcontractkit/mcms/sdk"
"github.com/smartcontractkit/mcms/types"

cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
)

func init() {
registerChainFamilyBuilders(
chainsel.FamilySolana,
buildSolanaInspector,
buildSolanaExecutor,
buildSolanaTimelockExecutor,
)
}

func buildSolanaInspector(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.Inspector, error) {
return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
}

func buildSolanaExecutor(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
encoder sdk.Encoder,
chainMetadata types.ChainMetadata,
) (sdk.Executor, error) {
return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
}

func buildSolanaTimelockExecutor(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.TimelockExecutor, error) {
return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
}
65 changes: 65 additions & 0 deletions engine/cld/commands/mcms/chain_helpers_sui.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package mcms

import (
chainsel "github.com/smartcontractkit/chain-selectors"
"github.com/smartcontractkit/mcms/chainwrappers"
"github.com/smartcontractkit/mcms/sdk"
mcmssui "github.com/smartcontractkit/mcms/sdk/sui"
"github.com/smartcontractkit/mcms/types"

cldfmcmsadapters "github.com/smartcontractkit/chainlink-deployments-framework/chain/mcms/adapters"
)

func init() {
registerChainFamilyBuilders(
chainsel.FamilySui,
buildSuiInspector,
buildSuiExecutor,
buildSuiTimelockExecutor,
)
}

// suiMetadataFromProposal parses Sui-specific fields from MCMS chain metadata.
func suiMetadataFromProposal(metadata types.ChainMetadata) (mcmssui.AdditionalFieldsMetadata, error) {
return mcmssui.SuiMetadata(metadata)
}

func buildSuiInspector(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.Inspector, error) {
if _, err := suiMetadataFromProposal(chainMetadata); err != nil {
return nil, err
}

return chainwrappers.BuildInspector(acc, chainSelector, action, chainMetadata)
}

func buildSuiExecutor(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
encoder sdk.Encoder,
chainMetadata types.ChainMetadata,
) (sdk.Executor, error) {
if _, err := suiMetadataFromProposal(chainMetadata); err != nil {
return nil, err
}

return chainwrappers.BuildExecutor(acc, chainSelector, encoder, action, chainMetadata)
}

func buildSuiTimelockExecutor(
acc *cldfmcmsadapters.ChainAccessAdapter,
action types.TimelockAction,
chainSelector types.ChainSelector,
chainMetadata types.ChainMetadata,
) (sdk.TimelockExecutor, error) {
if _, err := suiMetadataFromProposal(chainMetadata); err != nil {
return nil, err
}

return chainwrappers.BuildTimelockExecutor(acc, chainSelector, action, chainMetadata)
}
Loading
Loading