88 "github.com/stretchr/testify/require"
99
1010 chainselectors "github.com/smartcontractkit/chain-selectors"
11+ cldfsol "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana"
1112 mcmscontracts "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/contracts/mcms"
1213 cldftesthelpers "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/mcms/proposalutils/testhelpers"
1314 "github.com/smartcontractkit/chainlink-deployments-framework/engine/test/runtime"
@@ -18,70 +19,95 @@ import (
1819
1920//nolint:paralleltest // global mcm.SetProgramID state; serialized via soltestutils.PreloadMCMS lock
2021func TestSolanaSetConfig (t * testing.T ) {
21- t .Run ("operation" , testOpSolanaSetConfigMCM )
22- t .Run ("sequence" , testRunSolanaSetConfig )
23- }
24-
25- func testOpSolanaSetConfigMCM (t * testing.T ) {
2622 selector := chainselectors .TEST_22222222222222222222222222222222222222222222 .Selector
27- rt := newSolanaSetConfigRuntime (t , selector )
28- chain := rt .Environment ().BlockChains .SolanaChains ()[selector ]
29- refs := solanaSetConfigRefs (t , rt .Environment (), selector )
30- fundSolanaSignerPDAs (t , chain , refs )
3123
24+ // Direct-send cases must not mutate MCMS quorum before transfer runs in the MCMS group.
3225 t .Run ("direct send" , func (t * testing.T ) { //nolint:paralleltest // shared runtime state
33- cfg := cldftesthelpers .SingleGroupMCMS (t )
34- cfg .Signers = append (cfg .Signers , common .HexToAddress ("0x0000000000000000000000000000000000000909" ))
35- cfg .Quorum = 2
26+ rt := newSolanaSetConfigRuntime (t , selector )
27+ chain := rt .Environment ().BlockChains .SolanaChains ()[selector ]
28+ refs := solanaSetConfigRefs (t , rt .Environment (), selector )
29+ fundSolanaSignerPDAs (t , chain , refs )
3630
37- report , err := operations .ExecuteOperation (
38- rt .Environment ().OperationsBundle ,
39- OpSolanaSetConfigMCM ,
40- chain ,
41- OpSolanaSetConfigInput {
42- Target : MCMSetConfigTarget {
43- Address : refs .Canceller ,
44- Config : cfg ,
45- ContractType : string (mcmscontracts .CancellerManyChainMultisig ),
46- },
47- NoSend : false ,
48- },
49- )
50- require .NoError (t , err )
51- require .True (t , report .Output .Confirmed )
52- assertSolanaConfigEquals (t , mcmssolana .NewInspector (chain .Client ), refs .Canceller , cfg )
31+ t .Run ("operation" , func (t * testing.T ) { //nolint:paralleltest // shared runtime state
32+ testOpSolanaSetConfigDirectSend (t , rt , chain , refs )
33+ })
34+ t .Run ("sequence" , func (t * testing.T ) { //nolint:paralleltest // shared runtime state
35+ testRunSolanaSetConfigDirectSend (t , rt , chain , refs , selector )
36+ })
5337 })
5438
39+ // MCMS cases share one fresh deploy; transfer runs once before any timelock proposals.
5540 t .Run ("MCMS proposal" , func (t * testing.T ) { //nolint:paralleltest // shared runtime state
56- transferSolanaMCMSToTimelock (t , rt , selector )
41+ rt := newSolanaSetConfigRuntime (t , selector )
42+ chain := rt .Environment ().BlockChains .SolanaChains ()[selector ]
43+ refs := solanaSetConfigRefs (t , rt .Environment (), selector )
5744 fundSolanaSignerPDAs (t , chain , refs )
5845
59- cfg := cldftesthelpers .SingleGroupMCMS (t )
60- cfg .Signers = append (cfg .Signers , common .HexToAddress ("0x0000000000000000000000000000000000000909" ))
61- cfg .Quorum = 2
46+ t .Run ("operation" , func (t * testing.T ) { //nolint:paralleltest // shared runtime state
47+ testOpSolanaSetConfigMCMSProposal (t , rt , chain , refs , selector )
48+ })
49+ t .Run ("sequence" , func (t * testing.T ) { //nolint:paralleltest // shared runtime state
50+ testRunSolanaSetConfigMCMSProposal (t , rt , chain , refs , selector )
51+ })
52+ })
53+ }
54+
55+ func testOpSolanaSetConfigDirectSend (t * testing.T , rt * runtime.Runtime , chain cldfsol.Chain , refs solanaMCMSRefs ) {
56+ t .Helper ()
57+
58+ cfg := cldftesthelpers .SingleGroupMCMS (t )
59+ cfg .Signers = append (cfg .Signers , common .HexToAddress ("0x0000000000000000000000000000000000000909" ))
60+ cfg .Quorum = 2
6261
63- report , err := operations .ExecuteOperation (
64- rt .Environment ().OperationsBundle ,
65- OpSolanaSetConfigMCM ,
66- chain ,
67- OpSolanaSetConfigInput {
68- Target : MCMSetConfigTarget {
69- Address : refs .Canceller ,
70- Config : cfg ,
71- ContractType : string (mcmscontracts .CancellerManyChainMultisig ),
72- },
73- NoSend : true ,
74- AuthorityAccount : refs .TimelockSigner ,
62+ report , err := operations .ExecuteOperation (
63+ rt .Environment ().OperationsBundle ,
64+ OpSolanaSetConfigMCM ,
65+ chain ,
66+ OpSolanaSetConfigInput {
67+ Target : MCMSetConfigTarget {
68+ Address : refs .Canceller ,
69+ Config : cfg ,
70+ ContractType : string (mcmscontracts .CancellerManyChainMultisig ),
7571 },
76- )
77- require .NoError (t , err )
78- require .False (t , report .Output .Confirmed )
79- require .Equal (t , mcmstypes .ChainSelector (selector ), report .Output .BatchOperation .ChainSelector )
80- require .NotEmpty (t , report .Output .BatchOperation .Transactions )
81- require .NoError (t , rt .Exec (
82- newTimelockProposalTask ([]mcmstypes.BatchOperation {report .Output .BatchOperation }, "solana set config operation test" ),
83- runtime .SignAndExecuteProposalsTask ([]* ecdsa.PrivateKey {cldftesthelpers .TestXXXMCMSSigner }),
84- ))
85- assertSolanaConfigEquals (t , mcmssolana .NewInspector (chain .Client ), refs .Canceller , cfg )
86- })
72+ NoSend : false ,
73+ },
74+ )
75+ require .NoError (t , err )
76+ require .True (t , report .Output .Confirmed )
77+ assertSolanaConfigEquals (t , mcmssolana .NewInspector (chain .Client ), refs .Canceller , cfg )
78+ }
79+
80+ func testOpSolanaSetConfigMCMSProposal (t * testing.T , rt * runtime.Runtime , chain cldfsol.Chain , refs solanaMCMSRefs , selector uint64 ) {
81+ t .Helper ()
82+
83+ transferSolanaMCMSToTimelock (t , rt , selector )
84+ fundSolanaSignerPDAs (t , chain , refs )
85+
86+ cfg := cldftesthelpers .SingleGroupMCMS (t )
87+ cfg .Signers = append (cfg .Signers , common .HexToAddress ("0x0000000000000000000000000000000000000909" ))
88+ cfg .Quorum = 2
89+
90+ report , err := operations .ExecuteOperation (
91+ rt .Environment ().OperationsBundle ,
92+ OpSolanaSetConfigMCM ,
93+ chain ,
94+ OpSolanaSetConfigInput {
95+ Target : MCMSetConfigTarget {
96+ Address : refs .Canceller ,
97+ Config : cfg ,
98+ ContractType : string (mcmscontracts .CancellerManyChainMultisig ),
99+ },
100+ NoSend : true ,
101+ AuthorityAccount : refs .TimelockSigner ,
102+ },
103+ )
104+ require .NoError (t , err )
105+ require .False (t , report .Output .Confirmed )
106+ require .Equal (t , mcmstypes .ChainSelector (selector ), report .Output .BatchOperation .ChainSelector )
107+ require .NotEmpty (t , report .Output .BatchOperation .Transactions )
108+ require .NoError (t , rt .Exec (
109+ newTimelockProposalTask ([]mcmstypes.BatchOperation {report .Output .BatchOperation }, "solana set config operation test" ),
110+ runtime .SignAndExecuteProposalsTask ([]* ecdsa.PrivateKey {cldftesthelpers .TestXXXMCMSSigner }),
111+ ))
112+ assertSolanaConfigEquals (t , mcmssolana .NewInspector (chain .Client ), refs .Canceller , cfg )
87113}
0 commit comments