diff --git a/go.mod b/go.mod index 90bdc0f..8f0c363 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/spf13/cast v1.10.0 github.com/stretchr/testify v1.11.1 github.com/zksync-sdk/zksync2-go v1.1.1-0.20250620124214-2c742ee399c6 + golang.org/x/crypto v0.51.0 golang.org/x/mod v0.36.0 golang.org/x/sync v0.20.0 gopkg.in/yaml.v3 v3.0.1 @@ -306,7 +307,6 @@ require ( go.uber.org/zap v1.28.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.51.0 // indirect golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect golang.org/x/net v0.54.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect diff --git a/internal/mcmsrole/role.go b/internal/mcmsrole/role.go new file mode 100644 index 0000000..2c8f7d3 --- /dev/null +++ b/internal/mcmsrole/role.go @@ -0,0 +1,61 @@ +// Package mcmsrole provides RBACTimelock role names and IDs used by MCMS changesets. +// +// RBACTimelock defines five roles: ADMIN, PROPOSER, EXECUTOR, BYPASSER, and +// CANCELLER. Each role ID is the keccak256 hash of its name string, matching +// OpenZeppelin AccessControl. See RBACTimelock in ccip-owner-contracts: +// https://github.com/smartcontractkit/ccip-owner-contracts/blob/9d81692b324ce7ea2ef8a75e683889edbc7e2dd0/src/RBACTimelock.sol#L71 +// +// These constants are defined here instead of via generated Go bindings so +// changesets can reference role IDs without importing timelock contract wrappers. +// +// The package lives under internal/ because both legacy and top-level changesets +// depend on it. Once MCMS changesets are consolidated, consider moving it into +// the mcms changesets tree or promoting it to the mcms library. +package mcmsrole + +import ( + "github.com/ethereum/go-ethereum/common" + "golang.org/x/crypto/sha3" +) + +// Each role string maps to the role names in the RBACTimelock contract. +// https://github.com/smartcontractkit/ccip-owner-contracts/blob/9d81692b324ce7ea2ef8a75e683889edbc7e2dd0/src/RBACTimelock.sol#L71-L75 +const ( + adminRoleStr = "ADMIN_ROLE" + proposerRoleStr = "PROPOSER_ROLE" + bypasserRoleStr = "BYPASSER_ROLE" //nolint:gosec // G101: These are not secrets and only used in tests. + cancellerRoleStr = "CANCELLER_ROLE" + executorRoleStr = "EXECUTOR_ROLE" +) + +var ( + AdminRole = NewRole(adminRoleStr) + ProposerRole = NewRole(proposerRoleStr) + BypasserRole = NewRole(bypasserRoleStr) + CancellerRole = NewRole(cancellerRoleStr) + ExecutorRole = NewRole(executorRoleStr) +) + +// Role represents a role in the MCMS Timelock contracts. +type Role struct { + ID common.Hash + Name string +} + +// NewRole creates a new role with the given name and calculates the ID. +func NewRole(name string) Role { + return Role{ + ID: mustKeccakHash(name), + Name: name, + } +} + +// mustKeccakHash calculates the keccak256 hash of the input string. +func mustKeccakHash(in string) common.Hash { + hash := sha3.NewLegacyKeccak256() + if _, err := hash.Write([]byte(in)); err != nil { + panic(err) + } + + return common.BytesToHash(hash.Sum(nil)) +} diff --git a/internal/mcmsrole/role_test.go b/internal/mcmsrole/role_test.go new file mode 100644 index 0000000..720925b --- /dev/null +++ b/internal/mcmsrole/role_test.go @@ -0,0 +1,77 @@ +package mcmsrole + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestNewRole(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + roleName string + wantID common.Hash + }{ + { + name: "admin", + roleName: "ADMIN_ROLE", + wantID: common.HexToHash("0xa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775"), + }, + { + name: "proposer", + roleName: "PROPOSER_ROLE", + wantID: common.HexToHash("0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1"), + }, + { + name: "executor", + roleName: "EXECUTOR_ROLE", + wantID: common.HexToHash("0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63"), + }, + { + name: "bypasser", + roleName: "BYPASSER_ROLE", + wantID: common.HexToHash("0xa1b2b8005de234c4b8ce8cd0be058239056e0d54f6097825b5117101469d5a8d"), + }, + { + name: "canceller", + roleName: "CANCELLER_ROLE", + wantID: common.HexToHash("0xfd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + got := NewRole(tt.roleName) + require.Equal(t, tt.roleName, got.Name) + require.Equal(t, tt.wantID, got.ID) + }) + } +} + +func TestPredefinedRoles(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + role Role + }{ + {name: "admin", role: AdminRole}, + {name: "proposer", role: ProposerRole}, + {name: "executor", role: ExecutorRole}, + {name: "bypasser", role: BypasserRole}, + {name: "canceller", role: CancellerRole}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + require.Equal(t, NewRole(tt.role.Name), tt.role) + }) + } +} diff --git a/legacy/pkg/family/evm/changesets/deploy_mcms_test.go b/legacy/pkg/family/evm/changesets/deploy_mcms_test.go index 99ba039..909f823 100644 --- a/legacy/pkg/family/evm/changesets/deploy_mcms_test.go +++ b/legacy/pkg/family/evm/changesets/deploy_mcms_test.go @@ -1,7 +1,6 @@ package changesets import ( - "encoding/json" "testing" chainsel "github.com/smartcontractkit/chain-selectors" @@ -84,12 +83,6 @@ func TestDeployMCMSWithTimelockContracts(t *testing.T) { require.NoError(t, err) require.Len(t, addresses, 5) - mcmsState, err := evmstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) - require.NoError(t, err) - - v, err := mcmsState.GenerateMCMSWithTimelockView() - require.NoError(t, err) - - _, err = json.MarshalIndent(v, "", " ") + _, err = evmstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) require.NoError(t, err) } diff --git a/legacy/pkg/family/evm/changesets/deploy_mcms_with_timelock.go b/legacy/pkg/family/evm/changesets/deploy_mcms_with_timelock.go index 392131d..f41b55f 100644 --- a/legacy/pkg/family/evm/changesets/deploy_mcms_with_timelock.go +++ b/legacy/pkg/family/evm/changesets/deploy_mcms_with_timelock.go @@ -18,8 +18,8 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/operations" "github.com/spf13/cast" + "github.com/smartcontractkit/cld-changesets/internal/mcmsrole" evmstate "github.com/smartcontractkit/cld-changesets/legacy/pkg/family/evm" - "github.com/smartcontractkit/cld-changesets/pkg/contract/mcms/view/v1_0" opsevm "github.com/smartcontractkit/cld-changesets/pkg/family/evm/operations" seqs "github.com/smartcontractkit/cld-changesets/pkg/family/evm/sequences" ) @@ -300,7 +300,7 @@ func DeployMCMSWithTimelockContractsEVM( func getAdminAddresses(ctx context.Context, timelock *bindings.RBACTimelock) ([]string, error) { numAddresses, err := timelock.GetRoleMemberCount(&bind.CallOpts{ Context: ctx, - }, v1_0.ADMIN_ROLE.ID) + }, mcmsrole.AdminRole.ID) if err != nil { return nil, err } @@ -315,7 +315,7 @@ func getAdminAddresses(ctx context.Context, timelock *bindings.RBACTimelock) ([] } address, err := timelock.GetRoleMember(&bind.CallOpts{ Context: ctx, - }, v1_0.ADMIN_ROLE.ID, big.NewInt(idx)) + }, mcmsrole.AdminRole.ID, big.NewInt(idx)) if err != nil { return nil, err } @@ -372,23 +372,23 @@ func GrantRolesForTimelock( IsDeployerKeyAdmin: isDeployerKeyAdmin, RolesAndAddresses: []seqs.RolesAndAddresses{ { - Role: v1_0.PROPOSER_ROLE.ID, - Name: v1_0.PROPOSER_ROLE.Name, + Role: mcmsrole.ProposerRole.ID, + Name: mcmsrole.ProposerRole.Name, Addresses: []common.Address{proposer.Address()}, }, { - Role: v1_0.CANCELLER_ROLE.ID, - Name: v1_0.CANCELLER_ROLE.Name, + Role: mcmsrole.CancellerRole.ID, + Name: mcmsrole.CancellerRole.Name, Addresses: []common.Address{proposer.Address(), canceller.Address(), bypasser.Address()}, }, { - Role: v1_0.BYPASSER_ROLE.ID, - Name: v1_0.BYPASSER_ROLE.Name, + Role: mcmsrole.BypasserRole.ID, + Name: mcmsrole.BypasserRole.Name, Addresses: []common.Address{bypasser.Address()}, }, { - Role: v1_0.EXECUTOR_ROLE.ID, - Name: v1_0.EXECUTOR_ROLE.Name, + Role: mcmsrole.ExecutorRole.ID, + Name: mcmsrole.ExecutorRole.Name, Addresses: []common.Address{callProxy.Address()}, }, }, @@ -398,8 +398,8 @@ func GrantRolesForTimelock( if !isTimelockAdmin { // We grant the timelock the admin role on the MCMS contracts. seqInput.RolesAndAddresses = append(seqInput.RolesAndAddresses, seqs.RolesAndAddresses{ - Role: v1_0.ADMIN_ROLE.ID, - Name: v1_0.ADMIN_ROLE.Name, + Role: mcmsrole.AdminRole.ID, + Name: mcmsrole.AdminRole.Name, Addresses: []common.Address{timelock.Address()}, }) } diff --git a/legacy/pkg/family/evm/state.go b/legacy/pkg/family/evm/state.go index 8469dba..a97b994 100644 --- a/legacy/pkg/family/evm/state.go +++ b/legacy/pkg/family/evm/state.go @@ -13,7 +13,6 @@ import ( mcmscontracts "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/contracts/mcms" "github.com/smartcontractkit/cld-changesets/internal/semvers" - "github.com/smartcontractkit/cld-changesets/pkg/contract/mcms/view/v1_0" ) // MCMSWithTimelockState holds the Go bindings @@ -50,15 +49,6 @@ func (state MCMSWithTimelockState) Validate() error { return nil } -func (state MCMSWithTimelockState) GenerateMCMSWithTimelockView() (v1_0.MCMSWithTimelockView, error) { - if err := state.Validate(); err != nil { - return v1_0.MCMSWithTimelockView{}, fmt.Errorf("unable to validate McmsWithTimelock state: %w", err) - } - - return v1_0.GenerateMCMSWithTimelockView(*state.BypasserMcm, *state.CancellerMcm, *state.ProposerMcm, - *state.Timelock, *state.CallProxy) -} - // MaybeLoadMCMSWithTimelockState loads the MCMSWithTimelockState state for each chain in the given environment. func MaybeLoadMCMSWithTimelockState(env cldf.Environment, chainSelectors []uint64) (map[uint64]*MCMSWithTimelockState, error) { return MaybeLoadMCMSWithTimelockStateWithQualifier(env, chainSelectors, "") diff --git a/legacy/pkg/family/evm/state_test.go b/legacy/pkg/family/evm/state_test.go index a3b9d1b..53d1dde 100644 --- a/legacy/pkg/family/evm/state_test.go +++ b/legacy/pkg/family/evm/state_test.go @@ -2,7 +2,6 @@ package evm import ( "context" - "encoding/json" "fmt" "math/big" "strings" @@ -311,118 +310,6 @@ func testEVMEnv(t *testing.T, ds datastore.DataStore, chains chain.BlockChains) ) } -func TestMCMSWithTimelockState_GenerateMCMSWithTimelockViewV2(t *testing.T) { - t.Parallel() - - selector := chainsel.TEST_90000001.Selector - env, err := environment.New(t.Context(), - environment.WithEVMSimulated(t, []uint64{selector}), - ) - require.NoError(t, err) - - chain := env.BlockChains.EVMChains()[selector] - - proposerMcm := deployMCMEvm(t, chain, &mcmstypes.Config{Quorum: 1, Signers: []common.Address{ - common.HexToAddress("0x0000000000000000000000000000000000000001"), - }}) - cancellerMcm := deployMCMEvm(t, chain, &mcmstypes.Config{Quorum: 1, Signers: []common.Address{ - common.HexToAddress("0x0000000000000000000000000000000000000002"), - }}) - bypasserMcm := deployMCMEvm(t, chain, &mcmstypes.Config{Quorum: 1, Signers: []common.Address{ - common.HexToAddress("0x0000000000000000000000000000000000000003"), - }}) - timelock := deployTimelockEvm(t, chain, big.NewInt(1), - common.HexToAddress("0x0000000000000000000000000000000000000004"), - []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000005")}, - []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000006")}, - []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000007")}, - []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000008")}, - ) - callProxy := deployCallProxyEvm(t, chain, - common.HexToAddress("0x0000000000000000000000000000000000000009")) - - tests := []struct { - name string - contracts *MCMSWithTimelockState - want string - wantErr string - }{ - { - name: "success", - contracts: &MCMSWithTimelockState{ - ProposerMcm: proposerMcm, - CancellerMcm: cancellerMcm, - BypasserMcm: bypasserMcm, - Timelock: timelock, - CallProxy: callProxy, - }, - want: fmt.Sprintf(`{ - "proposer": { - "address": "%s", - "owner": "%s", - "config": { - "quorum": 1, - "signers": ["0x0000000000000000000000000000000000000001"], - "groupSigners": [] - } - }, - "canceller": { - "address": "%s", - "owner": "%s", - "config": { - "quorum": 1, - "signers": ["0x0000000000000000000000000000000000000002"], - "groupSigners": [] - } - }, - "bypasser": { - "address": "%s", - "owner": "%s", - "config": { - "quorum": 1, - "signers": ["0x0000000000000000000000000000000000000003"], - "groupSigners": [] - } - }, - "timelock": { - "address": "%s", - "owner": "0x0000000000000000000000000000000000000000", - "membersByRole": { - "ADMIN_ROLE": [ "0x0000000000000000000000000000000000000004" ], - "PROPOSER_ROLE": [ "0x0000000000000000000000000000000000000005" ], - "EXECUTOR_ROLE": [ "0x0000000000000000000000000000000000000006" ], - "CANCELLER_ROLE": [ "0x0000000000000000000000000000000000000007" ], - "BYPASSER_ROLE": [ "0x0000000000000000000000000000000000000008" ] - } - }, - "callProxy": { - "address": "%s", - "owner": "0x0000000000000000000000000000000000000000" - } - }`, evmAddr(proposerMcm.Address()), evmAddr(chain.DeployerKey.From), - evmAddr(cancellerMcm.Address()), evmAddr(chain.DeployerKey.From), - evmAddr(bypasserMcm.Address()), evmAddr(chain.DeployerKey.From), - evmAddr(timelock.Address()), evmAddr(callProxy.Address())), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - t.Parallel() - - state := tt.contracts - - got, err := state.GenerateMCMSWithTimelockView() - - if tt.wantErr == "" { - require.NoError(t, err) - require.JSONEq(t, tt.want, toJSON(t, &got)) - } else { - require.ErrorContains(t, err, tt.wantErr) - } - }) - } -} - func TestAddressesForChain(t *testing.T) { t.Parallel() @@ -808,15 +695,6 @@ func TestGetMCMSWithTimelockState(t *testing.T) { // ----- helpers ----- -func toJSON[T any](t *testing.T, value T) string { - t.Helper() - - bytes, err := json.Marshal(value) - require.NoError(t, err) - - return string(bytes) -} - func deployMCMEvm( t *testing.T, chain cldf_evm.Chain, config *mcmstypes.Config, ) *bindings.ManyChainMultiSig { @@ -862,7 +740,3 @@ func deployCallProxyEvm( return contract } - -func evmAddr(addr common.Address) string { - return strings.ToLower(addr.Hex()) -} diff --git a/pkg/contract/mcms/view/v1_0/mcms.go b/pkg/contract/mcms/view/v1_0/mcms.go deleted file mode 100644 index 7e4a64a..0000000 --- a/pkg/contract/mcms/view/v1_0/mcms.go +++ /dev/null @@ -1,189 +0,0 @@ -package v1_0 //nolint:revive // package name mirrors versioned contract view path - -import ( - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/common" - owner_helpers "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" - mcmsevmsdk "github.com/smartcontractkit/mcms/sdk/evm" - "github.com/smartcontractkit/mcms/sdk/evm/bindings" - mcmstypes "github.com/smartcontractkit/mcms/types" - - "github.com/smartcontractkit/chainlink-evm/pkg/utils" - - "github.com/smartcontractkit/cld-changesets/pkg/cldfutil" -) - -type Role struct { - ID common.Hash - Name string -} - -const ( - EXECUTOR_ROLE_STR = "EXECUTOR_ROLE" - //nolint:gosec // Public role identifier constant, not a credential. - BYPASSER_ROLE_STR = "BYPASSER_ROLE" - CANCELLER_ROLE_STR = "CANCELLER_ROLE" - PROPOSER_ROLE_STR = "PROPOSER_ROLE" - ADMIN_ROLE_STR = "ADMIN_ROLE" -) - -// https://github.com/smartcontractkit/ccip-owner-contracts/blob/9d81692b324ce7ea2ef8a75e683889edbc7e2dd0/src/RBACTimelock.sol#L71 -// Just to avoid invoking the Go binding to get these. -var ( - ADMIN_ROLE = Role{ - ID: utils.MustHash(ADMIN_ROLE_STR), - Name: ADMIN_ROLE_STR, - } - PROPOSER_ROLE = Role{ - ID: utils.MustHash(PROPOSER_ROLE_STR), - Name: PROPOSER_ROLE_STR, - } - BYPASSER_ROLE = Role{ - ID: utils.MustHash(BYPASSER_ROLE_STR), - Name: BYPASSER_ROLE_STR, - } - CANCELLER_ROLE = Role{ - ID: utils.MustHash(CANCELLER_ROLE_STR), - Name: CANCELLER_ROLE_STR, - } - EXECUTOR_ROLE = Role{ - ID: utils.MustHash(EXECUTOR_ROLE_STR), - Name: EXECUTOR_ROLE_STR, - } -) - -// --- evm --- - -type MCMSView struct { - cldfutil.ContractMetaData - // Note config is json marshallable. - Config mcmstypes.Config `json:"config"` -} - -func GenerateMCMSView(mcms owner_helpers.ManyChainMultiSig) (MCMSView, error) { - owner, err := mcms.Owner(nil) - if err != nil { - return MCMSView{}, err - } - mcmsConfig, err := mcms.GetConfig(nil) - if err != nil { - return MCMSView{}, err - } - - mapSigners := func(in []owner_helpers.ManyChainMultiSigSigner) []bindings.ManyChainMultiSigSigner { - out := make([]bindings.ManyChainMultiSigSigner, len(in)) - for i, s := range in { - out[i] = bindings.ManyChainMultiSigSigner{Addr: s.Addr, Index: s.Index, Group: s.Group} - } - - return out - } - - parsedConfig, err := mcmsevmsdk.NewConfigTransformer().ToConfig(bindings.ManyChainMultiSigConfig{ - Signers: mapSigners(mcmsConfig.Signers), - GroupQuorums: mcmsConfig.GroupQuorums, - GroupParents: mcmsConfig.GroupParents, - }) - if err != nil { - return MCMSView{}, err - } - - return MCMSView{ - // Has no type and version on the contract - ContractMetaData: cldfutil.ContractMetaData{ - Owner: owner, - Address: mcms.Address(), - }, - Config: *parsedConfig, - }, nil -} - -type TimelockView struct { - cldfutil.ContractMetaData - MembersByRole map[string][]common.Address `json:"membersByRole"` -} - -func GenerateTimelockView(tl owner_helpers.RBACTimelock) (TimelockView, error) { - membersByRole := make(map[string][]common.Address) - for _, role := range []Role{ADMIN_ROLE, PROPOSER_ROLE, BYPASSER_ROLE, CANCELLER_ROLE, EXECUTOR_ROLE} { - numMembers, err := tl.GetRoleMemberCount(nil, role.ID) - if err != nil { - return TimelockView{}, fmt.Errorf("get role member count for role %s (%s): %w", role.Name, role.ID.Hex(), err) - } - memberCount := numMembers.Int64() - for i := range memberCount { - member, err2 := tl.GetRoleMember(nil, role.ID, big.NewInt(i)) - if err2 != nil { - return TimelockView{}, fmt.Errorf("get role member for role %s (%s) at index %d: %w", role.Name, role.ID.Hex(), i, err2) - } - membersByRole[role.Name] = append(membersByRole[role.Name], member) - } - } - - return TimelockView{ - // Has no type and version or owner. - ContractMetaData: cldfutil.ContractMetaData{ - Address: tl.Address(), - }, - MembersByRole: membersByRole, - }, nil -} - -type CallProxyView struct { - cldfutil.ContractMetaData -} - -func GenerateCallProxyView(cp owner_helpers.CallProxy) (CallProxyView, error) { - return CallProxyView{ - ContractMetaData: cldfutil.ContractMetaData{ - Address: cp.Address(), - }, - }, nil -} - -type MCMSWithTimelockView struct { - Bypasser MCMSView `json:"bypasser"` - Canceller MCMSView `json:"canceller"` - Proposer MCMSView `json:"proposer"` - Timelock TimelockView `json:"timelock"` - CallProxy CallProxyView `json:"callProxy"` -} - -func GenerateMCMSWithTimelockView( - bypasser owner_helpers.ManyChainMultiSig, - canceller owner_helpers.ManyChainMultiSig, - proposer owner_helpers.ManyChainMultiSig, - timelock owner_helpers.RBACTimelock, - callProxy owner_helpers.CallProxy, -) (MCMSWithTimelockView, error) { - timelockView, err := GenerateTimelockView(timelock) - if err != nil { - return MCMSWithTimelockView{}, err - } - callProxyView, err := GenerateCallProxyView(callProxy) - if err != nil { - return MCMSWithTimelockView{}, err - } - bypasserView, err := GenerateMCMSView(bypasser) - if err != nil { - return MCMSWithTimelockView{}, err - } - proposerView, err := GenerateMCMSView(proposer) - if err != nil { - return MCMSWithTimelockView{}, err - } - cancellerView, err := GenerateMCMSView(canceller) - if err != nil { - return MCMSWithTimelockView{}, err - } - - return MCMSWithTimelockView{ - Timelock: timelockView, - Bypasser: bypasserView, - Proposer: proposerView, - Canceller: cancellerView, - CallProxy: callProxyView, - }, nil -} diff --git a/pkg/family/evm/sequences/grant_roles_for_timelock.go b/pkg/family/evm/sequences/grant_roles_for_timelock.go index 882987f..ea79752 100644 --- a/pkg/family/evm/sequences/grant_roles_for_timelock.go +++ b/pkg/family/evm/sequences/grant_roles_for_timelock.go @@ -13,8 +13,7 @@ import ( cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" - "github.com/smartcontractkit/cld-changesets/pkg/contract/mcms/view/v1_0" - + "github.com/smartcontractkit/cld-changesets/internal/mcmsrole" opsevm "github.com/smartcontractkit/cld-changesets/pkg/family/evm/operations" ) @@ -56,15 +55,15 @@ var SeqGrantRolesTimelock = operations.NewSequence( for _, roleAndAddress := range in.RolesAndAddresses { switch roleAndAddress.Role { - case v1_0.PROPOSER_ROLE.ID: + case mcmsrole.ProposerRole.ID: addressesInInspector, err2 = timelockInspector.GetProposers(b.GetContext(), in.Timelock.Hex()) - case v1_0.CANCELLER_ROLE.ID: + case mcmsrole.CancellerRole.ID: addressesInInspector, err2 = timelockInspector.GetCancellers(b.GetContext(), in.Timelock.Hex()) - case v1_0.BYPASSER_ROLE.ID: + case mcmsrole.BypasserRole.ID: addressesInInspector, err2 = timelockInspector.GetBypassers(b.GetContext(), in.Timelock.Hex()) - case v1_0.EXECUTOR_ROLE.ID: + case mcmsrole.ExecutorRole.ID: addressesInInspector, err2 = timelockInspector.GetExecutors(b.GetContext(), in.Timelock.Hex()) - case v1_0.ADMIN_ROLE.ID: + case mcmsrole.AdminRole.ID: addressesInInspector = []string{} } if err2 != nil {