Skip to content

Commit 6b95819

Browse files
tests: replace legacy changeset usage with new
Replace legacy changeset usage in the new changeset tests , spefiically the deploy mcms legacy changeset, now they use the new deploy changeset for mcms
1 parent e9a713b commit 6b95819

12 files changed

Lines changed: 282 additions & 172 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Package solanatest provides test utilities for Solana MCMS integration tests.
2+
package solanatest
3+
4+
import (
5+
"testing"
6+
7+
"github.com/smartcontractkit/chainlink-deployments-framework/datastore"
8+
mcmscontracts "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/contracts/mcms"
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/smartcontractkit/cld-changesets/internal/semvers"
12+
"github.com/smartcontractkit/cld-changesets/legacy/pkg/family/solana/solutils"
13+
)
14+
15+
// PreloadDatastoreWithMCMSPrograms seeds a datastore with canonical MCMS program IDs
16+
// for the given chain selector. Use with the mcms/changesets/deploy changeset.
17+
func PreloadDatastoreWithMCMSPrograms(t *testing.T, selector uint64) datastore.DataStore {
18+
t.Helper()
19+
20+
v := semvers.V1_0_0
21+
ds := datastore.NewMemoryDataStore()
22+
for _, entry := range []struct {
23+
addr string
24+
ct datastore.ContractType
25+
}{
26+
{solutils.GetProgramID(solutils.ProgAccessController), datastore.ContractType(mcmscontracts.AccessControllerProgram)},
27+
{solutils.GetProgramID(solutils.ProgMCM), datastore.ContractType(mcmscontracts.ManyChainMultisigProgram)},
28+
{solutils.GetProgramID(solutils.ProgTimelock), datastore.ContractType(mcmscontracts.RBACTimelockProgram)},
29+
} {
30+
require.NoError(t, ds.Addresses().Add(datastore.AddressRef{
31+
ChainSelector: selector,
32+
Address: entry.addr,
33+
Type: entry.ct,
34+
Version: &v,
35+
}))
36+
}
37+
38+
return ds.Seal()
39+
}

mcms/changesets/set-config/changeset_test.go

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,14 @@ import (
2525

2626
"github.com/smartcontractkit/cld-changesets/datastore/refkey"
2727
"github.com/smartcontractkit/cld-changesets/internal/semvers"
28-
29-
// TODO: remove legacymcms import once remaining MCMS changesets are migrated out of legacy/mcms/changesets.
30-
legacymcms "github.com/smartcontractkit/cld-changesets/legacy/mcms/changesets"
31-
evmstate "github.com/smartcontractkit/cld-changesets/legacy/pkg/family/evm"
3228
solstate "github.com/smartcontractkit/cld-changesets/legacy/pkg/family/solana"
3329
solchangesets "github.com/smartcontractkit/cld-changesets/legacy/pkg/family/solana/changesets"
3430
soltestutils "github.com/smartcontractkit/cld-changesets/legacy/pkg/family/solana/testutils"
31+
"github.com/smartcontractkit/cld-changesets/mcms/changesets/deploy"
3532
setconfig "github.com/smartcontractkit/cld-changesets/mcms/changesets/set-config"
3633
_ "github.com/smartcontractkit/cld-changesets/mcms/changesets/set-config/all"
34+
_ "github.com/smartcontractkit/cld-changesets/mcms/evm/deploy"
35+
evmreaders "github.com/smartcontractkit/cld-changesets/mcms/evm/readers"
3736
)
3837

