@@ -10,7 +10,6 @@ import (
1010 "github.com/gagliardetto/solana-go"
1111 chainselectors "github.com/smartcontractkit/chain-selectors"
1212 "github.com/stretchr/testify/require"
13- "go.uber.org/zap/zapcore"
1413
1514 "github.com/smartcontractkit/chainlink-ccip/chains/solana/contracts/tests/testutils"
1615 burnmint "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_1/burnmint_token_pool"
@@ -38,7 +37,7 @@ import (
3837 commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset"
3938 "github.com/smartcontractkit/chainlink/deployment/common/proposalutils"
4039 commontypes "github.com/smartcontractkit/chainlink/deployment/common/types"
41- "github.com/smartcontractkit/chainlink/deployment/environment/memory "
40+ "github.com/smartcontractkit/chainlink/deployment/internal/soltestutils "
4241)
4342
4443func TestValidateContracts (t * testing.T ) {
@@ -193,26 +192,33 @@ func TestValidate(t *testing.T) {
193192// the transfer ownership changeset.
194193func prepareEnvironmentForOwnershipTransfer (t * testing.T ) (cldf.Environment , stateview.CCIPOnChainState ) {
195194 t .Helper ()
196- lggr := logger .Test (t )
197- e := memory .NewMemoryEnvironment (t , lggr , zapcore .InfoLevel , memory.MemoryEnvironmentConfig {
198- Bootstraps : 1 ,
199- Chains : 2 ,
200- SolChains : 1 ,
201- Nodes : 4 ,
202- CCIPSolanaContractVersion : memory .SolanaContractV0_1_1 ,
203- })
204- evmSelectors := e .BlockChains .ListChainSelectors (cldf_chain .WithFamily (chainselectors .FamilyEVM ))
205- homeChainSel := evmSelectors [0 ]
206- solChainSelectors := e .BlockChains .ListChainSelectors (cldf_chain .WithFamily (chainselectors .FamilySolana ))
207- solChain1 := solChainSelectors [0 ]
208- solChain := e .BlockChains .SolanaChains ()[solChain1 ]
209- nodes , err := deployment .NodeInfo (e .NodeIDs , e .Offchain )
195+
196+ homeChainSel := chainselectors .TEST_90000001 .Selector
197+ solChainSel := chainselectors .TEST_22222222222222222222222222222222222222222222 .Selector
198+
199+ programsPath := t .TempDir ()
200+ progIDs := soltestutils .LoadCCIPPrograms (t , programsPath )
201+ env , err := environment .New (t .Context (),
202+ environment .WithEVMSimulated (t , []uint64 {homeChainSel }),
203+ environment .WithSolanaContainer (t , []uint64 {solChainSel }, programsPath , progIDs ),
204+ environment .WithLogger (logger .Test (t )),
205+ )
206+ require .NoError (t , err )
207+
208+ testhelpers .RegisterNodes (t , env , 4 , homeChainSel )
209+
210+ solChain := env .BlockChains .SolanaChains ()[solChainSel ]
211+ nodes , err := deployment .NodeInfo (env .NodeIDs , env .Offchain )
210212 require .NoError (t , err )
213+
211214 // Fund account for fees
212- testutils .FundAccounts (e .GetContext (), []solana.PrivateKey {* solChain .DeployerKey }, solChain .Client , t )
213- err = testhelpers .SavePreloadedSolAddresses (e , solChainSelectors [ 0 ] )
215+ testutils .FundAccounts (env .GetContext (), []solana.PrivateKey {* solChain .DeployerKey }, solChain .Client , t )
216+ err = testhelpers .SavePreloadedSolAddresses (* env , solChainSel )
214217 require .NoError (t , err )
215218 solLinkTokenPrivKey , _ := solana .NewRandomPrivateKey ()
219+
220+ e := * env
221+
216222 e , _ , err = commonchangeset .ApplyChangesets (t , e , []commonchangeset.ConfiguredChangeSet {
217223 commonchangeset .Configure (
218224 cldf .CreateLegacyChangeSet (v1_6 .DeployHomeChainChangeset ),
@@ -229,7 +235,7 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (cldf.Environment, sta
229235 commonchangeset .Configure (
230236 cldf .CreateLegacyChangeSet (commonchangeset .DeploySolanaLinkToken ),
231237 commonchangeset.DeploySolanaLinkTokenConfig {
232- ChainSelector : solChain1 ,
238+ ChainSelector : solChainSel ,
233239 TokenPrivKey : solLinkTokenPrivKey ,
234240 TokenDecimals : 9 ,
235241 },
@@ -238,7 +244,7 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (cldf.Environment, sta
238244 cldf .CreateLegacyChangeSet (ccipChangesetSolana .DeployChainContractsChangeset ),
239245 ccipChangesetSolana.DeployChainContractsConfig {
240246 HomeChainSelector : homeChainSel ,
241- ChainSelector : solChain1 ,
247+ ChainSelector : solChainSel ,
242248 ContractParamsPerChain : ccipChangesetSolana.ChainContractParams {
243249 FeeQuoterParams : ccipChangesetSolana.FeeQuoterParams {
244250 DefaultMaxFeeJuelsPerMsg : solBinary.Uint128 {Lo : 300000000 , Hi : 0 , Endianness : nil },
@@ -252,23 +258,23 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (cldf.Environment, sta
252258 commonchangeset .Configure (
253259 cldf .CreateLegacyChangeSet (ccipChangesetSolana .DeploySolanaToken ),
254260 ccipChangesetSolana.DeploySolanaTokenConfig {
255- ChainSelector : solChain1 ,
261+ ChainSelector : solChainSel ,
256262 TokenProgramName : shared .SPL2022Tokens ,
257263 TokenDecimals : 9 ,
258264 },
259265 ),
260266 commonchangeset .Configure (
261267 cldf .CreateLegacyChangeSet (ccipChangesetSolana .DeploySolanaToken ),
262268 ccipChangesetSolana.DeploySolanaTokenConfig {
263- ChainSelector : solChain1 ,
269+ ChainSelector : solChainSel ,
264270 TokenProgramName : shared .SPLTokens ,
265271 TokenDecimals : 9 ,
266272 },
267273 ),
268274 commonchangeset .Configure (
269275 cldf .CreateLegacyChangeSet (commonchangeset .DeployMCMSWithTimelockV2 ),
270276 map [uint64 ]commontypes.MCMSWithTimelockConfigV2 {
271- solChain1 : {
277+ solChainSel : {
272278 Canceller : proposalutils .SingleGroupMCMSV2 (t ),
273279 Proposer : proposalutils .SingleGroupMCMSV2 (t ),
274280 Bypasser : proposalutils .SingleGroupMCMSV2 (t ),
@@ -280,18 +286,18 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (cldf.Environment, sta
280286 require .NoError (t , err )
281287
282288 // solana verification
283- err = testhelpers .ValidateSolanaState (e , solChainSelectors )
289+ err = testhelpers .ValidateSolanaState (e , [] uint64 { solChainSel } )
284290 require .NoError (t , err )
285291 state , err := stateview .LoadOnchainStateSolana (e )
286292 require .NoError (t , err )
287- tokenAddressLockRelease := state .SolChains [solChain1 ].SPL2022Tokens [0 ]
288- tokenAddressBurnMint := state .SolChains [solChain1 ].SPLTokens [0 ]
293+ tokenAddressLockRelease := state .SolChains [solChainSel ].SPL2022Tokens [0 ]
294+ tokenAddressBurnMint := state .SolChains [solChainSel ].SPLTokens [0 ]
289295
290296 e , _ , err = commonchangeset .ApplyChangesets (t , e , []commonchangeset.ConfiguredChangeSet {
291297 commonchangeset .Configure (
292298 cldf .CreateLegacyChangeSet (ccipChangesetSolana .InitGlobalConfigTokenPoolProgram ),
293299 ccipChangesetSolana.TokenPoolConfigWithMCM {
294- ChainSelector : solChain1 ,
300+ ChainSelector : solChainSel ,
295301 TokenPoolConfigs : []ccipChangesetSolana.TokenPoolConfig {
296302 {
297303 TokenPubKey : tokenAddressLockRelease ,
@@ -309,7 +315,7 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (cldf.Environment, sta
309315 commonchangeset .Configure (
310316 cldf .CreateLegacyChangeSet (ccipChangesetSolana .AddTokenPoolAndLookupTable ),
311317 ccipChangesetSolana.AddTokenPoolAndLookupTableConfig {
312- ChainSelector : solChain1 ,
318+ ChainSelector : solChainSel ,
313319 TokenPoolConfigs : []ccipChangesetSolana.TokenPoolConfig {
314320 {
315321 TokenPubKey : tokenAddressLockRelease ,
@@ -322,7 +328,7 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (cldf.Environment, sta
322328 commonchangeset .Configure (
323329 cldf .CreateLegacyChangeSet (ccipChangesetSolana .AddTokenPoolAndLookupTable ),
324330 ccipChangesetSolana.AddTokenPoolAndLookupTableConfig {
325- ChainSelector : solChain1 ,
331+ ChainSelector : solChainSel ,
326332 TokenPoolConfigs : []ccipChangesetSolana.TokenPoolConfig {
327333 {
328334 TokenPubKey : tokenAddressBurnMint ,
@@ -340,19 +346,21 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (cldf.Environment, sta
340346func TestTransferCCIPToMCMSWithTimelockSolana (t * testing.T ) {
341347 t .Parallel ()
342348 skipInCI (t )
349+
343350 e , state := prepareEnvironmentForOwnershipTransfer (t )
344- solChain1 := e .BlockChains .ListChainSelectors (cldf_chain .WithFamily (chainselectors .FamilySolana ))[0 ]
345- solChain := e .BlockChains .SolanaChains ()[solChain1 ]
351+ solSelector := e .BlockChains .ListChainSelectors (cldf_chain .WithFamily (chainselectors .FamilySolana ))[0 ]
352+ solChain := e .BlockChains .SolanaChains ()[solSelector ]
353+ solState := state .SolChains [solSelector ]
346354
347- tokenAddressLockRelease := state . SolChains [ solChain1 ] .SPL2022Tokens [0 ]
348- tokenAddressBurnMint := state . SolChains [ solChain1 ] .SPLTokens [0 ]
355+ tokenAddressLockRelease := solState .SPL2022Tokens [0 ]
356+ tokenAddressBurnMint := solState .SPLTokens [0 ]
349357
350- burnMintPoolConfigPDA , _ := solTokenUtil .TokenPoolConfigAddress (tokenAddressBurnMint , state . SolChains [ solChain1 ] .BurnMintTokenPools [shared .CLLMetadata ])
351- lockReleasePoolConfigPDA , _ := solTokenUtil .TokenPoolConfigAddress (tokenAddressLockRelease , state . SolChains [ solChain1 ] .LockReleaseTokenPools [shared .CLLMetadata ])
358+ burnMintPoolConfigPDA , _ := solTokenUtil .TokenPoolConfigAddress (tokenAddressBurnMint , solState .BurnMintTokenPools [shared .CLLMetadata ])
359+ lockReleasePoolConfigPDA , _ := solTokenUtil .TokenPoolConfigAddress (tokenAddressLockRelease , solState .LockReleaseTokenPools [shared .CLLMetadata ])
352360 timelockSignerPDA , _ := testhelpers .TransferOwnershipSolanaV0_1_1 (
353361 t ,
354362 & e ,
355- solChain1 ,
363+ solSelector ,
356364 false ,
357365 ccipChangesetSolana.CCIPContractsToTransfer {
358366 Router : true ,
@@ -370,7 +378,7 @@ func TestTransferCCIPToMCMSWithTimelockSolana(t *testing.T) {
370378
371379 // (A) Check Router ownership - we need to add retries as the ownership transfer commitment is confirmed and not finalized.
372380 require .Eventually (t , func () bool {
373- routerConfigPDA := state . SolChains [ solChain1 ] .RouterConfigPDA
381+ routerConfigPDA := solState .RouterConfigPDA
374382 t .Logf ("Checking Router Config PDA ownership data configPDA: %s" , routerConfigPDA .String ())
375383 programData := ccip_router.Config {}
376384 err := solChain .GetAccountDataBorshInto (ctx , routerConfigPDA , & programData )
@@ -380,7 +388,7 @@ func TestTransferCCIPToMCMSWithTimelockSolana(t *testing.T) {
380388
381389 // (B) Check FeeQuoter ownership
382390 require .Eventually (t , func () bool {
383- feeQuoterConfigPDA := state . SolChains [ solChain1 ] .FeeQuoterConfigPDA
391+ feeQuoterConfigPDA := solState .FeeQuoterConfigPDA
384392 t .Logf ("Checking Fee Quoter PDA ownership data configPDA: %s" , feeQuoterConfigPDA .String ())
385393 programData := fee_quoter.Config {}
386394 err := solChain .GetAccountDataBorshInto (ctx , feeQuoterConfigPDA , & programData )
@@ -390,7 +398,7 @@ func TestTransferCCIPToMCMSWithTimelockSolana(t *testing.T) {
390398
391399 // (C) Check OffRamp:
392400 require .Eventually (t , func () bool {
393- offRampConfigPDA := state . SolChains [ solChain1 ] .OffRampConfigPDA
401+ offRampConfigPDA := solState .OffRampConfigPDA
394402 programData := ccip_offramp.Config {}
395403 t .Logf ("Checking Off Ramp PDA ownership data configPDA: %s" , offRampConfigPDA .String ())
396404 err := solChain .GetAccountDataBorshInto (ctx , offRampConfigPDA , & programData )
@@ -418,7 +426,7 @@ func TestTransferCCIPToMCMSWithTimelockSolana(t *testing.T) {
418426
419427 // (F) Check RMNRemote ownership
420428 require .Eventually (t , func () bool {
421- rmnRemoteConfigPDA := state . SolChains [ solChain1 ] .RMNRemoteConfigPDA
429+ rmnRemoteConfigPDA := solState .RMNRemoteConfigPDA
422430 t .Logf ("Checking RMNRemote PDA ownership data configPDA: %s" , rmnRemoteConfigPDA .String ())
423431 programData := rmn_remote.Config {}
424432 err := solChain .GetAccountDataBorshInto (ctx , rmnRemoteConfigPDA , & programData )
@@ -430,19 +438,21 @@ func TestTransferCCIPToMCMSWithTimelockSolana(t *testing.T) {
430438func TestTransferCCIPFromMCMSWithTimelockSolana (t * testing.T ) {
431439 t .Parallel ()
432440 skipInCI (t )
441+
433442 e , state := prepareEnvironmentForOwnershipTransfer (t )
434- solChain1 := e .BlockChains .ListChainSelectors (cldf_chain .WithFamily (chainselectors .FamilySolana ))[0 ]
435- solChain := e .BlockChains .SolanaChains ()[solChain1 ]
443+ solSelector := e .BlockChains .ListChainSelectors (cldf_chain .WithFamily (chainselectors .FamilySolana ))[0 ]
444+ solChain := e .BlockChains .SolanaChains ()[solSelector ]
445+ solState := state .SolChains [solSelector ]
436446
437- tokenAddressLockRelease := state . SolChains [ solChain1 ] .SPL2022Tokens [0 ]
438- tokenAddressBurnMint := state . SolChains [ solChain1 ] .SPLTokens [0 ]
447+ tokenAddressLockRelease := solState .SPL2022Tokens [0 ]
448+ tokenAddressBurnMint := solState .SPLTokens [0 ]
439449
440- burnMintPoolConfigPDA , _ := solTokenUtil .TokenPoolConfigAddress (tokenAddressBurnMint , state . SolChains [ solChain1 ] .BurnMintTokenPools [shared .CLLMetadata ])
441- lockReleasePoolConfigPDA , _ := solTokenUtil .TokenPoolConfigAddress (tokenAddressLockRelease , state . SolChains [ solChain1 ] .LockReleaseTokenPools [shared .CLLMetadata ])
450+ burnMintPoolConfigPDA , _ := solTokenUtil .TokenPoolConfigAddress (tokenAddressBurnMint , solState .BurnMintTokenPools [shared .CLLMetadata ])
451+ lockReleasePoolConfigPDA , _ := solTokenUtil .TokenPoolConfigAddress (tokenAddressLockRelease , solState .LockReleaseTokenPools [shared .CLLMetadata ])
442452 timelockSignerPDA , _ := testhelpers .TransferOwnershipSolanaV0_1_1 (
443453 t ,
444454 & e ,
445- solChain1 ,
455+ solSelector ,
446456 false ,
447457 ccipChangesetSolana.CCIPContractsToTransfer {
448458 Router : true ,
@@ -461,7 +471,7 @@ func TestTransferCCIPFromMCMSWithTimelockSolana(t *testing.T) {
461471 CurrentOwner : timelockSignerPDA ,
462472 ProposedOwner : solChain .DeployerKey .PublicKey (),
463473 ContractsByChain : map [uint64 ]ccipChangesetSolana.CCIPContractsToTransfer {
464- solChain1 : {
474+ solSelector : {
465475 Router : true ,
466476 FeeQuoter : true ,
467477 OffRamp : true ,
@@ -476,7 +486,7 @@ func TestTransferCCIPFromMCMSWithTimelockSolana(t *testing.T) {
476486 require .NoError (t , err )
477487 // we have to accept separate from the changeset because the proposal needs to execute
478488 // just spot check that the ownership transfer happened
479- config := state .SolChains [solChain1 ].RouterConfigPDA
489+ config := state .SolChains [solSelector ].RouterConfigPDA
480490 ix , err := ccip_router .NewAcceptOwnershipInstruction (
481491 config , solChain .DeployerKey .PublicKey (),
482492 ).ValidateAndBuild ()
0 commit comments