diff --git a/deployment/ccip/changeset/ccip-attestation-solana/cs_transfer_to_mcms_with_timelock_solana.go b/deployment/ccip/changeset/ccip-attestation-solana/cs_transfer_to_mcms_with_timelock_solana.go index eb0907ac070..e1149e7dfcd 100644 --- a/deployment/ccip/changeset/ccip-attestation-solana/cs_transfer_to_mcms_with_timelock_solana.go +++ b/deployment/ccip/changeset/ccip-attestation-solana/cs_transfer_to_mcms_with_timelock_solana.go @@ -6,6 +6,7 @@ import ( "github.com/gagliardetto/solana-go" chainsel "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" "github.com/smartcontractkit/mcms/sdk" @@ -16,6 +17,7 @@ import ( cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" + cs_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana_v0_1_1" "github.com/smartcontractkit/chainlink/deployment/ccip/shared" @@ -55,7 +57,7 @@ func (c TransferSignerRegistryToMCMSWithTimelockSolanaConfig) Validate(e cldf.En if err != nil { return fmt.Errorf("failed to get addresses for chain: %w", err) } - _, err = state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + _, err = solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) if err != nil { return fmt.Errorf("failed to load mcm state: %w", err) } @@ -102,7 +104,7 @@ func TransferSignerRegistryToMCMSWithTimelockSolanaChangeset( solChain := e.BlockChains.SolanaChains()[chainSelector] addresses, _ := e.ExistingAddresses.AddressesForChain(chainSelector) - mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) currentOwner := solChain.DeployerKey.PublicKey() if !cfg.CurrentOwner.IsZero() { diff --git a/deployment/ccip/changeset/crossfamily/v1_6/cs_add_evm_solana_lane.go b/deployment/ccip/changeset/crossfamily/v1_6/cs_add_evm_solana_lane.go index fc310f712a9..640d61717ba 100644 --- a/deployment/ccip/changeset/crossfamily/v1_6/cs_add_evm_solana_lane.go +++ b/deployment/ccip/changeset/crossfamily/v1_6/cs_add_evm_solana_lane.go @@ -14,12 +14,12 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/operations" evmstate "github.com/smartcontractkit/cld-changesets/pkg/family/evm" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana_v0_1_0" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" - commonstate "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -249,7 +249,7 @@ var ( type Dependencies struct { Env cldf.Environment EVMMCMSState map[uint64]evmstate.MCMSWithTimelockState - SolanaMCMSState map[uint64]commonstate.MCMSWithTimelockStateSolana + SolanaMCMSState map[uint64]solstate.MCMSWithTimelockState changesetInput csInputs } @@ -495,7 +495,7 @@ func addEVMAndSolanaLaneLogic(env cldf.Environment, input AddMultiEVMSolanaLaneC if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get addresses for Solana chain: %w", err) } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(env.BlockChains.SolanaChains()[input.SolanaChainSelector], addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(env.BlockChains.SolanaChains()[input.SolanaChainSelector], addresses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load Solana MCMS state: %w", err) } @@ -511,7 +511,7 @@ func addEVMAndSolanaLaneLogic(env cldf.Environment, input AddMultiEVMSolanaLaneC deps := Dependencies{ Env: env, EVMMCMSState: evmState.EVMMCMSStateByChain(), - SolanaMCMSState: map[uint64]commonstate.MCMSWithTimelockStateSolana{ + SolanaMCMSState: map[uint64]solstate.MCMSWithTimelockState{ input.SolanaChainSelector: *mcmState, }, changesetInput: changesetInputs, diff --git a/deployment/ccip/changeset/solana_v0_1_0/cs_deploy_chain.go b/deployment/ccip/changeset/solana_v0_1_0/cs_deploy_chain.go index 59816f2189a..f962937905f 100644 --- a/deployment/ccip/changeset/solana_v0_1_0/cs_deploy_chain.go +++ b/deployment/ccip/changeset/solana_v0_1_0/cs_deploy_chain.go @@ -10,6 +10,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go/rpc" chainsel "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" mcmsTypes "github.com/smartcontractkit/mcms/types" @@ -24,7 +25,6 @@ import ( solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -592,7 +592,7 @@ func deployChainContractsSolana( if err != nil { return batches, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return batches, fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } @@ -907,11 +907,11 @@ func generateUpgradeTxns( if err != nil { return txns, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return txns, fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } - timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) // if we're not upgrading via timelock, execute the raw ixns if config.UpgradeConfig.UpgradeAuthority != timelockSignerPDA { bufferSize, err := GetSolProgramSize(&e, chain, bufferProgram) diff --git a/deployment/ccip/changeset/solana_v0_1_0/cs_idl.go b/deployment/ccip/changeset/solana_v0_1_0/cs_idl.go index ae0f25fe203..af25d6ddf3c 100644 --- a/deployment/ccip/changeset/solana_v0_1_0/cs_idl.go +++ b/deployment/ccip/changeset/solana_v0_1_0/cs_idl.go @@ -12,6 +12,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/pelletier/go-toml" chainsel "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" mcmsTypes "github.com/smartcontractkit/mcms/types" @@ -20,7 +21,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" - commonstate "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" @@ -345,7 +345,7 @@ func (c IDLConfig) Validate(e cldf.Environment) error { if err != nil { return fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(e.BlockChains.SolanaChains()[c.ChainSelector], addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(e.BlockChains.SolanaChains()[c.ChainSelector], addresses) if err != nil { return fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } @@ -414,7 +414,7 @@ func UploadIDL(e cldf.Environment, c IDLConfig) (cldf.ChangesetOutput, error) { if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(e.BlockChains.SolanaChains()[c.ChainSelector], addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(e.BlockChains.SolanaChains()[c.ChainSelector], addresses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } @@ -498,7 +498,7 @@ func SetAuthorityIDL(e cldf.Environment, c IDLConfig) (cldf.ChangesetOutput, err if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } @@ -600,7 +600,7 @@ func UpgradeIDL(e cldf.Environment, c IDLConfig) (cldf.ChangesetOutput, error) { if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } diff --git a/deployment/ccip/changeset/solana_v0_1_0/cs_ops.go b/deployment/ccip/changeset/solana_v0_1_0/cs_ops.go index ece19d7f46d..763b9394ff4 100644 --- a/deployment/ccip/changeset/solana_v0_1_0/cs_ops.go +++ b/deployment/ccip/changeset/solana_v0_1_0/cs_ops.go @@ -7,6 +7,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" @@ -24,7 +25,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - csState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -210,7 +210,7 @@ func SetUpgradeAuthorityChangeset( if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := csState.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } diff --git a/deployment/ccip/changeset/solana_v0_1_0/cs_set_ocr3.go b/deployment/ccip/changeset/solana_v0_1_0/cs_set_ocr3.go index 1d76d15b40b..a5aacfbd789 100644 --- a/deployment/ccip/changeset/solana_v0_1_0/cs_set_ocr3.go +++ b/deployment/ccip/changeset/solana_v0_1_0/cs_set_ocr3.go @@ -6,6 +6,7 @@ import ( "github.com/gagliardetto/solana-go" chain_selectors "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" @@ -23,7 +24,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - csState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" ) @@ -103,7 +103,7 @@ func SetOCR3ConfigSolana(e cldf.Environment, cfg v1_6.SetOCR3OffRampConfig) (cld } chain := e.BlockChains.SolanaChains()[remote] addresses, _ := e.ExistingAddresses.AddressesForChain(remote) - mcmState, _ := csState.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) timelocks[remote] = mcmsSolana.ContractAddress( mcmState.TimelockProgram, diff --git a/deployment/ccip/changeset/solana_v0_1_0/cs_verify_contracts.go b/deployment/ccip/changeset/solana_v0_1_0/cs_verify_contracts.go index 7af1d6f905f..01c7e35d5a9 100644 --- a/deployment/ccip/changeset/solana_v0_1_0/cs_verify_contracts.go +++ b/deployment/ccip/changeset/solana_v0_1_0/cs_verify_contracts.go @@ -8,6 +8,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/mr-tron/base58" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" mcmsTypes "github.com/smartcontractkit/mcms/types" @@ -16,7 +17,6 @@ import ( cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" - csState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" ) @@ -320,13 +320,13 @@ func VerifyBuild(e cldf.Environment, cfg VerifyBuildConfig) (cldf.ChangesetOutpu if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := csState.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } var timelockSignerPDA solana.PublicKey if mcmState != nil { - timelockSignerPDA = csState.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA = solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) } verifications := []struct { diff --git a/deployment/ccip/changeset/solana_v0_1_0/transfer_ccip_to_mcms_with_timelock.go b/deployment/ccip/changeset/solana_v0_1_0/transfer_ccip_to_mcms_with_timelock.go index f4ff453bf29..c92585bd51a 100644 --- a/deployment/ccip/changeset/solana_v0_1_0/transfer_ccip_to_mcms_with_timelock.go +++ b/deployment/ccip/changeset/solana_v0_1_0/transfer_ccip_to_mcms_with_timelock.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" "github.com/smartcontractkit/mcms/sdk" @@ -17,7 +18,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -86,7 +86,7 @@ func (cfg TransferCCIPToMCMSWithTimelockSolanaConfig) Validate(e cldf.Environmen if err != nil { return fmt.Errorf("failed to load addresses for chain %d: %w", chainSelector, err) } - _, err = state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + _, err = solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) if err != nil { return fmt.Errorf("failed to load mcm state: %w", err) } @@ -153,13 +153,13 @@ func TransferCCIPToMCMSWithTimelockSolana( for chainSelector, contractsToTransfer := range cfg.ContractsByChain { solChain := e.BlockChains.SolanaChains()[chainSelector] addresses, _ := e.ExistingAddresses.AddressesForChain(chainSelector) - mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) currentOwner := solChain.DeployerKey.PublicKey() if !cfg.CurrentOwner.IsZero() { currentOwner = cfg.CurrentOwner } - timelockSigner := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSigner := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) proposedOwner := timelockSigner if !cfg.ProposedOwner.IsZero() { proposedOwner = cfg.ProposedOwner diff --git a/deployment/ccip/changeset/solana_v0_1_0/utils.go b/deployment/ccip/changeset/solana_v0_1_0/utils.go index 78de8c1891a..44e3bb2978f 100644 --- a/deployment/ccip/changeset/solana_v0_1_0/utils.go +++ b/deployment/ccip/changeset/solana_v0_1_0/utils.go @@ -6,6 +6,7 @@ import ( "time" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" "github.com/smartcontractkit/mcms/sdk" mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" @@ -17,7 +18,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -82,7 +82,7 @@ func buildProposalCommon( chain := e.BlockChains.SolanaChains()[chainSelector] addresses, _ := e.ExistingAddresses.AddressesForChain(chainSelector) - mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) timelocks[chainSelector] = mcmsSolana.ContractAddress( mcmState.TimelockProgram, @@ -158,11 +158,11 @@ func FetchTimelockSigner(e cldf.Environment, chainSelector uint64) (solana.Publi if err != nil { return solana.PublicKey{}, fmt.Errorf("failed to load addresses for chain %d: %w", chainSelector, err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(e.BlockChains.SolanaChains()[chainSelector], addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(e.BlockChains.SolanaChains()[chainSelector], addresses) if err != nil { return solana.PublicKey{}, fmt.Errorf("failed to load mcm state: %w", err) } - timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) return timelockSignerPDA, nil } diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_deploy_chain.go b/deployment/ccip/changeset/solana_v0_1_1/cs_deploy_chain.go index ee4061e7e66..24ecd49f7d8 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_deploy_chain.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_deploy_chain.go @@ -9,6 +9,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/gagliardetto/solana-go" chainsel "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" mcmsTypes "github.com/smartcontractkit/mcms/types" @@ -23,7 +24,6 @@ import ( solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -670,7 +670,7 @@ func deployChainContractsSolana( if err != nil { return batches, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return batches, fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } @@ -1035,11 +1035,11 @@ func generateUpgradeTxns( if err != nil { return txns, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return txns, fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } - timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) bufferSize, err := GetSolProgramSize(&e, chain, bufferProgram) if err != nil { diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana_v0_1_1/cs_deploy_chain_test.go index db838bcccc5..fd6b99b87b6 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_deploy_chain_test.go @@ -8,6 +8,7 @@ import ( solBinary "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" chain_selectors "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/quarantine" "github.com/stretchr/testify/require" @@ -25,7 +26,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - csState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/internal/soltestutils" @@ -202,7 +202,7 @@ func TestUpgrade(t *testing.T) { require.NoError(t, err) addresses, err := e.ExistingAddresses.AddressesForChain(solSelector) require.NoError(t, err) - chainState, err := csState.MaybeLoadMCMSWithTimelockChainStateSolana(e.BlockChains.SolanaChains()[solSelector], addresses) + chainState, err := solstate.MaybeLoadMCMSWithTimelockChainState(e.BlockChains.SolanaChains()[solSelector], addresses) require.NoError(t, err) // deploy the contracts diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_idl.go b/deployment/ccip/changeset/solana_v0_1_1/cs_idl.go index fa7b3dfe0b2..708d461ab3f 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_idl.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_idl.go @@ -12,6 +12,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/pelletier/go-toml" chainsel "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" mcmsTypes "github.com/smartcontractkit/mcms/types" cldfsolana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" @@ -20,7 +21,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - commonstate "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" @@ -106,7 +106,7 @@ func (c IDLConfig) Validate(e cldf.Environment) error { if err != nil { return fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(e.BlockChains.SolanaChains()[c.ChainSelector], addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(e.BlockChains.SolanaChains()[c.ChainSelector], addresses) if err != nil { return fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } @@ -190,7 +190,7 @@ func SetAuthorityIDL(e cldf.Environment, c IDLConfig) (cldf.ChangesetOutput, err if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } @@ -576,7 +576,7 @@ func getAffectedPrograms(e cldf.Environment, c IDLConfig, chainState solanastate if err != nil { return nil, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return nil, fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_ops.go b/deployment/ccip/changeset/solana_v0_1_1/cs_ops.go index 0dd99d5488b..eb9d1d4efbb 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_ops.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_ops.go @@ -7,6 +7,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" @@ -23,7 +24,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - csState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -214,7 +214,7 @@ func SetUpgradeAuthorityChangeset( if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := csState.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_set_ocr3.go b/deployment/ccip/changeset/solana_v0_1_1/cs_set_ocr3.go index 3fd23ca2928..6f1c2ae2877 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_set_ocr3.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_set_ocr3.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" chain_selectors "github.com/smartcontractkit/chain-selectors" @@ -23,7 +24,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - csState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" ) @@ -103,7 +103,7 @@ func SetOCR3ConfigSolana(e cldf.Environment, cfg v1_6.SetOCR3OffRampConfig) (cld } chain := e.BlockChains.SolanaChains()[remote] addresses, _ := e.ExistingAddresses.AddressesForChain(remote) - mcmState, _ := csState.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) timelocks[remote] = mcmsSolana.ContractAddress( mcmState.TimelockProgram, diff --git a/deployment/ccip/changeset/solana_v0_1_1/cs_verify_contracts.go b/deployment/ccip/changeset/solana_v0_1_1/cs_verify_contracts.go index c1aaf42aab4..fde204ec599 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/cs_verify_contracts.go +++ b/deployment/ccip/changeset/solana_v0_1_1/cs_verify_contracts.go @@ -8,6 +8,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/mr-tron/base58" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" @@ -321,7 +322,7 @@ func VerifyBuild(e cldf.Environment, cfg VerifyBuildConfig) (cldf.ChangesetOutpu if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := csState.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } diff --git a/deployment/ccip/changeset/solana_v0_1_1/transfer_ccip_to_mcms_with_timelock.go b/deployment/ccip/changeset/solana_v0_1_1/transfer_ccip_to_mcms_with_timelock.go index 069566cdc54..04407cc29d6 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/transfer_ccip_to_mcms_with_timelock.go +++ b/deployment/ccip/changeset/solana_v0_1_1/transfer_ccip_to_mcms_with_timelock.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" "github.com/smartcontractkit/mcms/sdk" @@ -17,7 +18,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -87,7 +87,7 @@ func (cfg TransferCCIPToMCMSWithTimelockSolanaConfig) Validate(e cldf.Environmen if err != nil { return fmt.Errorf("failed to load addresses for chain %d: %w", chainSelector, err) } - _, err = state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + _, err = solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) if err != nil { return fmt.Errorf("failed to load mcm state: %w", err) } @@ -154,13 +154,13 @@ func TransferCCIPToMCMSWithTimelockSolana( for chainSelector, contractsToTransfer := range cfg.ContractsByChain { solChain := e.BlockChains.SolanaChains()[chainSelector] addresses, _ := e.ExistingAddresses.AddressesForChain(chainSelector) - mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) currentOwner := solChain.DeployerKey.PublicKey() if !cfg.CurrentOwner.IsZero() { currentOwner = cfg.CurrentOwner } - timelockSigner := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSigner := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) proposedOwner := timelockSigner if !cfg.ProposedOwner.IsZero() { proposedOwner = cfg.ProposedOwner diff --git a/deployment/ccip/changeset/solana_v0_1_1/utils.go b/deployment/ccip/changeset/solana_v0_1_1/utils.go index fc645a83bd8..fa01f088d2d 100644 --- a/deployment/ccip/changeset/solana_v0_1_1/utils.go +++ b/deployment/ccip/changeset/solana_v0_1_1/utils.go @@ -7,6 +7,7 @@ import ( "time" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" "github.com/smartcontractkit/mcms/sdk" @@ -19,7 +20,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -105,7 +105,7 @@ func buildProposalCommon( chain := e.BlockChains.SolanaChains()[chainSelector] addresses, _ := e.ExistingAddresses.AddressesForChain(chainSelector) - mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) timelocks[chainSelector] = mcmsSolana.ContractAddress( mcmState.TimelockProgram, @@ -199,11 +199,11 @@ func FetchTimelockSigner(e cldf.Environment, chainSelector uint64) (solana.Publi if err != nil { return solana.PublicKey{}, fmt.Errorf("failed to load addresses for chain %d: %w", chainSelector, err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(e.BlockChains.SolanaChains()[chainSelector], addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(e.BlockChains.SolanaChains()[chainSelector], addresses) if err != nil { return solana.PublicKey{}, fmt.Errorf("failed to load mcm state: %w", err) } - timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) return timelockSignerPDA, nil } diff --git a/deployment/ccip/changeset/testhelpers/test_helpers_solana_v0_1_0.go b/deployment/ccip/changeset/testhelpers/test_helpers_solana_v0_1_0.go index c73a3c4c1d7..68c7d877fd9 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers_solana_v0_1_0.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers_solana_v0_1_0.go @@ -49,7 +49,7 @@ import ( solTestReceiver "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_0/test_ccip_receiver" solccip "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/ccip" solcommon "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" - solstate "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + ccipsolstate "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" soltokens "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" "github.com/smartcontractkit/chainlink-ccip/pkg/reader" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -89,8 +89,8 @@ import ( "github.com/smartcontractkit/chainlink/deployment/internal/jdtestutils" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" - "github.com/smartcontractkit/chainlink/v2/core/utils/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/relay" + "github.com/smartcontractkit/chainlink/v2/core/utils/abihelpers" ) const ( @@ -628,27 +628,27 @@ func SendRequestSol( feeTokenUserATA = ata } - destinationChainStatePDA, err := solstate.FindDestChainStatePDA(destinationChainSelector, s.Router) + destinationChainStatePDA, err := ccipsolstate.FindDestChainStatePDA(destinationChainSelector, s.Router) if err != nil { return nil, err } - noncePDA, err := solstate.FindNoncePDA(cfg.DestChain, sender.PublicKey(), s.Router) + noncePDA, err := ccipsolstate.FindNoncePDA(cfg.DestChain, sender.PublicKey(), s.Router) if err != nil { return nil, err } - linkFqBillingConfigPDA, _, err := solstate.FindFqBillingTokenConfigPDA(s.LinkToken, s.FeeQuoter) + linkFqBillingConfigPDA, _, err := ccipsolstate.FindFqBillingTokenConfigPDA(s.LinkToken, s.FeeQuoter) if err != nil { return nil, err } - feeTokenFqBillingConfigPDA, _, err := solstate.FindFqBillingTokenConfigPDA(feeToken, s.FeeQuoter) + feeTokenFqBillingConfigPDA, _, err := ccipsolstate.FindFqBillingTokenConfigPDA(feeToken, s.FeeQuoter) if err != nil { return nil, err } - billingSignerPDA, _, err := solstate.FindFeeBillingSignerPDA(s.Router) + billingSignerPDA, _, err := ccipsolstate.FindFeeBillingSignerPDA(s.Router) if err != nil { return nil, err } @@ -658,12 +658,12 @@ func SendRequestSol( return nil, err } - fqDestChainPDA, _, err := solstate.FindFqDestChainPDA(cfg.DestChain, s.FeeQuoter) + fqDestChainPDA, _, err := ccipsolstate.FindFqDestChainPDA(cfg.DestChain, s.FeeQuoter) if err != nil { return nil, err } - rmnRemoteCursesPDA, _, err := solstate.FindRMNRemoteCursesPDA(s.RMNRemote) + rmnRemoteCursesPDA, _, err := ccipsolstate.FindRMNRemoteCursesPDA(s.RMNRemote) if err != nil { return nil, err } @@ -756,7 +756,7 @@ func SendRequestSol( tokenPool.Chain[cfg.DestChain] = chainPDA - billingPDA, _, err := solstate.FindFqPerChainPerTokenConfigPDA(cfg.DestChain, tokenPubKey, s.FeeQuoter) + billingPDA, _, err := ccipsolstate.FindFqPerChainPerTokenConfigPDA(cfg.DestChain, tokenPubKey, s.FeeQuoter) if err != nil { return nil, err } @@ -2463,7 +2463,7 @@ func TransferOwnershipSolanaV0_1_0( addresses, err := e.ExistingAddresses.AddressesForChain(solSelector) require.NoError(t, err) - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := ccipsolstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) require.NoError(t, err) // Fund signer PDAs for timelock and mcm diff --git a/deployment/ccip/changeset/testhelpers/test_helpers_solana_v0_1_1.go b/deployment/ccip/changeset/testhelpers/test_helpers_solana_v0_1_1.go index f2dd2ab191e..360eb2c022f 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers_solana_v0_1_1.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers_solana_v0_1_1.go @@ -32,8 +32,9 @@ import ( solTestTokenPoolV0_1_1 "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_1/test_token_pool" solccip "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/ccip" solcommon "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" - solstate "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + ccipsolstate "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" soltokens "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/chainlink-common/pkg/logger" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" @@ -46,7 +47,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" solanastateview "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" @@ -81,13 +81,13 @@ func TransferOwnershipSolanaV0_1_1( addresses, err := e.ExistingAddresses.AddressesForChain(solSelector) require.NoError(t, err) - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) require.NoError(t, err) // Fund signer PDAs for timelock and mcm // If we don't fund, execute() calls will fail with "no funds" errors. - timelockSignerPDA = state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) - mcmSignerPDA = state.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed) + timelockSignerPDA = solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + mcmSignerPDA = solstate.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed) err = solutils.FundAccounts( e.GetContext(), chain.Client, []solana.PublicKey{timelockSignerPDA, mcmSignerPDA}, 100, ) @@ -545,7 +545,7 @@ func deriveCCIPSendAccounts( askWith := []*solana.AccountMeta{} stage := "Start" tokenIndex := byte(0) - routerConfigPDA, _, err := solstate.FindConfigPDA(router) + routerConfigPDA, _, err := ccipsolstate.FindConfigPDA(router) if err != nil { return nil, nil, nil, fmt.Errorf("failed to calculate the router config PDA: %w", err) } diff --git a/deployment/ccip/shared/deployergroup/deployer_group.go b/deployment/ccip/shared/deployergroup/deployer_group.go index a5a5baea7ee..34d347ba1c6 100644 --- a/deployment/ccip/shared/deployergroup/deployer_group.go +++ b/deployment/ccip/shared/deployergroup/deployer_group.go @@ -9,6 +9,7 @@ import ( "strings" evmstate "github.com/smartcontractkit/cld-changesets/pkg/family/evm" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "golang.org/x/sync/errgroup" cldfproposalutils "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/mcms/proposalutils" @@ -27,7 +28,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -284,11 +284,11 @@ func (d *DeployerGroup) GetDeployerForSVM(chain uint64) (func(DeployerForSVM) (s } } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(d.e.BlockChains.SolanaChains()[chain], addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(d.e.BlockChains.SolanaChains()[chain], addresses) if err != nil { return nil, fmt.Errorf("failed to load mcm state: %w", err) } - timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) authority = timelockSignerPDA } @@ -531,7 +531,7 @@ func BuildTimelockAddressPerChain(e cldf.Environment, onchainState stateview.CCI if err != nil { return nil, fmt.Errorf("failed to load addresses for chain %d: %w", selector, err) } - mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) addressPerChain[selector] = mcmsSolana.ContractAddress(mcmState.TimelockProgram, mcmsSolana.PDASeed(mcmState.TimelockSeed)) } @@ -569,7 +569,7 @@ func BuildMcmAddressesPerChainByAction(e cldf.Environment, onchainState statevie if err != nil { return nil, fmt.Errorf("failed to load addresses for chain %d: %w", selector, err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return nil, fmt.Errorf("failed to load mcm state: %w", err) } diff --git a/deployment/ccip/shared/stateview/solana/state.go b/deployment/ccip/shared/stateview/solana/state.go index 2fffc1a4749..60d2b47efb0 100644 --- a/deployment/ccip/shared/stateview/solana/state.go +++ b/deployment/ccip/shared/stateview/solana/state.go @@ -10,6 +10,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go/rpc" "github.com/rs/zerolog/log" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" @@ -27,11 +28,11 @@ import ( solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/shared" "github.com/smartcontractkit/chainlink/deployment/ccip/view" solanaview "github.com/smartcontractkit/chainlink/deployment/ccip/view/solana" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - commonstate "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -575,11 +576,11 @@ func ValidateOwnershipSolana( if err != nil { return fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) } - timelockSignerPDA := commonstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) config, _, err := solState.FindConfigPDA(programID) if err != nil { return fmt.Errorf("failed to find config PDA: %w", err) @@ -685,11 +686,11 @@ func IsSolanaProgramOwnedByTimelock( if err != nil { return false } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return false } - timelockSignerPDA := commonstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) switch contractType { case shared.Router: programData := solRouter.Config{} diff --git a/deployment/ccip/shared/stateview/state.go b/deployment/ccip/shared/stateview/state.go index 08cc82c16e7..4c64b59927c 100644 --- a/deployment/ccip/shared/stateview/state.go +++ b/deployment/ccip/shared/stateview/state.go @@ -20,6 +20,7 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" chain_selectors "github.com/smartcontractkit/chain-selectors" evmstate "github.com/smartcontractkit/cld-changesets/pkg/family/evm" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "golang.org/x/exp/maps" "golang.org/x/sync/errgroup" @@ -44,7 +45,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/evm" "github.com/smartcontractkit/chainlink/deployment/ccip/shared/stateview/solana" - commonstate "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink-evm/gethwrappers/shared/generated/initial/erc20" @@ -393,14 +393,14 @@ func (c CCIPOnChainState) EVMMCMSStateByChain() map[uint64]evmstate.MCMSWithTime return mcmsStateByChain } -func (c CCIPOnChainState) SolanaMCMSStateByChain(e cldf.Environment) map[uint64]commonstate.MCMSWithTimelockStateSolana { - mcmsStateByChain := make(map[uint64]commonstate.MCMSWithTimelockStateSolana) +func (c CCIPOnChainState) SolanaMCMSStateByChain(e cldf.Environment) map[uint64]solstate.MCMSWithTimelockState { + mcmsStateByChain := make(map[uint64]solstate.MCMSWithTimelockState) for chainSelector := range e.BlockChains.SolanaChains() { addreses, err := e.ExistingAddresses.AddressesForChain(chainSelector) if err != nil { return mcmsStateByChain } - mcmState, err := commonstate.MaybeLoadMCMSWithTimelockChainStateSolana(e.BlockChains.SolanaChains()[chainSelector], addreses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(e.BlockChains.SolanaChains()[chainSelector], addreses) if err != nil { return mcmsStateByChain } diff --git a/deployment/ccip/view/solana/mcms.go b/deployment/ccip/view/solana/mcms.go index b7a15fc0c9b..e30e9b3f152 100644 --- a/deployment/ccip/view/solana/mcms.go +++ b/deployment/ccip/view/solana/mcms.go @@ -7,6 +7,7 @@ import ( "github.com/gagliardetto/solana-go" chain_selectors "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" @@ -14,7 +15,6 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_1/timelock" "github.com/smartcontractkit/chainlink/deployment/ccip/view/shared" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" @@ -60,11 +60,11 @@ type MCMSConfig struct { func GenerateMCMSWithTimelockView(chain cldf_solana.Chain, addresses map[string]cldf.TypeAndVersion) (MCMSWithTimelockView, error) { view := MCMSWithTimelockView{} - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return view, fmt.Errorf("failed to load mcms with timelock solana chain state: %w", err) } - timelockConfigPDA := state.GetTimelockConfigPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockConfigPDA := solstate.GetTimelockConfigPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) progDataAddr, err := solutils.GetProgramDataAddress(chain.Client, mcmState.TimelockProgram) if err != nil { return view, fmt.Errorf("failed to get program data address for program %s: %w", mcmState.TimelockProgram.String(), err) @@ -107,9 +107,9 @@ func GenerateMCMSWithTimelockView(chain cldf_solana.Chain, addresses map[string] name string pda solana.PublicKey }{ - {"Bypasser", state.GetMCMConfigPDA(mcmState.McmProgram, mcmState.BypasserMcmSeed)}, - {"Proposer", state.GetMCMConfigPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed)}, - {"Canceller", state.GetMCMConfigPDA(mcmState.McmProgram, mcmState.CancellerMcmSeed)}, + {"Bypasser", solstate.GetMCMConfigPDA(mcmState.McmProgram, mcmState.BypasserMcmSeed)}, + {"Proposer", solstate.GetMCMConfigPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed)}, + {"Canceller", solstate.GetMCMConfigPDA(mcmState.McmProgram, mcmState.CancellerMcmSeed)}, } { err = chain.GetAccountDataBorshInto(context.Background(), mcmConfig.pda, &mcmData) if err != nil { diff --git a/deployment/common/changeset/deploy_mcms_with_timelock_test.go b/deployment/common/changeset/deploy_mcms_with_timelock_test.go index e7e147f20a8..5797180a895 100644 --- a/deployment/common/changeset/deploy_mcms_with_timelock_test.go +++ b/deployment/common/changeset/deploy_mcms_with_timelock_test.go @@ -29,12 +29,14 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/engine/test/onchain" "github.com/smartcontractkit/chainlink-deployments-framework/engine/test/runtime" + soltestutils "github.com/smartcontractkit/cld-changesets/pkg/family/solana/testutils" + + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - mcmschangesetstate "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" - "github.com/smartcontractkit/chainlink/deployment/internal/soltestutils" ) func TestGrantRoleInTimeLock(t *testing.T) { @@ -511,7 +513,7 @@ func TestDeployMCMSWithTimelockV2SkipInitSolana(t *testing.T) { ) require.NoError(t, err) - solanaState, err := mcmschangesetstate.MaybeLoadMCMSWithTimelockStateSolana(rt.Environment(), []uint64{selector}) + solanaState, err := solstate.MaybeLoadMCMSWithTimelockState(rt.Environment(), []uint64{selector}) require.NoError(t, err) // Call deploy again, seeds and addresses from original state should not change @@ -520,7 +522,7 @@ func TestDeployMCMSWithTimelockV2SkipInitSolana(t *testing.T) { ) require.NoError(t, err) - solanaStateNew, err := mcmschangesetstate.MaybeLoadMCMSWithTimelockStateSolana(rt.Environment(), []uint64{selector}) + solanaStateNew, err := solstate.MaybeLoadMCMSWithTimelockState(rt.Environment(), []uint64{selector}) require.NoError(t, err) // --- assert --- @@ -542,17 +544,17 @@ func TestDeployMCMSWithTimelockV2SkipInitSolana(t *testing.T) { // ----- helpers ----- -func mcmSignerPDA(programID solana.PublicKey, seed mcmschangesetstate.PDASeed) string { - return mcmschangesetstate.GetMCMSignerPDA(programID, seed).String() +func mcmSignerPDA(programID solana.PublicKey, seed solstate.PDASeed) string { + return solstate.GetMCMSignerPDA(programID, seed).String() } func solanaTimelockConfig( - ctx context.Context, t *testing.T, chain cldf_solana.Chain, programID solana.PublicKey, seed mcmschangesetstate.PDASeed, + ctx context.Context, t *testing.T, chain cldf_solana.Chain, programID solana.PublicKey, seed solstate.PDASeed, ) timelockBindings.Config { t.Helper() var data timelockBindings.Config - err := chain.GetAccountDataBorshInto(ctx, mcmschangesetstate.GetTimelockConfigPDA(programID, seed), &data) + err := chain.GetAccountDataBorshInto(ctx, solstate.GetTimelockConfigPDA(programID, seed), &data) require.NoError(t, err) return data diff --git a/deployment/common/changeset/evm/mcms/ops/ops_solana_grant_role_timelock.go b/deployment/common/changeset/evm/mcms/ops/ops_solana_grant_role_timelock.go index 6341be07753..1947dc9f10e 100644 --- a/deployment/common/changeset/evm/mcms/ops/ops_solana_grant_role_timelock.go +++ b/deployment/common/changeset/evm/mcms/ops/ops_solana_grant_role_timelock.go @@ -15,7 +15,7 @@ import ( cldfsolana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" "github.com/smartcontractkit/chainlink-deployments-framework/operations" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" ) type OpSolanaGrantRoleTimelockDeps struct { @@ -23,10 +23,10 @@ type OpSolanaGrantRoleTimelockDeps struct { } type OpSolanaGrantRoleTimelockInput struct { - ChainState *state.MCMSWithTimelockStateSolana `json:"chainState"` - Role timelockbindings.Role `json:"role"` - Account solana.PublicKey `json:"account"` - IsDeployerKeyAdmin bool `json:"isDeployerKeyAdmin"` + ChainState *solstate.MCMSWithTimelockState `json:"chainState"` + Role timelockbindings.Role `json:"role"` + Account solana.PublicKey `json:"account"` + IsDeployerKeyAdmin bool `json:"isDeployerKeyAdmin"` } type OpSolanaGrantRoleTimelockOutput struct { @@ -49,7 +49,7 @@ var OpSolanaGrantRoleTimelock = operations.NewOperation( if in.IsDeployerKeyAdmin { signer = deps.Chain.DeployerKey.PublicKey() } else { - signer = state.GetTimelockSignerPDA(in.ChainState.TimelockProgram, in.ChainState.TimelockSeed) + signer = solstate.GetTimelockSignerPDA(in.ChainState.TimelockProgram, in.ChainState.TimelockSeed) } ix, err := accesscontrollerbindings.NewAddAccessInstruction(accessController, signer, in.Account).ValidateAndBuild() diff --git a/deployment/common/changeset/evm/mcms/seqs/seq_solana_grant_role_timelock.go b/deployment/common/changeset/evm/mcms/seqs/seq_solana_grant_role_timelock.go index b64cdb8d679..ad44df2fef6 100644 --- a/deployment/common/changeset/evm/mcms/seqs/seq_solana_grant_role_timelock.go +++ b/deployment/common/changeset/evm/mcms/seqs/seq_solana_grant_role_timelock.go @@ -3,6 +3,7 @@ package seqs import ( "github.com/Masterminds/semver/v3" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" mcmsTypes "github.com/smartcontractkit/mcms/types" timelockbindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_1/timelock" @@ -10,7 +11,6 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/operations" "github.com/smartcontractkit/chainlink/deployment/common/changeset/evm/mcms/ops" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" ) type SeqSolanaGrantRoleTimelockDeps struct { @@ -18,10 +18,10 @@ type SeqSolanaGrantRoleTimelockDeps struct { } type SeqSolanaGrantRoleTimelockInput struct { - ChainState *state.MCMSWithTimelockStateSolana `json:"chainState"` - Role timelockbindings.Role `json:"role"` - Accounts []solana.PublicKey `json:"accounts"` - IsDeployerKeyAdmin bool `json:"isDeployerKeyAdmin"` + ChainState *solstate.MCMSWithTimelockState `json:"chainState"` + Role timelockbindings.Role `json:"role"` + Accounts []solana.PublicKey `json:"accounts"` + IsDeployerKeyAdmin bool `json:"isDeployerKeyAdmin"` } type SeqSolanaGrantRoleTimelockOutput struct { @@ -49,7 +49,7 @@ var SeqSolanaGrantRoleTimelock = operations.NewSequence( ) if err != nil { b.Logger.Errorw("Failed to grant role", "chainSelector", deps.Chain.ChainSelector(), "chainName", deps.Chain.Name(), - "timelock", state.EncodeAddressWithSeed(in.ChainState.TimelockProgram, in.ChainState.TimelockSeed), + "timelock", solstate.EncodeAddressWithSeed(in.ChainState.TimelockProgram, in.ChainState.TimelockSeed), "role", in.Role, "account", account) return SeqSolanaGrantRoleTimelockOutput{}, err } diff --git a/deployment/common/changeset/example/solana_transfer_mcm.go b/deployment/common/changeset/example/solana_transfer_mcm.go index d54097b6926..8998c2dbe1e 100644 --- a/deployment/common/changeset/example/solana_transfer_mcm.go +++ b/deployment/common/changeset/example/solana_transfer_mcm.go @@ -15,7 +15,8 @@ import ( cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" cldfproposalutils "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/mcms/proposalutils" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -51,7 +52,7 @@ func (f TransferFromTimelock) VerifyPreconditions(e cldf.Environment, config Tra if err != nil { return fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) if err != nil { return fmt.Errorf("failed to load MCMS state: %w", err) } @@ -91,11 +92,11 @@ func (f TransferFromTimelock) Apply(e cldf.Environment, config TransferFromTimel if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addreses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addreses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load MCMS state: %w", err) } - timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) timelockID := mcmssolanasdk.ContractAddress(mcmState.TimelockProgram, mcmssolanasdk.PDASeed(mcmState.TimelockSeed)) proposerID := mcmssolanasdk.ContractAddress(mcmState.McmProgram, mcmssolanasdk.PDASeed(mcmState.ProposerMcmSeed)) timelocks[chainSelector] = timelockID diff --git a/deployment/common/changeset/mcms_firedrill.go b/deployment/common/changeset/mcms_firedrill.go index 801f935e517..880cb8ec09b 100644 --- a/deployment/common/changeset/mcms_firedrill.go +++ b/deployment/common/changeset/mcms_firedrill.go @@ -6,6 +6,7 @@ import ( "github.com/gagliardetto/solana-go" chainsel "github.com/smartcontractkit/chain-selectors" evmstate "github.com/smartcontractkit/cld-changesets/pkg/family/evm" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" mcmsevmsdk "github.com/smartcontractkit/mcms/sdk/evm" mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" @@ -16,7 +17,6 @@ import ( cldf_chain "github.com/smartcontractkit/chainlink-deployments-framework/chain" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -127,7 +127,7 @@ func MCMSSignFireDrillChangeset(e cldf.Environment, cfg FireDrillConfig) (cldf.C if err != nil { return cldf.ChangesetOutput{}, err } - state, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(e.BlockChains.SolanaChains()[selector], addresses) + state, err := solstate.MaybeLoadMCMSWithTimelockChainState(e.BlockChains.SolanaChains()[selector], addresses) if err != nil { return cldf.ChangesetOutput{}, err } diff --git a/deployment/common/changeset/set_config_mcms.go b/deployment/common/changeset/set_config_mcms.go index 9dc427f2024..1c33a886c1a 100644 --- a/deployment/common/changeset/set_config_mcms.go +++ b/deployment/common/changeset/set_config_mcms.go @@ -12,6 +12,7 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" chain_selectors "github.com/smartcontractkit/chain-selectors" evmstate "github.com/smartcontractkit/cld-changesets/pkg/family/evm" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" mcmslib "github.com/smartcontractkit/mcms" aptosmcms "github.com/smartcontractkit/mcms/sdk/aptos" "github.com/smartcontractkit/mcms/sdk/evm" @@ -88,7 +89,7 @@ func (cfg MCMSConfigV2) Validate(e cldf.Environment, selectors []uint64) error { } } case chain_selectors.FamilySolana: - state, err := commonState.MaybeLoadMCMSWithTimelockStateSolana(e, []uint64{chainSelector}) + state, err := solstate.MaybeLoadMCMSWithTimelockState(e, []uint64{chainSelector}) if err != nil { return err } @@ -307,7 +308,7 @@ func setConfigSolana( timelockAddressesPerChain, proposerMcmsPerChain map[uint64]string, useMCMS bool, ) ([]mcmstypes.BatchOperation, error) { chain := e.BlockChains.SolanaChains()[chainSelector] - mcmsStatePerChain, err := commonState.MaybeLoadMCMSWithTimelockStateSolana(e, []uint64{chainSelector}) + mcmsStatePerChain, err := solstate.MaybeLoadMCMSWithTimelockState(e, []uint64{chainSelector}) if err != nil { return nil, err } diff --git a/deployment/common/changeset/set_config_mcms_test.go b/deployment/common/changeset/set_config_mcms_test.go index 199ab6b24f6..c887eeb5834 100644 --- a/deployment/common/changeset/set_config_mcms_test.go +++ b/deployment/common/changeset/set_config_mcms_test.go @@ -10,6 +10,7 @@ import ( solanago "github.com/gagliardetto/solana-go" chain_selectors "github.com/smartcontractkit/chain-selectors" evmstate "github.com/smartcontractkit/cld-changesets/pkg/family/evm" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms/sdk/evm" "github.com/smartcontractkit/mcms/sdk/solana" mcmstypes "github.com/smartcontractkit/mcms/types" @@ -195,7 +196,7 @@ func TestSetConfigMCMSV2Solana(t *testing.T) { // Load the MCMS state addrs, err := rt.State().AddressBook.AddressesForChain(selector) require.NoError(t, err) - mcmsState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addrs) + mcmsState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addrs) require.NoError(t, err) // Fund the signer PDAs for the MCMS contracts diff --git a/deployment/common/changeset/solana/fund_mcm_pdas.go b/deployment/common/changeset/solana/fund_mcm_pdas.go index b47355143a6..893f8cce49e 100644 --- a/deployment/common/changeset/solana/fund_mcm_pdas.go +++ b/deployment/common/changeset/solana/fund_mcm_pdas.go @@ -7,10 +7,9 @@ import ( "github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go/rpc" - cldchangesetssolana "github.com/smartcontractkit/cld-changesets/pkg/family/solana" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" ) var _ cldf.ChangeSetV2[FundMCMSignerConfig] = FundMCMSignersChangeset{} @@ -43,7 +42,7 @@ func (f FundMCMSignersChangeset) VerifyPreconditions(e cldf.Environment, config if err != nil { return fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addreses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addreses) if err != nil { return fmt.Errorf("failed to load MCMS state: %w", err) } @@ -76,35 +75,35 @@ func (f FundMCMSignersChangeset) Apply(e cldf.Environment, config FundMCMSignerC if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addreses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addreses) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load MCMS state: %w", err) } - err = cldchangesetssolana.FundFromDeployerKey( + err = solstate.FundFromDeployerKey( solChain, - []solana.PublicKey{state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed)}, + []solana.PublicKey{solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed)}, cfgAmounts.Timelock) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to fund timelock signer on chain %d: %w", chainSelector, err) } - err = cldchangesetssolana.FundFromDeployerKey( + err = solstate.FundFromDeployerKey( solChain, - []solana.PublicKey{state.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed)}, + []solana.PublicKey{solstate.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed)}, cfgAmounts.ProposeMCM) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to fund MCMS proposer on chain %d: %w", chainSelector, err) } - err = cldchangesetssolana.FundFromDeployerKey( + err = solstate.FundFromDeployerKey( solChain, - []solana.PublicKey{state.GetMCMSignerPDA(mcmState.McmProgram, mcmState.CancellerMcmSeed)}, + []solana.PublicKey{solstate.GetMCMSignerPDA(mcmState.McmProgram, mcmState.CancellerMcmSeed)}, cfgAmounts.CancellerMCM) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to fund MCMS canceller on chain %d: %w", chainSelector, err) } - err = cldchangesetssolana.FundFromDeployerKey( + err = solstate.FundFromDeployerKey( solChain, - []solana.PublicKey{state.GetMCMSignerPDA(mcmState.McmProgram, mcmState.BypasserMcmSeed)}, + []solana.PublicKey{solstate.GetMCMSignerPDA(mcmState.McmProgram, mcmState.BypasserMcmSeed)}, cfgAmounts.BypasserMCM) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to fund mcm bypasser on chain %d: %w", chainSelector, err) diff --git a/deployment/common/changeset/solana/fund_mcm_pdas_test.go b/deployment/common/changeset/solana/fund_mcm_pdas_test.go index c73441d26e0..98f9db94660 100644 --- a/deployment/common/changeset/solana/fund_mcm_pdas_test.go +++ b/deployment/common/changeset/solana/fund_mcm_pdas_test.go @@ -7,6 +7,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go/rpc" chainselectors "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" "github.com/smartcontractkit/quarantine" "github.com/stretchr/testify/require" @@ -18,7 +19,6 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/engine/test/runtime" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -228,14 +228,14 @@ func TestFundMCMSignersChangeset_Apply(t *testing.T) { require.NoError(t, err) // Check balances of MCM Signer PDAS - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) require.NoError(t, err) accounts := []solana.PublicKey{ - state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed), - state.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed), - state.GetMCMSignerPDA(mcmState.McmProgram, mcmState.CancellerMcmSeed), - state.GetMCMSignerPDA(mcmState.McmProgram, mcmState.BypasserMcmSeed), + solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed), + solstate.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed), + solstate.GetMCMSignerPDA(mcmState.McmProgram, mcmState.CancellerMcmSeed), + solstate.GetMCMSignerPDA(mcmState.McmProgram, mcmState.BypasserMcmSeed), } var balances []uint64 for _, account := range accounts { diff --git a/deployment/common/changeset/solana/grant_role_timelock.go b/deployment/common/changeset/solana/grant_role_timelock.go index e5d940408ef..15758054200 100644 --- a/deployment/common/changeset/solana/grant_role_timelock.go +++ b/deployment/common/changeset/solana/grant_role_timelock.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" mcmssdk "github.com/smartcontractkit/mcms/sdk" mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" @@ -16,7 +17,6 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/operations" "github.com/smartcontractkit/chainlink/deployment/common/changeset/evm/mcms/seqs" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -68,14 +68,14 @@ func (t GrantRoleTimelockSolana) VerifyPreconditions( } } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, chainAddresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, chainAddresses) if err != nil { return fmt.Errorf("failed to load MCMS state: %w", err) } if mcmState.TimelockProgram.IsZero() { return fmt.Errorf("timelock program not deployed for chain %d", chainSelector) } - if (mcmState.TimelockSeed == state.PDASeed{}) { + if (mcmState.TimelockSeed == solstate.PDASeed{}) { return fmt.Errorf("timelock seed not found for chain %d", chainSelector) } } @@ -98,7 +98,7 @@ func (t GrantRoleTimelockSolana) Apply( if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmsChainState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + mcmsChainState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) deps := seqs.SeqSolanaGrantRoleTimelockDeps{Chain: solChain} input := seqs.SeqSolanaGrantRoleTimelockInput{ @@ -118,7 +118,7 @@ func (t GrantRoleTimelockSolana) Apply( Transactions: report.Output.McmsTransactions, }) proposers[chainSelector], _ = proposalMCM(mcmsChainState, cfg.MCMS.MCMSAction) - timelocks[chainSelector] = state.EncodeAddressWithSeed(mcmsChainState.TimelockProgram, mcmsChainState.TimelockSeed) + timelocks[chainSelector] = solstate.EncodeAddressWithSeed(mcmsChainState.TimelockProgram, mcmsChainState.TimelockSeed) inspectors[chainSelector] = mcmssolanasdk.NewInspector(solChain.Client) } } @@ -151,12 +151,12 @@ func validTimelockActions(timelockConfig *proposalutils.TimelockConfig) bool { } } -func proposalMCM(mcmsState *state.MCMSWithTimelockStateSolana, action mcmstypes.TimelockAction) (string, error) { +func proposalMCM(mcmsState *solstate.MCMSWithTimelockState, action mcmstypes.TimelockAction) (string, error) { switch action { case "", mcmstypes.TimelockActionSchedule: - return state.EncodeAddressWithSeed(mcmsState.McmProgram, mcmsState.ProposerMcmSeed), nil + return solstate.EncodeAddressWithSeed(mcmsState.McmProgram, mcmsState.ProposerMcmSeed), nil case mcmstypes.TimelockActionBypass: - return state.EncodeAddressWithSeed(mcmsState.McmProgram, mcmsState.BypasserMcmSeed), nil + return solstate.EncodeAddressWithSeed(mcmsState.McmProgram, mcmsState.BypasserMcmSeed), nil default: return "", fmt.Errorf("invalid mcms action: %v", action) } diff --git a/deployment/common/changeset/solana/grant_role_timelock_test.go b/deployment/common/changeset/solana/grant_role_timelock_test.go index 075486c2b79..419bae9612a 100644 --- a/deployment/common/changeset/solana/grant_role_timelock_test.go +++ b/deployment/common/changeset/solana/grant_role_timelock_test.go @@ -14,9 +14,11 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/engine/test/runtime" cldftesthelpers "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/mcms/proposalutils/testhelpers" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" + + soltestutils "github.com/smartcontractkit/cld-changesets/pkg/family/solana/testutils" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" - "github.com/smartcontractkit/chainlink/deployment/internal/soltestutils" ) func TestGrantRoleTimelockSolana(t *testing.T) { @@ -31,7 +33,7 @@ func TestGrantRoleTimelockSolana(t *testing.T) { executors2 := randomSolanaAccounts(t, 2) addresses, err := rt.State().AddressBook.AddressesForChain(selector) require.NoError(t, err) - mcmsState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmsState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) require.NoError(t, err) soltestutils.FundSignerPDAs(t, chain, mcmsState) @@ -103,6 +105,6 @@ func randomSolanaAccounts(t *testing.T, n int) []solana.PublicKey { return accounts } -func timelockAddress(chainState *state.MCMSWithTimelockStateSolana) string { - return state.EncodeAddressWithSeed(chainState.TimelockProgram, chainState.TimelockSeed) +func timelockAddress(chainState *solstate.MCMSWithTimelockState) string { + return solstate.EncodeAddressWithSeed(chainState.TimelockProgram, chainState.TimelockSeed) } diff --git a/deployment/common/changeset/solana/mcms/access_controller.go b/deployment/common/changeset/solana/mcms/access_controller.go index 1e9e2e356a2..2cec4861982 100644 --- a/deployment/common/changeset/solana/mcms/access_controller.go +++ b/deployment/common/changeset/solana/mcms/access_controller.go @@ -7,6 +7,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go/programs/system" "github.com/gagliardetto/solana-go/rpc" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" @@ -18,13 +19,12 @@ import ( cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" ) func deployAccessControllerProgram( - e cldf.Environment, chainState *state.MCMSWithTimelockStateSolana, + e cldf.Environment, chainState *solstate.MCMSWithTimelockState, chain cldf_solana.Chain, addressBook cldf.AddressBook, ) error { typeAndVersion := cldf.NewTypeAndVersion(commontypes.AccessControllerProgram, deployment.Version1_0_0) @@ -54,7 +54,7 @@ func deployAccessControllerProgram( return fmt.Errorf("failed to save address: %w", err) } - err = chainState.SetState(commontypes.AccessControllerProgram, programID, state.PDASeed{}) + err = chainState.SetState(commontypes.AccessControllerProgram, programID, solstate.PDASeed{}) if err != nil { return fmt.Errorf("failed to save onchain state: %w", err) } @@ -68,7 +68,7 @@ func deployAccessControllerProgram( } func initAccessController( - e cldf.Environment, chainState *state.MCMSWithTimelockStateSolana, contractType cldf.ContractType, + e cldf.Environment, chainState *solstate.MCMSWithTimelockState, contractType cldf.ContractType, chain cldf_solana.Chain, addressBook cldf.AddressBook, ) error { if chainState.AccessControllerProgram.IsZero() { @@ -115,7 +115,7 @@ func initAccessController( return fmt.Errorf("failed to save address: %w", err) } - err = chainState.SetState(contractType, account.PublicKey(), state.PDASeed{}) + err = chainState.SetState(contractType, account.PublicKey(), solstate.PDASeed{}) if err != nil { return fmt.Errorf("failed to save onchain state: %w", err) } @@ -164,10 +164,10 @@ func initializeAccessController( return nil } -func setupRoles(chainState *state.MCMSWithTimelockStateSolana, chain cldf_solana.Chain) error { - proposerPDA := state.GetMCMSignerPDA(chainState.McmProgram, chainState.ProposerMcmSeed) - cancellerPDA := state.GetMCMSignerPDA(chainState.McmProgram, chainState.CancellerMcmSeed) - bypasserPDA := state.GetMCMSignerPDA(chainState.McmProgram, chainState.BypasserMcmSeed) +func setupRoles(chainState *solstate.MCMSWithTimelockState, chain cldf_solana.Chain) error { + proposerPDA := solstate.GetMCMSignerPDA(chainState.McmProgram, chainState.ProposerMcmSeed) + cancellerPDA := solstate.GetMCMSignerPDA(chainState.McmProgram, chainState.CancellerMcmSeed) + bypasserPDA := solstate.GetMCMSignerPDA(chainState.McmProgram, chainState.BypasserMcmSeed) err := addAccess(chain, chainState, timelockBindings.Proposer_Role, proposerPDA) if err != nil { @@ -193,10 +193,10 @@ func setupRoles(chainState *state.MCMSWithTimelockStateSolana, chain cldf_solana } func addAccess( - chain cldf_solana.Chain, chainState *state.MCMSWithTimelockStateSolana, + chain cldf_solana.Chain, chainState *solstate.MCMSWithTimelockState, role timelockBindings.Role, accounts ...solana.PublicKey, ) error { - timelockConfigPDA := state.GetTimelockConfigPDA(chainState.TimelockProgram, chainState.TimelockSeed) + timelockConfigPDA := solstate.GetTimelockConfigPDA(chainState.TimelockProgram, chainState.TimelockSeed) instructionBuilder := timelockBindings.NewBatchAddAccessInstruction([32]uint8(chainState.TimelockSeed), role, timelockConfigPDA, chainState.AccessControllerProgram, chainState.RoleAccount(role), chain.DeployerKey.PublicKey()) diff --git a/deployment/common/changeset/solana/mcms/mcm.go b/deployment/common/changeset/solana/mcms/mcm.go index acfec457166..5787d73ebdc 100644 --- a/deployment/common/changeset/solana/mcms/mcm.go +++ b/deployment/common/changeset/solana/mcms/mcm.go @@ -8,6 +8,7 @@ import ( binary "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go/rpc" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" mcmsSolanaSdk "github.com/smartcontractkit/mcms/sdk/solana" mcmsTypes "github.com/smartcontractkit/mcms/types" @@ -19,13 +20,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" ) func deployMCMProgram( - env cldf.Environment, chainState *state.MCMSWithTimelockStateSolana, + env cldf.Environment, chainState *solstate.MCMSWithTimelockState, chain cldf_solana.Chain, addressBook cldf.AddressBook, ) error { typeAndVersion := cldf.NewTypeAndVersion(commontypes.ManyChainMultisigProgram, deployment.Version1_0_0) @@ -55,7 +55,7 @@ func deployMCMProgram( return fmt.Errorf("failed to save mcm address: %w", err) } - err = chainState.SetState(commontypes.ManyChainMultisigProgram, programID, state.PDASeed{}) + err = chainState.SetState(commontypes.ManyChainMultisigProgram, programID, solstate.PDASeed{}) if err != nil { return fmt.Errorf("failed to save onchain state: %w", err) } @@ -69,7 +69,7 @@ func deployMCMProgram( } func initMCM( - env cldf.Environment, chainState *state.MCMSWithTimelockStateSolana, contractType cldf.ContractType, + env cldf.Environment, chainState *solstate.MCMSWithTimelockState, contractType cldf.ContractType, chain cldf_solana.Chain, addressBook cldf.AddressBook, mcmConfig *mcmsTypes.Config, ) error { if chainState.McmProgram.IsZero() { @@ -83,8 +83,8 @@ func initMCM( return fmt.Errorf("failed to get mcm state: %w", err) } - if mcmSeed != (state.PDASeed{}) { - mcmConfigPDA := state.GetMCMConfigPDA(mcmProgram, mcmSeed) + if mcmSeed != (solstate.PDASeed{}) { + mcmConfigPDA := solstate.GetMCMConfigPDA(mcmProgram, mcmSeed) var data mcmBindings.MultisigConfig err = solanaUtils.GetAccountDataBorshInto(env.GetContext(), chain.Client, mcmConfigPDA, rpc.CommitmentConfirmed, &data) if err == nil { @@ -105,7 +105,7 @@ func initMCM( return fmt.Errorf("failed to initialize mcm: %w", err) } - mcmAddress := state.EncodeAddressWithSeed(programID, seed) + mcmAddress := solstate.EncodeAddressWithSeed(programID, seed) configurer := mcmsSolanaSdk.NewConfigurer(chain.Client, *chain.DeployerKey, mcmsTypes.ChainSelector(chain.Selector)) tx, err := configurer.SetConfig(env.GetContext(), mcmAddress, mcmConfig, false) @@ -127,9 +127,9 @@ func initMCM( return nil } -func initializeMCM(e cldf.Environment, chain cldf_solana.Chain, mcmProgram solana.PublicKey, multisigID state.PDASeed) error { +func initializeMCM(e cldf.Environment, chain cldf_solana.Chain, mcmProgram solana.PublicKey, multisigID solstate.PDASeed) error { var mcmConfig mcmBindings.MultisigConfig - err := chain.GetAccountDataBorshInto(e.GetContext(), state.GetMCMConfigPDA(mcmProgram, multisigID), &mcmConfig) + err := chain.GetAccountDataBorshInto(e.GetContext(), solstate.GetMCMConfigPDA(mcmProgram, multisigID), &mcmConfig) if err == nil { e.Logger.Infow("MCM already initialized, skipping initialization", "chain", chain.String()) return nil @@ -153,13 +153,13 @@ func initializeMCM(e cldf.Environment, chain cldf_solana.Chain, mcmProgram solan ix, err := mcmBindings.NewInitializeInstruction( chain.Selector, multisigID, - state.GetMCMConfigPDA(mcmProgram, multisigID), + solstate.GetMCMConfigPDA(mcmProgram, multisigID), chain.DeployerKey.PublicKey(), solana.SystemProgramID, mcmProgram, programData.Address, - state.GetMCMRootMetadataPDA(mcmProgram, multisigID), - state.GetMCMExpiringRootAndOpCountPDA(mcmProgram, multisigID), + solstate.GetMCMRootMetadataPDA(mcmProgram, multisigID), + solstate.GetMCMExpiringRootAndOpCountPDA(mcmProgram, multisigID), ).ValidateAndBuild() if err != nil { return fmt.Errorf("failed to build instruction: %w", err) @@ -177,10 +177,10 @@ func initializeMCM(e cldf.Environment, chain cldf_solana.Chain, mcmProgram solan return nil } -func randomSeed() state.PDASeed { +func randomSeed() solstate.PDASeed { const alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - seed := state.PDASeed{} + seed := solstate.PDASeed{} for i := range seed { seed[i] = alphabet[rand.Intn(len(alphabet))] } diff --git a/deployment/common/changeset/solana/mcms/mcms.go b/deployment/common/changeset/solana/mcms/mcms.go index edf5684171b..d1022c2efcf 100644 --- a/deployment/common/changeset/solana/mcms/mcms.go +++ b/deployment/common/changeset/solana/mcms/mcms.go @@ -8,6 +8,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go/rpc" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" @@ -16,7 +17,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana/mcms/sequence" "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana/mcms/sequence/operation" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -29,13 +29,13 @@ func DeployMCMSWithTimelockProgramsSolana( chain cldf_solana.Chain, addressBook cldf.AddressBook, config commontypes.MCMSWithTimelockConfigV2, -) (*state.MCMSWithTimelockStateSolana, error) { +) (*solstate.MCMSWithTimelockState, error) { addresses, err := e.ExistingAddresses.AddressesForChain(chain.Selector) if err != nil && !errors.Is(err, cldf.ErrChainNotFound) { return nil, fmt.Errorf("failed to get addresses for chain %v from environment: %w", chain.Selector, err) } - chainState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + chainState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { return nil, fmt.Errorf("failed to load mcms with timelock solana chain state: %w", err) } @@ -116,8 +116,8 @@ func DeployMCMSWithTimelockProgramsSolanaV2( e cldf.Environment, ds datastore.MutableDataStore, chain cldf_solana.Chain, - config commontypes.MCMSWithTimelockConfigV2) (*state.MCMSWithTimelockStateSolana, error) { - chainstate, err := state.MaybeLoadMCMSWithTimelockChainStateSolanaV2(e.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(chain.Selector))) + config commontypes.MCMSWithTimelockConfigV2) (*solstate.MCMSWithTimelockState, error) { + chainstate, err := solstate.MaybeLoadMCMSWithTimelockChainStateV2(e.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(chain.Selector))) if err != nil { return nil, err } diff --git a/deployment/common/changeset/solana/mcms/sequence/operation/operation.go b/deployment/common/changeset/solana/mcms/sequence/operation/operation.go index 5d76e06e08c..77efbe6a82d 100644 --- a/deployment/common/changeset/solana/mcms/sequence/operation/operation.go +++ b/deployment/common/changeset/solana/mcms/sequence/operation/operation.go @@ -10,6 +10,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go/programs/system" "github.com/gagliardetto/solana-go/rpc" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" mcmsSolanaSdk "github.com/smartcontractkit/mcms/sdk/solana" mcmsTypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/wsrpc/logger" @@ -22,14 +23,14 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/datastore" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" + "github.com/smartcontractkit/chainlink/deployment" commonOps "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana/operations" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" ) type Deps struct { Env cldf.Environment - State *state.MCMSWithTimelockStateSolana + State *solstate.MCMSWithTimelockState Datastore datastore.MutableDataStore Chain cldfsol.Chain } @@ -162,7 +163,7 @@ func initAccessController(b operations.Bundle, deps Deps, in InitAccessControlle log.Infow("initialized access controller", "account", account.PublicKey()) - err = deps.State.SetState(in.ContractType, account.PublicKey(), state.PDASeed{}) + err = deps.State.SetState(in.ContractType, account.PublicKey(), solstate.PDASeed{}) if err != nil { return out, fmt.Errorf("failed to save onchain state: %w", err) } @@ -236,8 +237,8 @@ func initMCM(b operations.Bundle, deps Deps, in InitMCMInput) (InitMCMOutput, er return out, fmt.Errorf("failed to get mcm state: %w", err) } - if mcmSeed != (state.PDASeed{}) { - mcmConfigPDA := state.GetMCMConfigPDA(mcmProgram, mcmSeed) + if mcmSeed != (solstate.PDASeed{}) { + mcmConfigPDA := solstate.GetMCMConfigPDA(mcmProgram, mcmSeed) var data mcmBindings.MultisigConfig err = solanaUtils.GetAccountDataBorshInto(b.GetContext(), deps.Chain.Client, mcmConfigPDA, rpc.CommitmentConfirmed, &data) if err == nil { @@ -257,7 +258,7 @@ func initMCM(b operations.Bundle, deps Deps, in InitMCMInput) (InitMCMOutput, er return out, fmt.Errorf("failed to initialize mcm: %w", err) } - mcmAddress := state.EncodeAddressWithSeed(programID, seed) + mcmAddress := solstate.EncodeAddressWithSeed(programID, seed) configurer := mcmsSolanaSdk.NewConfigurer(deps.Chain.Client, *deps.Chain.DeployerKey, mcmsTypes.ChainSelector(deps.Chain.ChainSelector())) tx, err := configurer.SetConfig(b.GetContext(), mcmAddress, &in.MCMConfig, false) @@ -283,9 +284,9 @@ func initMCM(b operations.Bundle, deps Deps, in InitMCMInput) (InitMCMOutput, er return out, nil } -func initializeMCM(b operations.Bundle, deps Deps, mcmProgram solana.PublicKey, multisigID state.PDASeed) error { +func initializeMCM(b operations.Bundle, deps Deps, mcmProgram solana.PublicKey, multisigID solstate.PDASeed) error { var mcmConfig mcmBindings.MultisigConfig - err := deps.Chain.GetAccountDataBorshInto(b.GetContext(), state.GetMCMConfigPDA(mcmProgram, multisigID), &mcmConfig) + err := deps.Chain.GetAccountDataBorshInto(b.GetContext(), solstate.GetMCMConfigPDA(mcmProgram, multisigID), &mcmConfig) if err == nil { b.Logger.Infow("MCM already initialized, skipping initialization", "chain", deps.Chain.String()) return nil @@ -309,13 +310,13 @@ func initializeMCM(b operations.Bundle, deps Deps, mcmProgram solana.PublicKey, instruction, err := mcmBindings.NewInitializeInstruction( deps.Chain.Selector, multisigID, - state.GetMCMConfigPDA(mcmProgram, multisigID), + solstate.GetMCMConfigPDA(mcmProgram, multisigID), deps.Chain.DeployerKey.PublicKey(), solana.SystemProgramID, mcmProgram, programData.Address, - state.GetMCMRootMetadataPDA(mcmProgram, multisigID), - state.GetMCMExpiringRootAndOpCountPDA(mcmProgram, multisigID), + solstate.GetMCMRootMetadataPDA(mcmProgram, multisigID), + solstate.GetMCMExpiringRootAndOpCountPDA(mcmProgram, multisigID), ).ValidateAndBuild() if err != nil { return fmt.Errorf("failed to build instruction: %w", err) @@ -344,8 +345,8 @@ func initTimelock(b operations.Bundle, deps Deps, in InitTimelockInput) (InitTim return out, fmt.Errorf("failed to get timelock state: %w", err) } - if (timelockSeed != state.PDASeed{}) { - timelockConfigPDA := state.GetTimelockConfigPDA(timelockProgram, timelockSeed) + if (timelockSeed != solstate.PDASeed{}) { + timelockConfigPDA := solstate.GetTimelockConfigPDA(timelockProgram, timelockSeed) var timelockConfig timelockBindings.Config err = deps.Chain.GetAccountDataBorshInto(b.GetContext(), timelockConfigPDA, &timelockConfig) if err == nil { @@ -366,7 +367,7 @@ func initTimelock(b operations.Bundle, deps Deps, in InitTimelockInput) (InitTim return out, fmt.Errorf("failed to initialize timelock: %w", err) } - timelockAddress := state.EncodeAddressWithSeed(programID, seed) + timelockAddress := solstate.EncodeAddressWithSeed(programID, seed) err = deps.Datastore.Addresses().Add(datastore.AddressRef{ Address: timelockAddress, @@ -386,13 +387,13 @@ func initTimelock(b operations.Bundle, deps Deps, in InitTimelockInput) (InitTim } func initializeTimelock(b operations.Bundle, deps Deps, timelockProgram solana.PublicKey, - timelockID state.PDASeed, minDelay *big.Int) error { + timelockID solstate.PDASeed, minDelay *big.Int) error { if minDelay == nil { minDelay = big.NewInt(0) } var timelockConfig timelockBindings.Config - err := deps.Chain.GetAccountDataBorshInto(b.GetContext(), state.GetTimelockConfigPDA(timelockProgram, timelockID), + err := deps.Chain.GetAccountDataBorshInto(b.GetContext(), solstate.GetTimelockConfigPDA(timelockProgram, timelockID), &timelockConfig) if err == nil { b.Logger.Infow("Timelock already initialized, skipping initialization", "chain", deps.Chain.String()) @@ -417,7 +418,7 @@ func initializeTimelock(b operations.Bundle, deps Deps, timelockProgram solana.P instruction, err := timelockBindings.NewInitializeInstruction( timelockID, minDelay.Uint64(), - state.GetTimelockConfigPDA(timelockProgram, timelockID), + solstate.GetTimelockConfigPDA(timelockProgram, timelockID), deps.Chain.DeployerKey.PublicKey(), solana.SystemProgramID, timelockProgram, @@ -443,7 +444,7 @@ func initializeTimelock(b operations.Bundle, deps Deps, timelockProgram solana.P func addAccess(b operations.Bundle, deps Deps, in AddAccessInput) (AddAccessOutput, error) { var out AddAccessOutput - timelockConfigPDA := state.GetTimelockConfigPDA(deps.State.TimelockProgram, deps.State.TimelockSeed) + timelockConfigPDA := solstate.GetTimelockConfigPDA(deps.State.TimelockProgram, deps.State.TimelockSeed) instructionBuilder := timelockBindings.NewBatchAddAccessInstruction([32]uint8(deps.State.TimelockSeed), in.Role, timelockConfigPDA, deps.State.AccessControllerProgram, deps.State.RoleAccount(in.Role), deps.Chain.DeployerKey.PublicKey()) @@ -464,10 +465,10 @@ func addAccess(b operations.Bundle, deps Deps, in AddAccessInput) (AddAccessOutp return out, nil } -func randomSeed() state.PDASeed { +func randomSeed() solstate.PDASeed { const alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - seed := state.PDASeed{} + seed := solstate.PDASeed{} for i := range seed { seed[i] = alphabet[rand.Intn(len(alphabet))] } diff --git a/deployment/common/changeset/solana/mcms/timelock.go b/deployment/common/changeset/solana/mcms/timelock.go index 611432fef1d..363aa135713 100644 --- a/deployment/common/changeset/solana/mcms/timelock.go +++ b/deployment/common/changeset/solana/mcms/timelock.go @@ -8,6 +8,7 @@ import ( binary "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" "github.com/gagliardetto/solana-go/rpc" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" @@ -17,13 +18,12 @@ import ( cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" ) func deployTimelockProgram( - e cldf.Environment, chainState *state.MCMSWithTimelockStateSolana, chain cldf_solana.Chain, + e cldf.Environment, chainState *solstate.MCMSWithTimelockState, chain cldf_solana.Chain, addressBook cldf.AddressBook, ) error { typeAndVersion := cldf.NewTypeAndVersion(commontypes.RBACTimelockProgram, deployment.Version1_0_0) @@ -53,7 +53,7 @@ func deployTimelockProgram( return fmt.Errorf("failed to save mcm address: %w", err) } - err = chainState.SetState(commontypes.RBACTimelockProgram, programID, state.PDASeed{}) + err = chainState.SetState(commontypes.RBACTimelockProgram, programID, solstate.PDASeed{}) if err != nil { return fmt.Errorf("failed to save onchain state: %w", err) } @@ -67,7 +67,7 @@ func deployTimelockProgram( } func initTimelock( - e cldf.Environment, chainState *state.MCMSWithTimelockStateSolana, chain cldf_solana.Chain, + e cldf.Environment, chainState *solstate.MCMSWithTimelockState, chain cldf_solana.Chain, addressBook cldf.AddressBook, minDelay *big.Int, ) error { if chainState.TimelockProgram.IsZero() { @@ -82,8 +82,8 @@ func initTimelock( return fmt.Errorf("failed to get timelock state: %w", err) } - if (timelockSeed != state.PDASeed{}) { - timelockConfigPDA := state.GetTimelockConfigPDA(timelockProgram, timelockSeed) + if (timelockSeed != solstate.PDASeed{}) { + timelockConfigPDA := solstate.GetTimelockConfigPDA(timelockProgram, timelockSeed) var timelockConfig timelockBindings.Config err = chain.GetAccountDataBorshInto(e.GetContext(), timelockConfigPDA, &timelockConfig) if err == nil { @@ -104,7 +104,7 @@ func initTimelock( return fmt.Errorf("failed to initialize timelock: %w", err) } - timelockAddress := state.EncodeAddressWithSeed(programID, seed) + timelockAddress := solstate.EncodeAddressWithSeed(programID, seed) err = addressBook.Save(chain.Selector, timelockAddress, typeAndVersion) if err != nil { @@ -120,15 +120,15 @@ func initTimelock( } func initializeTimelock( - e cldf.Environment, chain cldf_solana.Chain, timelockProgram solana.PublicKey, timelockID state.PDASeed, - chainState *state.MCMSWithTimelockStateSolana, minDelay *big.Int, + e cldf.Environment, chain cldf_solana.Chain, timelockProgram solana.PublicKey, timelockID solstate.PDASeed, + chainState *solstate.MCMSWithTimelockState, minDelay *big.Int, ) error { if minDelay == nil { minDelay = big.NewInt(0) } var timelockConfig timelockBindings.Config - err := chain.GetAccountDataBorshInto(e.GetContext(), state.GetTimelockConfigPDA(timelockProgram, timelockID), + err := chain.GetAccountDataBorshInto(e.GetContext(), solstate.GetTimelockConfigPDA(timelockProgram, timelockID), &timelockConfig) if err == nil { e.Logger.Infow("Timelock already initialized, skipping initialization", "chain", chain.String()) @@ -153,7 +153,7 @@ func initializeTimelock( instruction, err := timelockBindings.NewInitializeInstruction( timelockID, minDelay.Uint64(), - state.GetTimelockConfigPDA(timelockProgram, timelockID), + solstate.GetTimelockConfigPDA(timelockProgram, timelockID), chain.DeployerKey.PublicKey(), solana.SystemProgramID, timelockProgram, diff --git a/deployment/common/changeset/solana/transfer_ownership.go b/deployment/common/changeset/solana/transfer_ownership.go index 58564d70602..a8b7c51455c 100644 --- a/deployment/common/changeset/solana/transfer_ownership.go +++ b/deployment/common/changeset/solana/transfer_ownership.go @@ -8,6 +8,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/gagliardetto/solana-go" "github.com/mr-tron/base58" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" mcmssdk "github.com/smartcontractkit/mcms/sdk" mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" @@ -106,7 +107,7 @@ func (t *TransferToTimelockSolana) Apply( env cldf.Environment, cfg TransferToTimelockSolanaConfig, ) (cldf.ChangesetOutput, error) { solChains := env.BlockChains.SolanaChains() - mcmsState, err := state.MaybeLoadMCMSWithTimelockStateSolana(env, slices.Collect(maps.Keys(solChains))) + mcmsState, err := solstate.MaybeLoadMCMSWithTimelockState(env, slices.Collect(maps.Keys(solChains))) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } @@ -206,7 +207,7 @@ func GenericTransferOwnership(env cldf.Environment, req *TransferOwnershipReques } // Load MCMS state - mcmsState, err := state.MaybeLoadMCMSWithTimelockChainStateSolanaV2( + mcmsState, err := solstate.MaybeLoadMCMSWithTimelockChainStateV2( env.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(req.ChainSel))) if err != nil { return out, err @@ -286,7 +287,7 @@ func GenericVerifyPreconditions(env cldf.Environment, chainSel uint64, version, type ( Deps struct { Env cldf.Environment - State *state.MCMSWithTimelockStateSolana + State *solstate.MCMSWithTimelockState Chain cldfsol.Chain } @@ -317,7 +318,7 @@ func TransferToTimelockSolanaOp(b operations.Bundle, deps Deps, in TransferToTim proposers[chainSelector] = solanaAddress(chainState.McmProgram, mcmssolanasdk.PDASeed(chainState.ProposerMcmSeed)) inspectors[chainSelector] = mcmssolanasdk.NewInspector(solChain.Client) - timelockSignerPDA := state.GetTimelockSignerPDA(chainState.TimelockProgram, chainState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(chainState.TimelockProgram, chainState.TimelockSeed) transactions := []mcmstypes.Transaction{} contract := in.Contract @@ -387,7 +388,7 @@ func (t TransferMCMSToTimelockSolana) VerifyPreconditions( func (t TransferMCMSToTimelockSolana) Apply( env cldf.Environment, cfg TransferMCMSToTimelockSolanaConfig, ) (cldf.ChangesetOutput, error) { - mcmsState, err := state.MaybeLoadMCMSWithTimelockStateSolana(env, cfg.Chains) + mcmsState, err := solstate.MaybeLoadMCMSWithTimelockState(env, cfg.Chains) if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to load mcms state: %w", err) } @@ -398,25 +399,25 @@ func (t TransferMCMSToTimelockSolana) Apply( { ProgramID: chainState.McmProgram, Seed: chainState.ProposerMcmSeed, - OwnerPDA: state.GetMCMConfigPDA(chainState.McmProgram, chainState.ProposerMcmSeed), + OwnerPDA: solstate.GetMCMConfigPDA(chainState.McmProgram, chainState.ProposerMcmSeed), Type: commontypes.ProposerManyChainMultisig, }, { ProgramID: chainState.McmProgram, Seed: chainState.CancellerMcmSeed, - OwnerPDA: state.GetMCMConfigPDA(chainState.McmProgram, chainState.CancellerMcmSeed), + OwnerPDA: solstate.GetMCMConfigPDA(chainState.McmProgram, chainState.CancellerMcmSeed), Type: commontypes.CancellerManyChainMultisig, }, { ProgramID: chainState.McmProgram, Seed: chainState.BypasserMcmSeed, - OwnerPDA: state.GetMCMConfigPDA(chainState.McmProgram, chainState.BypasserMcmSeed), + OwnerPDA: solstate.GetMCMConfigPDA(chainState.McmProgram, chainState.BypasserMcmSeed), Type: commontypes.BypasserManyChainMultisig, }, { ProgramID: chainState.TimelockProgram, Seed: chainState.TimelockSeed, - OwnerPDA: state.GetTimelockConfigPDA(chainState.TimelockProgram, chainState.TimelockSeed), + OwnerPDA: solstate.GetTimelockConfigPDA(chainState.TimelockProgram, chainState.TimelockSeed), Type: commontypes.RBACTimelock, }, { diff --git a/deployment/common/changeset/solana/transfer_ownership_test.go b/deployment/common/changeset/solana/transfer_ownership_test.go index 8aecd81c737..07612e84ee4 100644 --- a/deployment/common/changeset/solana/transfer_ownership_test.go +++ b/deployment/common/changeset/solana/transfer_ownership_test.go @@ -6,6 +6,8 @@ import ( "time" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" + soltestutils "github.com/smartcontractkit/cld-changesets/pkg/family/solana/testutils" "github.com/smartcontractkit/quarantine" "github.com/stretchr/testify/require" @@ -17,9 +19,8 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/engine/test/runtime" cldftesthelpers "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/mcms/proposalutils/testhelpers" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" - "github.com/smartcontractkit/chainlink/deployment/internal/soltestutils" ) func TestTransferToMCMSToTimelockSolana(t *testing.T) { @@ -33,7 +34,7 @@ func TestTransferToMCMSToTimelockSolana(t *testing.T) { chain := rt.Environment().BlockChains.SolanaChains()[selector] - mcmsState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmsState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) require.NoError(t, err) soltestutils.FundSignerPDAs(t, chain, mcmsState) @@ -53,19 +54,19 @@ func TestTransferToMCMSToTimelockSolana(t *testing.T) { require.NoError(t, err) // --- assert --- - timelockSignerPDA := state.GetTimelockSignerPDA(mcmsState.TimelockProgram, mcmsState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmsState.TimelockProgram, mcmsState.TimelockSeed) assertOwner(t, chain, mcmsState, timelockSignerPDA) } func assertOwner( - t *testing.T, chain cldf_solana.Chain, mcmsState *state.MCMSWithTimelockStateSolana, owner solana.PublicKey, + t *testing.T, chain cldf_solana.Chain, mcmsState *solstate.MCMSWithTimelockState, owner solana.PublicKey, ) { t.Helper() - assertMCMOwner(t, owner, state.GetMCMConfigPDA(mcmsState.McmProgram, mcmsState.ProposerMcmSeed), chain) - assertMCMOwner(t, owner, state.GetMCMConfigPDA(mcmsState.McmProgram, mcmsState.CancellerMcmSeed), chain) - assertMCMOwner(t, owner, state.GetMCMConfigPDA(mcmsState.McmProgram, mcmsState.BypasserMcmSeed), chain) - assertTimelockOwner(t, owner, state.GetTimelockConfigPDA(mcmsState.TimelockProgram, mcmsState.TimelockSeed), chain) + assertMCMOwner(t, owner, solstate.GetMCMConfigPDA(mcmsState.McmProgram, mcmsState.ProposerMcmSeed), chain) + assertMCMOwner(t, owner, solstate.GetMCMConfigPDA(mcmsState.McmProgram, mcmsState.CancellerMcmSeed), chain) + assertMCMOwner(t, owner, solstate.GetMCMConfigPDA(mcmsState.McmProgram, mcmsState.BypasserMcmSeed), chain) + assertTimelockOwner(t, owner, solstate.GetTimelockConfigPDA(mcmsState.TimelockProgram, mcmsState.TimelockSeed), chain) assertAccessControllerOwner(t, owner, mcmsState.ProposerAccessControllerAccount, chain) assertAccessControllerOwner(t, owner, mcmsState.ExecutorAccessControllerAccount, chain) assertAccessControllerOwner(t, owner, mcmsState.CancellerAccessControllerAccount, chain) diff --git a/deployment/common/changeset/solana/update_delay_timelock.go b/deployment/common/changeset/solana/update_delay_timelock.go index 26976513930..66e43bafe3b 100644 --- a/deployment/common/changeset/solana/update_delay_timelock.go +++ b/deployment/common/changeset/solana/update_delay_timelock.go @@ -6,12 +6,11 @@ import ( "time" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" timelockBindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_1/timelock" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" - - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" ) // UpdateTimelockDelaySolana updates the timelock delay for the given solana chains @@ -42,7 +41,7 @@ func (t UpdateTimelockDelaySolana) VerifyPreconditions( if err != nil { return fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) if err != nil { return fmt.Errorf("failed to load MCMS state: %w", err) } @@ -67,8 +66,8 @@ func (t UpdateTimelockDelaySolana) Apply( if err != nil { return cldf.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) } - mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) - configPDA := state.GetTimelockConfigPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addresses) + configPDA := solstate.GetTimelockConfigPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) timelockBindings.SetProgramID(mcmState.TimelockProgram) updateDelayIx := timelockBindings.NewUpdateDelayInstruction(mcmState.TimelockSeed, uint64(delay.Seconds()), configPDA, solChain.DeployerKey.PublicKey()) ix, err := updateDelayIx.ValidateAndBuild() diff --git a/deployment/common/changeset/solana/update_delay_timelock_test.go b/deployment/common/changeset/solana/update_delay_timelock_test.go index 4981e484f5c..6c11ecb95d0 100644 --- a/deployment/common/changeset/solana/update_delay_timelock_test.go +++ b/deployment/common/changeset/solana/update_delay_timelock_test.go @@ -7,6 +7,7 @@ import ( "github.com/gagliardetto/solana-go" chainselectors "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" "github.com/stretchr/testify/require" @@ -18,7 +19,6 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/engine/test/runtime" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -149,10 +149,10 @@ func TestUpdateTimelockDelaySolana_Apply(t *testing.T) { chain := rt.Environment().BlockChains.SolanaChains()[selector] // Check new delay config value - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) require.NoError(t, err) - timelockConfigPDA := state.GetTimelockConfigPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockConfigPDA := solstate.GetTimelockConfigPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) var timelockConfig timelockBindings.Config err = chain.GetAccountDataBorshInto(t.Context(), timelockConfigPDA, &timelockConfig) diff --git a/deployment/common/changeset/state/solana.go b/deployment/common/changeset/state/solana.go index 55991b15c59..76295bd3880 100644 --- a/deployment/common/changeset/state/solana.go +++ b/deployment/common/changeset/state/solana.go @@ -9,14 +9,7 @@ import ( mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" cldf_solana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" - "github.com/smartcontractkit/chainlink-deployments-framework/datastore" - timelockBindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/v0_1_1/timelock" - - cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" - - "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/common/types" view "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" ) @@ -39,69 +32,6 @@ type MCMSWithTimelockProgramsSolana struct { BypasserAccessControllerAccount solana.PublicKey } -func (s *MCMSWithTimelockProgramsSolana) GetStateFromType(programType cldf.ContractType) (solana.PublicKey, PDASeed, error) { - switch programType { - case types.ManyChainMultisigProgram: - return s.McmProgram, PDASeed{}, nil - case types.ProposerManyChainMultisig: - return s.McmProgram, s.ProposerMcmSeed, nil - case types.BypasserManyChainMultisig: - return s.McmProgram, s.BypasserMcmSeed, nil - case types.CancellerManyChainMultisig: - return s.McmProgram, s.CancellerMcmSeed, nil - case types.RBACTimelockProgram: - return s.TimelockProgram, PDASeed{}, nil - case types.RBACTimelock: - return s.TimelockProgram, s.TimelockSeed, nil - case types.AccessControllerProgram: - return s.AccessControllerProgram, PDASeed{}, nil - case types.ProposerAccessControllerAccount: - return s.AccessControllerProgram, PDASeed(s.ProposerAccessControllerAccount), nil - case types.ExecutorAccessControllerAccount: - return s.AccessControllerProgram, PDASeed(s.ExecutorAccessControllerAccount), nil - case types.CancellerAccessControllerAccount: - return s.AccessControllerProgram, PDASeed(s.CancellerAccessControllerAccount), nil - case types.BypasserAccessControllerAccount: - return s.AccessControllerProgram, PDASeed(s.BypasserAccessControllerAccount), nil - default: - return solana.PublicKey{}, PDASeed{}, fmt.Errorf("unknown program type: %s", programType) - } -} - -func (s *MCMSWithTimelockProgramsSolana) SetState(contractType cldf.ContractType, program solana.PublicKey, seed PDASeed) error { - switch contractType { - case types.ManyChainMultisigProgram: - s.McmProgram = program - case types.ProposerManyChainMultisig: - s.McmProgram = program - s.ProposerMcmSeed = seed - case types.BypasserManyChainMultisig: - s.McmProgram = program - s.BypasserMcmSeed = seed - case types.CancellerManyChainMultisig: - s.McmProgram = program - s.CancellerMcmSeed = seed - case types.RBACTimelockProgram: - s.TimelockProgram = program - case types.RBACTimelock: - s.TimelockProgram = program - s.TimelockSeed = seed - case types.AccessControllerProgram: - s.AccessControllerProgram = program - case types.ProposerAccessControllerAccount: - s.ProposerAccessControllerAccount = program - case types.ExecutorAccessControllerAccount: - s.ExecutorAccessControllerAccount = program - case types.CancellerAccessControllerAccount: - s.CancellerAccessControllerAccount = program - case types.BypasserAccessControllerAccount: - s.BypasserAccessControllerAccount = program - default: - return fmt.Errorf("unknown contract type: %s", contractType) - } - return nil -} - // Validate checks that all fields are non-nil, ensuring it's ready // for use generating views or interactions. func (s *MCMSWithTimelockProgramsSolana) Validate() error { @@ -129,21 +59,6 @@ func (s *MCMSWithTimelockProgramsSolana) Validate() error { return nil } -func (s *MCMSWithTimelockProgramsSolana) RoleAccount(role timelockBindings.Role) solana.PublicKey { - switch role { - case timelockBindings.Proposer_Role: - return s.ProposerAccessControllerAccount - case timelockBindings.Executor_Role: - return s.ExecutorAccessControllerAccount - case timelockBindings.Canceller_Role: - return s.CancellerAccessControllerAccount - case timelockBindings.Bypasser_Role: - return s.BypasserAccessControllerAccount - default: - return solana.PublicKey{} - } -} - func (s *MCMSWithTimelockProgramsSolana) GenerateView( ctx context.Context, chain cldf_solana.Chain, ) (view.MCMSWithTimelockViewSolana, error) { @@ -165,269 +80,3 @@ func (s *MCMSWithTimelockProgramsSolana) GenerateView( type MCMSWithTimelockStateSolana struct { *MCMSWithTimelockProgramsSolana } - -// MaybeLoadMCMSWithTimelockStateSolana loads the MCMSWithTimelockStateSolana state for each chain in the given environment. -func MaybeLoadMCMSWithTimelockStateSolana(env cldf.Environment, chainSelectors []uint64) (map[uint64]*MCMSWithTimelockStateSolana, error) { - result := map[uint64]*MCMSWithTimelockStateSolana{} - solChains := env.BlockChains.SolanaChains() - for _, chainSelector := range chainSelectors { - chain, ok := solChains[chainSelector] - if !ok { - return nil, fmt.Errorf("chain %d not found", chainSelector) - } - addressesChain, err := env.ExistingAddresses.AddressesForChain(chainSelector) - if err != nil { - if !errors.Is(err, cldf.ErrChainNotFound) { - return nil, fmt.Errorf("unable to get addresses for chain %v: %w", chainSelector, err) - } - // chain not found in address book, initialize empty - addressesChain = make(map[string]cldf.TypeAndVersion) - } - state, err := MaybeLoadMCMSWithTimelockChainStateSolana(chain, addressesChain) - if err != nil { - return nil, fmt.Errorf("unable to load mcms and timelock solana chain state: %w", err) - } - result[chainSelector] = state - } - return result, nil -} - -// MaybeLoadMCMSWithTimelockChainStateSolana looks for the addresses corresponding to -// contracts deployed with DeployMCMSWithTimelock and loads them into a -// MCMSWithTimelockStateSolana struct. If none of the contracts are found, the -// state struct will be nil. -// An error indicates: -// - Found but was unable to load a contract -// - It only found part of the bundle of contracts -// - If found more than one instance of a contract (we expect one bundle in the given addresses) -func MaybeLoadMCMSWithTimelockChainStateSolana(chain cldf_solana.Chain, addresses map[string]cldf.TypeAndVersion) (*MCMSWithTimelockStateSolana, error) { - state := MCMSWithTimelockStateSolana{MCMSWithTimelockProgramsSolana: &MCMSWithTimelockProgramsSolana{}} - - mcmProgram := cldf.NewTypeAndVersion(types.ManyChainMultisigProgram, deployment.Version1_0_0) - timelockProgram := cldf.NewTypeAndVersion(types.RBACTimelockProgram, deployment.Version1_0_0) - accessControllerProgram := cldf.NewTypeAndVersion(types.AccessControllerProgram, deployment.Version1_0_0) - proposerMCM := cldf.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0) - cancellerMCM := cldf.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0) - bypasserMCM := cldf.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0) - timelock := cldf.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0) - proposerAccessControllerAccount := cldf.NewTypeAndVersion(types.ProposerAccessControllerAccount, deployment.Version1_0_0) - executorAccessControllerAccount := cldf.NewTypeAndVersion(types.ExecutorAccessControllerAccount, deployment.Version1_0_0) - cancellerAccessControllerAccount := cldf.NewTypeAndVersion(types.CancellerAccessControllerAccount, deployment.Version1_0_0) - bypasserAccessControllerAccount := cldf.NewTypeAndVersion(types.BypasserAccessControllerAccount, deployment.Version1_0_0) - - // Convert map keys to a slice - wantTypes := []cldf.TypeAndVersion{ - mcmProgram, timelockProgram, accessControllerProgram, proposerMCM, cancellerMCM, bypasserMCM, timelock, - proposerAccessControllerAccount, executorAccessControllerAccount, cancellerAccessControllerAccount, - bypasserAccessControllerAccount, - } - - // Ensure we either have the bundle or not. - _, err := cldf.EnsureDeduped(addresses, wantTypes) - if err != nil { - return nil, fmt.Errorf("unable to check MCMS contracts on chain %s error: %w", chain.Name(), err) - } - - for address, tvStr := range addresses { - switch { - case tvStr.Type == timelockProgram.Type && tvStr.Version.String() == timelockProgram.Version.String(): - programID, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode timelock program address (%s): %w", address, err) - } - state.TimelockProgram = programID - - case tvStr.Type == timelock.Type && tvStr.Version.String() == timelock.Version.String(): - programID, seed, err := DecodeAddressWithSeed(address) - if err != nil { - return nil, fmt.Errorf("unable to decode timelock address (%s): %w", address, err) - } - state.TimelockProgram = programID - state.TimelockSeed = seed - - case tvStr.Type == accessControllerProgram.Type && tvStr.Version.String() == accessControllerProgram.Version.String(): - programID, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to parse public key from access controller address: %s", address) - } - state.AccessControllerProgram = programID - - case tvStr.Type == proposerAccessControllerAccount.Type && tvStr.Version.String() == proposerAccessControllerAccount.Version.String(): - account, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode proposer access controller address (%s): %w", address, err) - } - state.ProposerAccessControllerAccount = account - - case tvStr.Type == executorAccessControllerAccount.Type && tvStr.Version.String() == executorAccessControllerAccount.Version.String(): - account, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode executor access controller address (%s): %w", address, err) - } - state.ExecutorAccessControllerAccount = account - - case tvStr.Type == cancellerAccessControllerAccount.Type && tvStr.Version.String() == cancellerAccessControllerAccount.Version.String(): - account, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode canceller access controller address (%s): %w", address, err) - } - state.CancellerAccessControllerAccount = account - - case tvStr.Type == bypasserAccessControllerAccount.Type && tvStr.Version.String() == bypasserAccessControllerAccount.Version.String(): - account, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode bypasser access controller address (%s): %w", address, err) - } - state.BypasserAccessControllerAccount = account - - case tvStr.Type == mcmProgram.Type && tvStr.Version.String() == mcmProgram.Version.String(): - programID, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to parse public key from mcm address: %s", address) - } - state.McmProgram = programID - - case tvStr.Type == proposerMCM.Type && tvStr.Version.String() == proposerMCM.Version.String(): - programID, seed, err := DecodeAddressWithSeed(address) - if err != nil { - return nil, fmt.Errorf("unable to decode proposer address (%s): %w", address, err) - } - state.McmProgram = programID - state.ProposerMcmSeed = seed - - case tvStr.Type == bypasserMCM.Type && tvStr.Version.String() == bypasserMCM.Version.String(): - programID, seed, err := DecodeAddressWithSeed(address) - if err != nil { - return nil, fmt.Errorf("unable to decode bypasser address (%s): %w", address, err) - } - state.McmProgram = programID - state.BypasserMcmSeed = seed - - case tvStr.Type == cancellerMCM.Type && tvStr.Version.String() == cancellerMCM.Version.String(): - programID, seed, err := DecodeAddressWithSeed(address) - if err != nil { - return nil, fmt.Errorf("unable to decode canceller address (%s): %w", address, err) - } - state.McmProgram = programID - state.CancellerMcmSeed = seed - } - } - return &state, nil -} - -// Loads MCMSSolanaState from Datastore address refs -func MaybeLoadMCMSWithTimelockChainStateSolanaV2(refs []datastore.AddressRef) (*MCMSWithTimelockStateSolana, error) { - state := MCMSWithTimelockStateSolana{MCMSWithTimelockProgramsSolana: &MCMSWithTimelockProgramsSolana{}} - - mcmProgram := datastore.ContractType(types.ManyChainMultisigProgram) - timelockProgram := datastore.ContractType(types.RBACTimelockProgram) - accessControllerProgram := datastore.ContractType(types.AccessControllerProgram) - proposerMCM := datastore.ContractType(types.ProposerManyChainMultisig) - cancellerMCM := datastore.ContractType(types.CancellerManyChainMultisig) - bypasserMCM := datastore.ContractType(types.BypasserManyChainMultisig) - timelock := datastore.ContractType(types.RBACTimelock) - proposerAccessControllerAccount := datastore.ContractType(types.ProposerAccessControllerAccount) - executorAccessControllerAccount := datastore.ContractType(types.ExecutorAccessControllerAccount) - cancellerAccessControllerAccount := datastore.ContractType(types.CancellerAccessControllerAccount) - bypasserAccessControllerAccount := datastore.ContractType(types.BypasserAccessControllerAccount) - - for _, ref := range refs { - address := ref.Address - switch ref.Type { - case timelockProgram: - programID, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode timelock program address (%s): %w", address, err) - } - state.TimelockProgram = programID - - case timelock: - programID, seed, err := DecodeAddressWithSeed(address) - if err != nil { - return nil, fmt.Errorf("unable to decode timelock address (%s): %w", address, err) - } - state.TimelockProgram = programID - state.TimelockSeed = seed - - case accessControllerProgram: - programID, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to parse public key from access controller address: %s", address) - } - state.AccessControllerProgram = programID - - case proposerAccessControllerAccount: - account, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode proposer access controller address (%s): %w", address, err) - } - state.ProposerAccessControllerAccount = account - - case executorAccessControllerAccount: - account, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode executor access controller address (%s): %w", address, err) - } - state.ExecutorAccessControllerAccount = account - - case cancellerAccessControllerAccount: - account, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode canceller access controller address (%s): %w", address, err) - } - state.CancellerAccessControllerAccount = account - - case bypasserAccessControllerAccount: - account, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to decode bypasser access controller address (%s): %w", address, err) - } - state.BypasserAccessControllerAccount = account - - case mcmProgram: - programID, err := solana.PublicKeyFromBase58(address) - if err != nil { - return nil, fmt.Errorf("unable to parse public key from mcm address: %s", address) - } - state.McmProgram = programID - - case proposerMCM: - programID, seed, err := DecodeAddressWithSeed(address) - if err != nil { - return nil, fmt.Errorf("unable to decode proposer address (%s): %w", address, err) - } - state.McmProgram = programID - state.ProposerMcmSeed = seed - - case bypasserMCM: - programID, seed, err := DecodeAddressWithSeed(address) - if err != nil { - return nil, fmt.Errorf("unable to decode bypasser address (%s): %w", address, err) - } - state.McmProgram = programID - state.BypasserMcmSeed = seed - - case cancellerMCM: - programID, seed, err := DecodeAddressWithSeed(address) - if err != nil { - return nil, fmt.Errorf("unable to decode canceller address (%s): %w", address, err) - } - state.McmProgram = programID - state.CancellerMcmSeed = seed - } - } - return &state, nil -} - -func EncodeAddressWithSeed(programID solana.PublicKey, seed PDASeed) string { - return mcmssolanasdk.ContractAddress(programID, mcmssolanasdk.PDASeed(seed)) -} - -func DecodeAddressWithSeed(address string) (solana.PublicKey, PDASeed, error) { - programID, seed, err := mcmssolanasdk.ParseContractAddress(address) - if err != nil { - return solana.PublicKey{}, PDASeed{}, fmt.Errorf("unable to parse address: %s", address) - } - - return programID, PDASeed(seed), nil -} diff --git a/deployment/common/proposalutils/propose.go b/deployment/common/proposalutils/propose.go index c68ac064972..be875381a76 100644 --- a/deployment/common/proposalutils/propose.go +++ b/deployment/common/proposalutils/propose.go @@ -12,6 +12,7 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" chain_selectors "github.com/smartcontractkit/chain-selectors" evmstate "github.com/smartcontractkit/cld-changesets/pkg/family/evm" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" mcmslib "github.com/smartcontractkit/mcms" mcmschainwrappers "github.com/smartcontractkit/mcms/chainwrappers" mcmssdk "github.com/smartcontractkit/mcms/sdk" @@ -27,7 +28,6 @@ import ( cldfproposalutils "github.com/smartcontractkit/chainlink-deployments-framework/engine/cld/mcms/proposalutils" tonstate "github.com/smartcontractkit/chainlink-ton/deployment/state" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" ccipTypes "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -43,7 +43,7 @@ type TimelockConfig struct { ValidDuration *commonconfig.Duration `json:"validDuration" yaml:"validDuration"` } -func (tc *TimelockConfig) MCMBasedOnActionSolana(s state.MCMSWithTimelockStateSolana) (string, error) { +func (tc *TimelockConfig) MCMBasedOnActionSolana(s solstate.MCMSWithTimelockState) (string, error) { // if MCMSAction is not set, default to timelock.Schedule, this is to ensure no breaking changes for existing code if tc.MCMSAction == "" { tc.MCMSAction = types.TimelockActionSchedule @@ -413,16 +413,16 @@ func buildProposalMetadataV2( return proposalChainMetadata, nil } -func getSolanaState(env cldf.Environment, selector uint64) (*state.MCMSWithTimelockStateSolana, error) { +func getSolanaState(env cldf.Environment, selector uint64) (*solstate.MCMSWithTimelockState, error) { solanaChains := env.BlockChains.SolanaChains() addresses, err := env.ExistingAddresses.AddressesForChain(selector) - solanaState, err1 := state.MaybeLoadMCMSWithTimelockChainStateSolana(solanaChains[selector], addresses) + solanaState, err1 := solstate.MaybeLoadMCMSWithTimelockChainState(solanaChains[selector], addresses) if err == nil { return solanaState, nil } env.Logger.Info("failed to load MCMSState from address book") - solanaState, err2 := state.MaybeLoadMCMSWithTimelockChainStateSolanaV2(env.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(selector))) + solanaState, err2 := solstate.MaybeLoadMCMSWithTimelockChainStateV2(env.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(selector))) if err2 != nil { return nil, fmt.Errorf("failed to load solana state: %w", errors.Join(err1, err2)) } @@ -438,7 +438,7 @@ func getSolanaState(env cldf.Environment, selector uint64) (*state.MCMSWithTimel func AggregateProposals( env cldf.Environment, mcmsEVMState map[uint64]evmstate.MCMSWithTimelockState, - mcmsSolanaState map[uint64]state.MCMSWithTimelockStateSolana, + mcmsSolanaState map[uint64]solstate.MCMSWithTimelockState, proposals []mcmslib.TimelockProposal, description string, mcmsConfig *TimelockConfig, @@ -457,7 +457,7 @@ func AggregateProposals( type MCMSStates struct { MCMSEVMState map[uint64]evmstate.MCMSWithTimelockState - MCMSSolanaState map[uint64]state.MCMSWithTimelockStateSolana + MCMSSolanaState map[uint64]solstate.MCMSWithTimelockState MCMSAptosState map[uint64]aptos.AccountAddress MCMSTONState map[uint64]tonstate.MCMSChainState } diff --git a/deployment/common/proposalutils/propose_test.go b/deployment/common/proposalutils/propose_test.go index 8c56afafd39..5a6d7b4e785 100644 --- a/deployment/common/proposalutils/propose_test.go +++ b/deployment/common/proposalutils/propose_test.go @@ -10,6 +10,7 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" chain_selectors "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" mcmssdk "github.com/smartcontractkit/mcms/sdk" "github.com/smartcontractkit/mcms/sdk/solana" @@ -28,7 +29,6 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/engine/test/runtime" "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/internal/soltestutils" @@ -79,7 +79,7 @@ func TestBuildProposalFromBatchesV2(t *testing.T) { addrs, err = rt.State().AddressBook.AddressesForChain(solSelector) require.NoError(t, err) - solState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addrs) + solState, err := solstate.MaybeLoadMCMSWithTimelockChainState(solChain, addrs) require.NoError(t, err) timelockAddressPerChain := map[uint64]string{ diff --git a/deployment/cre/forwarder/solana/deploy_forwarder.go b/deployment/cre/forwarder/solana/deploy_forwarder.go index e378d147062..14d0f12e135 100644 --- a/deployment/cre/forwarder/solana/deploy_forwarder.go +++ b/deployment/cre/forwarder/solana/deploy_forwarder.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/gagliardetto/solana-go" chain_selectors "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" "github.com/smartcontractkit/mcms/sdk" mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" @@ -18,7 +19,7 @@ import ( "github.com/smartcontractkit/chainlink-deployments-framework/datastore" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" - commonstate "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/cre/forwarder" seq "github.com/smartcontractkit/chainlink/deployment/cre/forwarder/solana/sequence" @@ -238,7 +239,7 @@ func (cs ConfigureForwarders) VerifyPreconditions(env cldf.Environment, req *Con return fmt.Errorf("failed get fowarder for chain selector %d: %w", sel, err) } if req.MCMS != nil { - _, err = commonstate.MaybeLoadMCMSWithTimelockChainStateSolanaV2(env.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(sel))) + _, err = solstate.MaybeLoadMCMSWithTimelockChainStateV2(env.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(sel))) if err != nil { return fmt.Errorf("failed to load MCMS for chain selector %d: %w", sel, err) } @@ -268,7 +269,7 @@ func (cs ConfigureForwarders) Apply(env cldf.Environment, req *ConfigureForwarde solChain := env.BlockChains.SolanaChains()[chainSel] addresses := env.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(chainSel)) - mcmState, _ := commonstate.MaybeLoadMCMSWithTimelockChainStateSolanaV2(addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainStateV2(addresses) if mcmState.TimelockProgram.IsZero() { return cldf.ChangesetOutput{}, errors.New("timelock is not found") } diff --git a/deployment/go.mod b/deployment/go.mod index a0f629a99ee..18ccc7b71d6 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -44,7 +44,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260428205619-2db1389501a1 github.com/smartcontractkit/chainlink-common v0.11.2-0.20260504171535-31bb37ff18d5 github.com/smartcontractkit/chainlink-common/keystore v1.1.0 - github.com/smartcontractkit/chainlink-deployments-framework v0.98.0 + github.com/smartcontractkit/chainlink-deployments-framework v0.99.0 github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260504070828-3216bb63d886 github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260421142741-9c7fbaf7c828 @@ -59,7 +59,7 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/lib v1.54.5 github.com/smartcontractkit/chainlink-ton v0.0.0-20260423161209-5ce1dba9785e github.com/smartcontractkit/chainlink-ton/deployment v0.0.0-20260423161209-5ce1dba9785e - github.com/smartcontractkit/cld-changesets v0.0.0-20260427210718-b873c54e8d22 + github.com/smartcontractkit/cld-changesets v0.0.0-20260505190829-d29a2771ed91 github.com/smartcontractkit/freeport v0.1.3-0.20250828155247-add56fa28aad github.com/smartcontractkit/libocr v0.0.0-20260403184524-b6409238958d github.com/smartcontractkit/mcms v0.41.1 diff --git a/deployment/go.sum b/deployment/go.sum index 3cb711d1e17..cd7d34291e6 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1407,8 +1407,8 @@ github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-2025121515250 github.com/smartcontractkit/chainlink-common/pkg/monitoring v0.0.0-20251215152504-b1e41f508340/go.mod h1:P/0OSXUlFaxxD4B/P6HWbxYtIRmmWGDJAvanq19879c= github.com/smartcontractkit/chainlink-data-streams v0.1.14-0.20260504075031-e5aae8c82e91 h1:s8E4EYRKEjghJFDnIWQxw8zoCvORVolIY/EKZ+JmzRc= github.com/smartcontractkit/chainlink-data-streams v0.1.14-0.20260504075031-e5aae8c82e91/go.mod h1:Fl6b/I5qn5TcEh85FP1rNsJ7stcYtmXhVbM2W5RuzQg= -github.com/smartcontractkit/chainlink-deployments-framework v0.98.0 h1:Ov/KOEtubOHXX8oa9UtARhHmkQNCOIjWNt+Zi0AuzHM= -github.com/smartcontractkit/chainlink-deployments-framework v0.98.0/go.mod h1:24dwRW1PYolrlxSth///ddG3auGqR+50xaJiXfUHhkg= +github.com/smartcontractkit/chainlink-deployments-framework v0.99.0 h1:UmFIN63m3+qXB5sP3ZtNzoMS8iIPDxeDVzYnhFB/U2k= +github.com/smartcontractkit/chainlink-deployments-framework v0.99.0/go.mod h1:h2R69nbkSMGUSYHrf1lbrchml1CdR1jP4t9HsBb0xdY= github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260504070828-3216bb63d886 h1:ighx6Wf5Le/tp2nFIipnr3axk+zlmu6SZ6n7qp2mpqQ= github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260504070828-3216bb63d886/go.mod h1:GH17WWRgGTWHp4GfJbK/9LdgkajYuLx1TmAO/jqRKDs= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 h1:QJiXTG9CmaQAuMRn5JGi+Jhji7fSkehVnKpjc8oNJJY= @@ -1481,8 +1481,8 @@ github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20260408092456-3c63 github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20260408092456-3c6369888d4a/go.mod h1:1eaXR+Fe6TlpP+CKXozfYlFM8QgN/N5C7OMvTRWNT8I= github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.5-0.20260218133534-cbd44da2856b h1:RarA5fTnBzQY9wHhl6g7Ac7Nv0d/izr2/zuSWhveB4c= github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.5-0.20260218133534-cbd44da2856b/go.mod h1:ea1LESxlSSOgc2zZBqf1RTkXTMthHaspdqUHd7W4lF0= -github.com/smartcontractkit/cld-changesets v0.0.0-20260427210718-b873c54e8d22 h1:yW9CUsDI/4qfnUcJ7iU+RYiiw0avyxysckGryVicyaI= -github.com/smartcontractkit/cld-changesets v0.0.0-20260427210718-b873c54e8d22/go.mod h1:thij0vx1djo0ze/ZqYmYAqHMhSqwr91M+51jmj7YBS4= +github.com/smartcontractkit/cld-changesets v0.0.0-20260505190829-d29a2771ed91 h1:enMC3bPrkSFvGBpk3gEcF1HrC7LeQQjf6NUtPKqPJgc= +github.com/smartcontractkit/cld-changesets v0.0.0-20260505190829-d29a2771ed91/go.mod h1:GjGekMa9+KqHA6Aw/ibB1ACy6tXzfN0kAMotBpNkHNc= github.com/smartcontractkit/cre-sdk-go v1.5.0 h1:kepW3QDKARrOOHjXwWAZ9j5KLk6bxLzvi6OMrLsFwVo= github.com/smartcontractkit/cre-sdk-go v1.5.0/go.mod h1:yYrQFz1UH7hhRbPO0q4fgo1tfsJNd4yXnI3oCZE0RzM= github.com/smartcontractkit/freeport v0.1.3-0.20250828155247-add56fa28aad h1:lgHxTHuzJIF3Vj6LSMOnjhqKgRqYW+0MV2SExtCYL1Q= diff --git a/deployment/helpers/deploy_solana.go b/deployment/helpers/deploy_solana.go index 7af90657017..8a49c849dd0 100644 --- a/deployment/helpers/deploy_solana.go +++ b/deployment/helpers/deploy_solana.go @@ -6,6 +6,7 @@ import ( "time" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" @@ -15,7 +16,6 @@ import ( mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" mcmsTypes "github.com/smartcontractkit/mcms/types" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -88,7 +88,7 @@ func BuildProposalsForTxns( batches := make([]mcmsTypes.BatchOperation, 0) chain := e.BlockChains.SolanaChains()[chainSelector] addresses := e.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(chainSelector)) - mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolanaV2(addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainStateV2(addresses) timelocks[chainSelector] = mcmsSolana.ContractAddress( mcmState.TimelockProgram, @@ -115,10 +115,10 @@ func BuildProposalsForTxns( } func FetchTimelockSigner(refs []datastore.AddressRef) (solana.PublicKey, error) { - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolanaV2(refs) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainStateV2(refs) if err != nil { return solana.PublicKey{}, fmt.Errorf("failed to load mcm state: %w", err) } - timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) return timelockSignerPDA, nil } diff --git a/deployment/internal/soltestutils/datastore.go b/deployment/internal/soltestutils/datastore.go index 218ec583c31..da99972c9e2 100644 --- a/deployment/internal/soltestutils/datastore.go +++ b/deployment/internal/soltestutils/datastore.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/Masterminds/semver/v3" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/stretchr/testify/require" cldfsolana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" @@ -11,7 +12,6 @@ import ( cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" ) @@ -70,13 +70,13 @@ func PreloadAddressBookWithMCMSPrograms(t *testing.T, selector uint64) *cldf.Add // GetMCMSStateFromAddressBook retrieves the state of the Solana MCMS contracts on the given chain. func GetMCMSStateFromAddressBook( t *testing.T, ab cldf.AddressBook, chain cldfsolana.Chain, -) *state.MCMSWithTimelockStateSolana { +) *solstate.MCMSWithTimelockState { t.Helper() addresses, err := ab.AddressesForChain(chain.Selector) require.NoError(t, err) - mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + mcmState, err := solstate.MaybeLoadMCMSWithTimelockChainState(chain, addresses) require.NoError(t, err) return mcmState diff --git a/deployment/internal/soltestutils/fund.go b/deployment/internal/soltestutils/fund.go index 6b67035922f..3d4c9a7d5f7 100644 --- a/deployment/internal/soltestutils/fund.go +++ b/deployment/internal/soltestutils/fund.go @@ -4,22 +4,22 @@ import ( "testing" "github.com/gagliardetto/solana-go" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/stretchr/testify/require" cldfsolana "github.com/smartcontractkit/chainlink-deployments-framework/chain/solana" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/utils/solutils" ) // FundSignerPDAs funds the timelock signer and MCMS signer PDAs with 1 SOL for testing func FundSignerPDAs( - t *testing.T, chain cldfsolana.Chain, mcmsState *state.MCMSWithTimelockStateSolana, + t *testing.T, chain cldfsolana.Chain, mcmsState *solstate.MCMSWithTimelockState, ) { t.Helper() - timelockSignerPDA := state.GetTimelockSignerPDA(mcmsState.TimelockProgram, mcmsState.TimelockSeed) - mcmSignerPDA := state.GetMCMSignerPDA(mcmsState.McmProgram, mcmsState.ProposerMcmSeed) + timelockSignerPDA := solstate.GetTimelockSignerPDA(mcmsState.TimelockProgram, mcmsState.TimelockSeed) + mcmSignerPDA := solstate.GetMCMSignerPDA(mcmsState.McmProgram, mcmsState.ProposerMcmSeed) signerPDAs := []solana.PublicKey{timelockSignerPDA, mcmSignerPDA} err := solutils.FundAccounts(t.Context(), chain.Client, signerPDAs, 1) require.NoError(t, err) diff --git a/deployment/keystone/changeset/solana/deploy_forwarder.go b/deployment/keystone/changeset/solana/deploy_forwarder.go index 211a08a063d..78eadbd27a5 100644 --- a/deployment/keystone/changeset/solana/deploy_forwarder.go +++ b/deployment/keystone/changeset/solana/deploy_forwarder.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/gagliardetto/solana-go" chainsel "github.com/smartcontractkit/chain-selectors" + solstate "github.com/smartcontractkit/cld-changesets/pkg/family/solana" "github.com/smartcontractkit/mcms" "github.com/smartcontractkit/mcms/sdk" mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" @@ -19,7 +20,7 @@ import ( cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment" "github.com/smartcontractkit/chainlink-deployments-framework/operations" capabilities_registry "github.com/smartcontractkit/chainlink-evm/gethwrappers/keystone/generated/capabilities_registry_1_1_0" - commonstate "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/helpers" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" @@ -243,7 +244,7 @@ func (cs ConfigureForwarders) VerifyPreconditions(env cldf.Environment, req *Con return fmt.Errorf("failed get fowarder for chain selector %d: %w", sel, err) } if req.MCMS != nil { - _, err = commonstate.MaybeLoadMCMSWithTimelockChainStateSolanaV2(env.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(sel))) + _, err = solstate.MaybeLoadMCMSWithTimelockChainStateV2(env.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(sel))) if err != nil { return fmt.Errorf("failed to load MCMS for chain selector %d: %w", sel, err) } @@ -292,7 +293,7 @@ func (cs ConfigureForwarders) Apply(env cldf.Environment, req *ConfigureForwarde solChain := env.BlockChains.SolanaChains()[chainSel] addresses := env.DataStore.Addresses().Filter(datastore.AddressRefByChainSelector(chainSel)) - mcmState, _ := commonstate.MaybeLoadMCMSWithTimelockChainStateSolanaV2(addresses) + mcmState, _ := solstate.MaybeLoadMCMSWithTimelockChainStateV2(addresses) if mcmState.TimelockProgram.IsZero() { return cldf.ChangesetOutput{}, errors.New("timelock is not found") }