3938
//nolint:paralleltest // global mcm.SetProgramID state and shared Solana CTF container setup
@@ -240,14 +239,14 @@ func TestChangeset_EVM(t *testing.T) {
240239
},
241240
} {
242241
t.Run(tt.name, func(t *testing.T) {
243-
mcmsState, _ := evmMCMSChainState(t, rt, tt.selector)
242+
mcmsRefs, _ := loadEVMMCMSRefs(t, rt, tt.selector)
244243
originalCfg := cldftesthelpers.SingleGroupMCMS(t)
245244

246245
var targets []setconfig.ContractSetConfig
247246
var mcmsInput *cldf.MCMSTimelockProposalInput
248247
if tt.useMCMS {
249248
cfgCanceller := cldftesthelpers.SingleGroupMCMS(t)
250-
cfgCanceller.Signers = append(cfgCanceller.Signers, mcmsState.BypasserMcm.Address())
249+
cfgCanceller.Signers = append(cfgCanceller.Signers, mcmsRefs.Bypasser)
251250
cfgCanceller.Quorum = 2
252251
targets = []setconfig.ContractSetConfig{
253252
{
@@ -257,15 +256,15 @@ func TestChangeset_EVM(t *testing.T) {
257256
}
258257
mcmsInput = newMCMSInput(mcmstypes.TimelockActionBypass, "Set config proposal", "")
259258
} else {
260-
timelockAddress := mcmsState.Timelock.Address()
259+
timelockAddress := mcmsRefs.Timelock
261260

262261
cfgProposer := cldftesthelpers.SingleGroupMCMS(t)
263262
cfgProposer.Signers = append(cfgProposer.Signers, timelockAddress)
264263
cfgProposer.Quorum = 2
265264
cfgCanceller := cldftesthelpers.SingleGroupMCMS(t)
266265
cfgBypasser := cldftesthelpers.SingleGroupMCMS(t)
267266
cfgBypasser.Signers = append(cfgBypasser.Signers, timelockAddress)
268-
cfgBypasser.Signers = append(cfgBypasser.Signers, mcmsState.ProposerMcm.Address())
267+
cfgBypasser.Signers = append(cfgBypasser.Signers, mcmsRefs.Proposer)
269268
cfgBypasser.Quorum = 3
270269

271270
targets = mcmsTargets(tt.selector, cfgProposer, cfgCanceller, cfgBypasser)
@@ -285,17 +284,17 @@ func TestChangeset_EVM(t *testing.T) {
285284

286285
if tt.useMCMS {
287286
cfgCanceller := targets[0].Config
288-
newConf, err := inspector.GetConfig(t.Context(), mcmsState.CancellerMcm.Address().Hex())
287+
newConf, err := inspector.GetConfig(t.Context(), mcmsRefs.Canceller.Hex())
289288
require.NoError(t, err)
290289
require.ElementsMatch(t, cfgCanceller.Signers, newConf.Signers)
291290
require.Equal(t, cfgCanceller.Quorum, newConf.Quorum)
292291

293-
proposerConf, err := inspector.GetConfig(t.Context(), mcmsState.ProposerMcm.Address().Hex())
292+
proposerConf, err := inspector.GetConfig(t.Context(), mcmsRefs.Proposer.Hex())
294293
require.NoError(t, err)
295294
require.ElementsMatch(t, originalCfg.Signers, proposerConf.Signers)
296295
require.Equal(t, originalCfg.Quorum, proposerConf.Quorum)
297296

298-
bypasserConf, err := inspector.GetConfig(t.Context(), mcmsState.BypasserMcm.Address().Hex())
297+
bypasserConf, err := inspector.GetConfig(t.Context(), mcmsRefs.Bypasser.Hex())
299298
require.NoError(t, err)
300299
require.ElementsMatch(t, originalCfg.Signers, bypasserConf.Signers)
301300
require.Equal(t, originalCfg.Quorum, bypasserConf.Quorum)
@@ -307,17 +306,17 @@ func TestChangeset_EVM(t *testing.T) {
307306
cfgCanceller := targets[1].Config
308307
cfgBypasser := targets[2].Config
309308

310-
newConf, err := inspector.GetConfig(t.Context(), mcmsState.ProposerMcm.Address().Hex())
309+
newConf, err := inspector.GetConfig(t.Context(), mcmsRefs.Proposer.Hex())
311310
require.NoError(t, err)
312311
require.ElementsMatch(t, cfgProposer.Signers, newConf.Signers)
313312
require.Equal(t, cfgProposer.Quorum, newConf.Quorum)
314313

315-
newConf, err = inspector.GetConfig(t.Context(), mcmsState.BypasserMcm.Address().Hex())
314+
newConf, err = inspector.GetConfig(t.Context(), mcmsRefs.Bypasser.Hex())
316315
require.NoError(t, err)
317316
require.ElementsMatch(t, cfgBypasser.Signers, newConf.Signers)
318317
require.Equal(t, cfgBypasser.Quorum, newConf.Quorum)
319318

320-
newConf, err = inspector.GetConfig(t.Context(), mcmsState.CancellerMcm.Address().Hex())
319+
newConf, err = inspector.GetConfig(t.Context(), mcmsRefs.Canceller.Hex())
321320
require.NoError(t, err)
322321
require.ElementsMatch(t, cfgCanceller.Signers, newConf.Signers)
323322
require.Equal(t, cfgCanceller.Quorum, newConf.Quorum)
@@ -331,10 +330,10 @@ func TestChangeset_EVM_PartialTargets(t *testing.T) {
331330
selector := chain_selectors.TEST_90000001.Selector
332331

333332
rt := newEVMRuntimeWithDeploy(t, selector)
334-
mcmsState, chain := evmMCMSChainState(t, rt, selector)
333+
mcmsRefs, chain := loadEVMMCMSRefs(t, rt, selector)
335334

336335
cfgProposer := cldftesthelpers.SingleGroupMCMS(t)
337-
cfgProposer.Signers = append(cfgProposer.Signers, mcmsState.Timelock.Address())
336+
cfgProposer.Signers = append(cfgProposer.Signers, mcmsRefs.Timelock)
338337
cfgProposer.Quorum = 2
339338

340339
err := rt.Exec(
@@ -353,17 +352,17 @@ func TestChangeset_EVM_PartialTargets(t *testing.T) {
353352
inspector := evm.NewInspector(chain.Client)
354353
originalCfg := cldftesthelpers.SingleGroupMCMS(t)
355354

356-
proposerConf, err := inspector.GetConfig(t.Context(), mcmsState.ProposerMcm.Address().Hex())
355+
proposerConf, err := inspector.GetConfig(t.Context(), mcmsRefs.Proposer.Hex())
357356
require.NoError(t, err)
358357
require.ElementsMatch(t, cfgProposer.Signers, proposerConf.Signers)
359358
require.Equal(t, cfgProposer.Quorum, proposerConf.Quorum)
360359

361-
cancellerConf, err := inspector.GetConfig(t.Context(), mcmsState.CancellerMcm.Address().Hex())
360+
cancellerConf, err := inspector.GetConfig(t.Context(), mcmsRefs.Canceller.Hex())
362361
require.NoError(t, err)
363362
require.ElementsMatch(t, originalCfg.Signers, cancellerConf.Signers)
364363
require.Equal(t, originalCfg.Quorum, cancellerConf.Quorum)
365364

366-
bypasserConf, err := inspector.GetConfig(t.Context(), mcmsState.BypasserMcm.Address().Hex())
365+
bypasserConf, err := inspector.GetConfig(t.Context(), mcmsRefs.Bypasser.Hex())
367366
require.NoError(t, err)
368367
require.ElementsMatch(t, originalCfg.Signers, bypasserConf.Signers)
369368
require.Equal(t, originalCfg.Quorum, bypasserConf.Quorum)
@@ -385,21 +384,26 @@ func TestChangeset_EVM_Qualifier(t *testing.T) {
385384
rmnmcmsConfig.Qualifier = &rmnmcmsQualifier
386385

387386
err := rt.Exec(
388-
runtime.ChangesetTask(cldf.CreateLegacyChangeSet(legacymcms.DeployMCMSWithTimelockV2), map[uint64]cldfproposalutils.MCMSWithTimelockConfig{
389-
selector: cllccipConfig,
387+
runtime.ChangesetTask(deploy.Changeset{}, deploy.Input{
388+
ConfigByChain: map[uint64]cldfproposalutils.MCMSWithTimelockConfig{
389+
selector: cllccipConfig,
390+
},
390391
}),
391-
runtime.ChangesetTask(cldf.CreateLegacyChangeSet(legacymcms.DeployMCMSWithTimelockV2), map[uint64]cldfproposalutils.MCMSWithTimelockConfig{
392-
selector: rmnmcmsConfig,
392+
runtime.ChangesetTask(deploy.Changeset{}, deploy.Input{
393+
ConfigByChain: map[uint64]cldfproposalutils.MCMSWithTimelockConfig{
394+
selector: rmnmcmsConfig,
395+
},
393396
}),
394397
)
395398
require.NoError(t, err)
396399

397-
cllccipState, err := evmstate.MaybeLoadMCMSWithTimelockStateWithQualifier(rt.Environment(), []uint64{selector}, cllccipQualifier)
400+
cllccipTimelock, err := evmreaders.Reader{}.GetTimelockRef(rt.Environment(), selector, cldf.MCMSTimelockProposalInput{
401+
Qualifier: cllccipQualifier,
402+
})
398403
require.NoError(t, err)
399-
require.NotNil(t, cllccipState[selector])
400404

401405
cfgProposer := cldftesthelpers.SingleGroupMCMS(t)
402-
cfgProposer.Signers = append(cfgProposer.Signers, cllccipState[selector].Timelock.Address())
406+
cfgProposer.Signers = append(cfgProposer.Signers, common.HexToAddress(cllccipTimelock.Address))
403407
cfgProposer.Quorum = 2
404408

405409
for _, tt := range []struct {

mcms/changesets/set-config/helpers_test.go

Lines changed: 62 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,18 @@ import (
2121

2222
"github.com/smartcontractkit/cld-changesets/datastore/refkey"
2323
"github.com/smartcontractkit/cld-changesets/internal/semvers"
24+
"github.com/smartcontractkit/cld-changesets/internal/testutil/solanatest"
2425

25-
// TODO: remove legacymcms import once remaining MCMS changesets are migrated out of legacy/mcms/changesets.
26-
legacymcms "github.com/smartcontractkit/cld-changesets/legacy/mcms/changesets"
27-
evmstate "github.com/smartcontractkit/cld-changesets/legacy/pkg/family/evm"
2826
soltestutils "github.com/smartcontractkit/cld-changesets/legacy/pkg/family/solana/testutils"
27+
"github.com/smartcontractkit/cld-changesets/mcms/changesets/deploy"
2928
setconfig "github.com/smartcontractkit/cld-changesets/mcms/changesets/set-config"
3029
_ "github.com/smartcontractkit/cld-changesets/mcms/changesets/set-config/all"
30+
transfertotimelock "github.com/smartcontractkit/cld-changesets/mcms/changesets/transfer-to-timelock"
31+
_ "github.com/smartcontractkit/cld-changesets/mcms/evm/deploy"
32+
_ "github.com/smartcontractkit/cld-changesets/mcms/evm/readers"
33+
evmreaders "github.com/smartcontractkit/cld-changesets/mcms/evm/readers"
34+
_ "github.com/smartcontractkit/cld-changesets/mcms/evm/transfer-to-timelock"
35+
_ "github.com/smartcontractkit/cld-changesets/mcms/solana/deploy"
3136
)
3237

3338
func contractRef(chainSelector uint64, contractType cldf.ContractType, qualifier string) refkey.RefKey {
@@ -88,10 +93,9 @@ func deployEVMMCMSWithTimelock(t *testing.T, rt *runtime.Runtime, selectors ...u
8893
configByChain[selector] = cfg
8994
}
9095

91-
err := rt.Exec(
92-
// TODO: replace with new deploy changeset when available
93-
runtime.ChangesetTask(cldf.CreateLegacyChangeSet(legacymcms.DeployMCMSWithTimelockV2), configByChain),
94-
)
96+
err := rt.Exec(runtime.ChangesetTask(deploy.Changeset{}, deploy.Input{
97+
ConfigByChain: configByChain,
98+
}))
9599
require.NoError(t, err)
96100
}
97101

@@ -107,17 +111,25 @@ func newEVMRuntimeWithDeploy(t *testing.T, selectors ...uint64) *runtime.Runtime
107111
func transferEVMMCMSToTimelock(t *testing.T, rt *runtime.Runtime, selector uint64) {
108112
t.Helper()
109113

110-
mcmsState, _ := evmMCMSChainState(t, rt, selector)
114+
mcmsRefs, _ := loadEVMMCMSRefs(t, rt, selector)
111115

112116
err := rt.Exec(
113-
runtime.ChangesetTask(cldf.CreateLegacyChangeSet(legacymcms.TransferToMCMSWithTimelockV2), legacymcms.TransferToMCMSWithTimelockConfig{
114-
ContractsByChain: map[uint64][]common.Address{
115-
selector: {
116-
mcmsState.ProposerMcm.Address(),
117-
mcmsState.BypasserMcm.Address(),
118-
mcmsState.CancellerMcm.Address(),
117+
runtime.ChangesetTask(transfertotimelock.Changeset{}, transfertotimelock.Input{
118+
Cfg: transfertotimelock.Config{
119+
ContractsByChain: map[uint64][]common.Address{
120+
selector: {
121+
mcmsRefs.Proposer,
122+
mcmsRefs.Bypasser,
123+
mcmsRefs.Canceller,
124+
},
119125
},
120126
},
127+
MCMS: &cldf.MCMSTimelockProposalInput{
128+
TimelockAction: mcmstypes.TimelockActionBypass,
129+
ValidUntil: uint32(time.Now().Add(2 * time.Hour).UTC().Unix()), //nolint:gosec // test timestamp
130+
TimelockDelay: mcmstypes.NewDuration(0),
131+
Description: "transfer MCM to timelock",
132+
},
121133
}),
122134
runtime.SignAndExecuteProposalsTask([]*ecdsa.PrivateKey{cldftesthelpers.TestXXXMCMSSigner}),
123135
)
@@ -133,34 +145,60 @@ func newEVMRuntimeWithDeployAndTransfer(t *testing.T, selector uint64) *runtime.
133145
return rt
134146
}
135147

136-
func evmMCMSChainState(t *testing.T, rt *runtime.Runtime, selector uint64) (*evmstate.MCMSWithTimelockState, cldf_evm.Chain) {
148+
type evmMCMSRefs struct {
149+
Timelock common.Address
150+
Proposer common.Address
151+
Canceller common.Address
152+
Bypasser common.Address
153+
}
154+
155+
func loadEVMMCMSRefs(t *testing.T, rt *runtime.Runtime, selector uint64) (evmMCMSRefs, cldf_evm.Chain) {
137156
t.Helper()
138157

139-
chain := rt.Environment().BlockChains.EVMChains()[selector]
140-
addrs, err := rt.State().AddressBook.AddressesForChain(selector)
141-
require.NoError(t, err)
158+
env := rt.Environment()
159+
chain := env.BlockChains.EVMChains()[selector]
142160

143-
mcmsState, err := evmstate.MaybeLoadMCMSWithTimelockChainState(chain, addrs)
161+
reader := evmreaders.Reader{}
162+
timelock, err := reader.GetTimelockRef(env, selector, cldf.MCMSTimelockProposalInput{})
163+
require.NoError(t, err)
164+
proposer, err := reader.GetMCMSRef(env, selector, cldf.MCMSTimelockProposalInput{
165+
TimelockAction: mcmstypes.TimelockActionSchedule,
166+
})
167+
require.NoError(t, err)
168+
canceller, err := reader.GetMCMSRef(env, selector, cldf.MCMSTimelockProposalInput{
169+
TimelockAction: mcmstypes.TimelockActionCancel,
170+
})
171+
require.NoError(t, err)
172+
bypasser, err := reader.GetMCMSRef(env, selector, cldf.MCMSTimelockProposalInput{
173+
TimelockAction: mcmstypes.TimelockActionBypass,
174+
})
144175
require.NoError(t, err)
145176

146-
return mcmsState, chain
177+
return evmMCMSRefs{
178+
Timelock: common.HexToAddress(timelock.Address),
179+
Proposer: common.HexToAddress(proposer.Address),
180+
Canceller: common.HexToAddress(canceller.Address),
181+
Bypasser: common.HexToAddress(bypasser.Address),
182+
}, chain
147183
}
148184

149185
func newSolanaRuntimeWithDeploy(t *testing.T, selector uint64) *runtime.Runtime {
150186
t.Helper()
151187

152-
programsPath, programIDs, ab := soltestutils.PreloadMCMS(t, selector)
188+
programsPath, programIDs := soltestutils.LoadMCMSPrograms(t, t.TempDir())
153189
rt, err := runtime.New(t.Context(), runtime.WithEnvOpts(
154190
environment.WithSolanaContainer(t, []uint64{selector}, programsPath, programIDs),
155-
environment.WithAddressBook(ab),
191+
environment.WithDatastore(solanatest.PreloadDatastoreWithMCMSPrograms(t, selector)),
156192
environment.WithLogger(logger.Test(t)),
157193
))
158194
require.NoError(t, err)
159195
require.Contains(t, rt.Environment().BlockChains.SolanaChains(), selector)
160196

161197
err = rt.Exec(
162-
runtime.ChangesetTask(cldf.CreateLegacyChangeSet(legacymcms.DeployMCMSWithTimelockV2), map[uint64]cldfproposalutils.MCMSWithTimelockConfig{
163-
selector: cldftesthelpers.SingleGroupTimelockConfig(t),
198+
runtime.ChangesetTask(deploy.Changeset{}, deploy.Input{
199+
ConfigByChain: map[uint64]cldfproposalutils.MCMSWithTimelockConfig{
200+
selector: cldftesthelpers.SingleGroupTimelockConfig(t),
201+
},
164202
}),
165203
)
166204
require.NoError(t, err)

mcms/evm/firedrill/changeset_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ import (
1515
mcmstypes "github.com/smartcontractkit/mcms/types"
1616
"github.com/stretchr/testify/require"
1717

18-
legacymcms "github.com/smartcontractkit/cld-changesets/legacy/mcms/changesets"
18+
"github.com/smartcontractkit/cld-changesets/mcms/changesets/deploy"
1919
firedrill "github.com/smartcontractkit/cld-changesets/mcms/changesets/firedrill"
2020

21+
_ "github.com/smartcontractkit/cld-changesets/mcms/evm/deploy"
2122
_ "github.com/smartcontractkit/cld-changesets/mcms/evm/firedrill"
2223
_ "github.com/smartcontractkit/cld-changesets/mcms/evm/readers"
2324
)
@@ -66,8 +67,10 @@ func newEVMFireDrillRuntime(t *testing.T, selector uint64) *runtime.Runtime {
6667
require.NoError(t, err)
6768

6869
err = rt.Exec(
69-
runtime.ChangesetTask(cldf.CreateLegacyChangeSet(legacymcms.DeployMCMSWithTimelockV2), map[uint64]cldfproposalutils.MCMSWithTimelockConfig{
70-
selector: cldftesthelpers.SingleGroupTimelockConfig(t),
70+
runtime.ChangesetTask(deploy.Changeset{}, deploy.Input{
71+
ConfigByChain: map[uint64]cldfproposalutils.MCMSWithTimelockConfig{
72+
selector: cldftesthelpers.SingleGroupTimelockConfig(t),
73+
},
7174
}),
7275
)
7376
require.NoError(t, err)

0 commit comments

Comments
 (0)