diff --git a/deployment/common/changeset/state.go b/deployment/common/changeset/state.go index 604e8f35457..5dabf1447e3 100644 --- a/deployment/common/changeset/state.go +++ b/deployment/common/changeset/state.go @@ -102,11 +102,20 @@ func MaybeLoadMCMSWithTimelockChainState( bypasser = deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0) // the same contract can have different roles - multichain = deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) - // Convert map keys to a slice - wantTypes = []deployment.TypeAndVersion{timelock, proposer, canceller, bypasser, callProxy} + multichain = deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + proposerMCMS = deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + bypasserMCMS = deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + cancellerMCMS = deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) ) + // Convert map keys to a slice + proposerMCMS.Labels.Add(types.ProposerRole.String()) + bypasserMCMS.Labels.Add(types.BypasserRole.String()) + cancellerMCMS.Labels.Add(types.CancellerRole.String()) + wantTypes := []deployment.TypeAndVersion{timelock, proposer, canceller, bypasser, callProxy, + proposerMCMS, bypasserMCMS, cancellerMCMS, + } + // Ensure we either have the bundle or not. _, err := deployment.EnsureDeduped(addresses, wantTypes) if err != nil { diff --git a/deployment/common/changeset/state_test.go b/deployment/common/changeset/state_test.go index 1537a772e1c..4c477a87c68 100644 --- a/deployment/common/changeset/state_test.go +++ b/deployment/common/changeset/state_test.go @@ -177,6 +177,29 @@ func TestMaybeLoadMCMSWithTimelockChainState(t *testing.T) { }, wantErr: "unable to check MCMS contracts", }, + { + name: "NOK_multiple generic MCMS contracts with same label", + chain: defaultChain, + addresses: map[string]deployment.TypeAndVersion{ + "0x123": deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0), + "0x456": deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0), + "0xabc": deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0), + "0xdef": deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0), + + "0x789": deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0), + "0xaaa": func() deployment.TypeAndVersion { + tv := deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + tv.Labels.Add(types.ProposerRole.String()) + return tv + }(), + "0xbbb": func() deployment.TypeAndVersion { + tv := deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + tv.Labels.Add(types.ProposerRole.String()) + return tv + }(), + }, + wantErr: "unable to check MCMS contracts", + }, } for _, tt := range tests {