From 68ec83ab50688723e0b70e91fe4a3d5256ea5ccb Mon Sep 17 00:00:00 2001 From: arturrez <56270896+arturrez@users.noreply.github.com> Date: Thu, 21 Nov 2024 08:42:53 -0800 Subject: [PATCH] Acp77 init validator manager (#2349) * replace initPoAValidatormanager and initPoSValidatorManager with single initValidatorManager cmd * lint --- cmd/blockchaincmd/deploy.go | 2 +- cmd/contractcmd/contract.go | 6 +- cmd/contractcmd/init_poa_validator_manager.go | 168 ------------- cmd/contractcmd/init_pos_validator_manager.go | 203 ---------------- cmd/contractcmd/init_validator_manager.go | 220 ++++++++++++++++++ tests/e2e/commands/etna.go | 7 +- .../subnet/sov/addRemoveValidatorPoA/suite.go | 1 - .../subnet/sov/addRemoveValidatorPoS/suite.go | 1 - tests/e2e/testcases/subnet/sov/etna/suite.go | 14 +- 9 files changed, 231 insertions(+), 391 deletions(-) delete mode 100644 cmd/contractcmd/init_poa_validator_manager.go delete mode 100644 cmd/contractcmd/init_pos_validator_manager.go create mode 100644 cmd/contractcmd/init_validator_manager.go diff --git a/cmd/blockchaincmd/deploy.go b/cmd/blockchaincmd/deploy.go index 6c2777f94..e2bafbfd6 100644 --- a/cmd/blockchaincmd/deploy.go +++ b/cmd/blockchaincmd/deploy.go @@ -967,7 +967,7 @@ func deployBlockchain(cmd *cobra.Command, args []string) error { ux.Logger.GreenCheckmarkToUser("Converted subnet successfully generated") ux.Logger.PrintToUser("To finish conversion to sovereign L1, create the corresponding Avalanche node(s) with the provided Node ID and BLS Info") ux.Logger.PrintToUser("Created Node ID and BLS Info can be found at %s", app.GetSidecarPath(blockchainName)) - ux.Logger.PrintToUser("Once the Avalanche Node(s) are created and are tracking the blockchain, call `avalanche contract initPoaManager %s` to finish conversion to sovereign L1", blockchainName) + ux.Logger.PrintToUser("Once the Avalanche Node(s) are created and are tracking the blockchain, call `avalanche contract initValidatorManager %s` to finish conversion to sovereign L1", blockchainName) } } else { if err := app.UpdateSidecarNetworks(&sidecar, network, subnetID, blockchainID, "", "", nil, clusterNameFlagValue); err != nil { diff --git a/cmd/contractcmd/contract.go b/cmd/contractcmd/contract.go index 48232dade..471355d56 100644 --- a/cmd/contractcmd/contract.go +++ b/cmd/contractcmd/contract.go @@ -22,9 +22,7 @@ and interacting with smart contracts.`, app = injectedApp // contract deploy cmd.AddCommand(newDeployCmd()) - // contract initpoamanager - cmd.AddCommand(newInitPOAManagerCmd()) - // contract initposmanager - cmd.AddCommand(newInitPOSManagerCmd()) + // contract initValidatorManager + cmd.AddCommand(newInitValidatorManagerCmd()) return cmd } diff --git a/cmd/contractcmd/init_poa_validator_manager.go b/cmd/contractcmd/init_poa_validator_manager.go deleted file mode 100644 index d3e3d125e..000000000 --- a/cmd/contractcmd/init_poa_validator_manager.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright (C) 2024, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. -package contractcmd - -import ( - "fmt" - - "github.com/ava-labs/avalanche-cli/cmd/blockchaincmd" - "github.com/ava-labs/avalanche-cli/pkg/cobrautils" - "github.com/ava-labs/avalanche-cli/pkg/contract" - "github.com/ava-labs/avalanche-cli/pkg/models" - "github.com/ava-labs/avalanche-cli/pkg/networkoptions" - "github.com/ava-labs/avalanche-cli/pkg/prompts" - "github.com/ava-labs/avalanche-cli/pkg/ux" - "github.com/ava-labs/avalanche-cli/pkg/validatormanager" - blockchainSDK "github.com/ava-labs/avalanche-cli/sdk/blockchain" - "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/logging" - "github.com/ethereum/go-ethereum/common" - "github.com/spf13/cobra" -) - -type InitPOAManagerFlags struct { - Network networkoptions.NetworkFlags - PrivateKeyFlags contract.PrivateKeyFlags - rpcEndpoint string - aggregatorLogLevel string - aggregatorExtraEndpoints []string -} - -var ( - initPOAManagerSupportedNetworkOptions = []networkoptions.NetworkOption{ - networkoptions.Local, - networkoptions.Devnet, - networkoptions.EtnaDevnet, - networkoptions.Fuji, - } - initPOAManagerFlags InitPOAManagerFlags -) - -// avalanche contract initpoamanager -func newInitPOAManagerCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "initPoaManager blockchainName", - Short: "Initializes a Proof of Authority Validator Manager on a given Network and Blockchain", - Long: "Initializes Proof of Authority Validator Manager contract on a Blockchain and sets up initial validator set on the Blockchain. For more info on Validator Manager, please head to https://github.com/ava-labs/teleporter/tree/staking-contract/contracts/validator-manager", - RunE: initPOAManager, - Args: cobrautils.ExactArgs(1), - } - networkoptions.AddNetworkFlagsToCmd(cmd, &initPOAManagerFlags.Network, true, initPOAManagerSupportedNetworkOptions) - initPOAManagerFlags.PrivateKeyFlags.AddToCmd(cmd, "as contract deployer") - cmd.Flags().StringVar(&initPOAManagerFlags.rpcEndpoint, "rpc", "", "deploy the contract into the given rpc endpoint") - cmd.Flags().StringSliceVar(&initPOAManagerFlags.aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") - cmd.Flags().StringVar(&initPOAManagerFlags.aggregatorLogLevel, "aggregator-log-level", "Off", "log level to use with signature aggregator") - return cmd -} - -func initPOAManager(_ *cobra.Command, args []string) error { - blockchainName := args[0] - chainSpec := contract.ChainSpec{ - BlockchainName: blockchainName, - } - network, err := networkoptions.GetNetworkFromCmdLineFlags( - app, - "", - initPOAManagerFlags.Network, - true, - false, - initPOAManagerSupportedNetworkOptions, - "", - ) - if err != nil { - return err - } - if network.ClusterName != "" { - network = models.ConvertClusterToNetwork(network) - } - if initPOAManagerFlags.rpcEndpoint == "" { - initPOAManagerFlags.rpcEndpoint, _, err = contract.GetBlockchainEndpoints( - app, - network, - chainSpec, - true, - false, - ) - if err != nil { - return err - } - } - ux.Logger.PrintToUser(logging.Yellow.Wrap("RPC Endpoint: %s"), initPOAManagerFlags.rpcEndpoint) - genesisAddress, genesisPrivateKey, err := contract.GetEVMSubnetPrefundedKey( - app, - network, - chainSpec, - ) - if err != nil { - return err - } - privateKey, err := initPOAManagerFlags.PrivateKeyFlags.GetPrivateKey(app, genesisPrivateKey) - if err != nil { - return err - } - if privateKey == "" { - privateKey, err = prompts.PromptPrivateKey( - app.Prompt, - "pay for initializing Proof of Authority Validator Manager contract? (Uses Blockchain gas token)", - app.GetKeyDir(), - app.GetKey, - genesisAddress, - genesisPrivateKey, - ) - if err != nil { - return err - } - } - sc, err := app.LoadSidecar(chainSpec.BlockchainName) - if err != nil { - return fmt.Errorf("failed to load sidecar: %w", err) - } - if sc.Networks[network.Name()].BlockchainID == ids.Empty { - return fmt.Errorf("blockchain has not been deployed to %s", network.Name()) - } - bootstrapValidators := sc.Networks[network.Name()].BootstrapValidators - avaGoBootstrapValidators, err := blockchaincmd.ConvertToAvalancheGoSubnetValidator(bootstrapValidators) - if err != nil { - return err - } - clusterName := sc.Networks[network.Name()].ClusterName - extraAggregatorPeers, err := blockchaincmd.GetAggregatorExtraPeers(clusterName, initPOAManagerFlags.aggregatorExtraEndpoints) - if err != nil { - return err - } - subnetID, err := contract.GetSubnetID( - app, - network, - chainSpec, - ) - if err != nil { - return err - } - blockchainID, err := contract.GetBlockchainID( - app, - network, - chainSpec, - ) - if err != nil { - return err - } - ownerAddress := common.HexToAddress(sc.ProxyContractOwner) - subnetSDK := blockchainSDK.Subnet{ - SubnetID: subnetID, - BlockchainID: blockchainID, - BootstrapValidators: avaGoBootstrapValidators, - OwnerAddress: &ownerAddress, - RPC: initPOAManagerFlags.rpcEndpoint, - } - if err := validatormanager.SetupPoA( - subnetSDK, - network, - privateKey, - extraAggregatorPeers, - initPOAManagerFlags.aggregatorLogLevel, - ); err != nil { - return err - } - ux.Logger.GreenCheckmarkToUser("Proof of Authority Validator Manager contract successfully initialized on blockchain %s", blockchainName) - return nil -} diff --git a/cmd/contractcmd/init_pos_validator_manager.go b/cmd/contractcmd/init_pos_validator_manager.go deleted file mode 100644 index 8478bd211..000000000 --- a/cmd/contractcmd/init_pos_validator_manager.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (C) 2024, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. -package contractcmd - -import ( - "fmt" - "math/big" - - "github.com/ava-labs/avalanche-cli/cmd/blockchaincmd" - "github.com/ava-labs/avalanche-cli/pkg/cobrautils" - "github.com/ava-labs/avalanche-cli/pkg/contract" - "github.com/ava-labs/avalanche-cli/pkg/models" - "github.com/ava-labs/avalanche-cli/pkg/networkoptions" - "github.com/ava-labs/avalanche-cli/pkg/prompts" - "github.com/ava-labs/avalanche-cli/pkg/ux" - "github.com/ava-labs/avalanche-cli/pkg/validatormanager" - blockchainSDK "github.com/ava-labs/avalanche-cli/sdk/blockchain" - validatorManagerSDK "github.com/ava-labs/avalanche-cli/sdk/validatormanager" - "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/logging" - "github.com/ethereum/go-ethereum/common" - - "github.com/spf13/cobra" -) - -type InitPOSManagerFlags struct { - Network networkoptions.NetworkFlags - PrivateKeyFlags contract.PrivateKeyFlags - rpcEndpoint string - rewardCalculatorAddress string - aggregatorLogLevel string - aggregatorExtraEndpoints []string - minimumStakeAmount uint64 // big.Int - maximumStakeAmount uint64 // big.Int - minimumStakeDuration uint64 - minimumDelegationFee uint16 - maximumStakeMultiplier uint8 - weightToValueFactor uint64 // big.Int -} - -var ( - initPOSManagerSupportedNetworkOptions = []networkoptions.NetworkOption{ - networkoptions.Local, - networkoptions.Devnet, - networkoptions.EtnaDevnet, - networkoptions.Fuji, - } - initPOSManagerFlags InitPOSManagerFlags -) - -// avalanche contract initposmanager -func newInitPOSManagerCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "initPosManager blockchainName", - Short: "Initializes a Native Proof of Stake Validator Manager on a given Network and Blockchain", - Long: "Initializes the Native Proof of Stake Validator Manager contract on a Blockchain and sets up initial validator set on the Blockchain. For more info on Validator Manager, please head to https://github.com/ava-labs/teleporter/tree/staking-contract/contracts/validator-manager", - RunE: initPOSManager, - Args: cobrautils.ExactArgs(1), - } - networkoptions.AddNetworkFlagsToCmd(cmd, &initPOSManagerFlags.Network, true, initPOSManagerSupportedNetworkOptions) - initPOSManagerFlags.PrivateKeyFlags.AddToCmd(cmd, "as contract deployer") - cmd.Flags().StringVar(&initPOSManagerFlags.rpcEndpoint, "rpc", "", "deploy the contract into the given rpc endpoint") - cmd.Flags().StringVar(&initPOSManagerFlags.rewardCalculatorAddress, "reward-calculator-address", "", "initialize the ValidatorManager with reward calculator address") - cmd.Flags().StringSliceVar(&initPOSManagerFlags.aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") - cmd.Flags().StringVar(&initPOSManagerFlags.aggregatorLogLevel, "aggregator-log-level", "Off", "log level to use with signature aggregator") - - cmd.Flags().Uint64Var(&initPOSManagerFlags.minimumStakeAmount, "pos-minimum-stake-amount", 1, "(PoS only) minimum stake amount") - cmd.Flags().Uint64Var(&initPOSManagerFlags.maximumStakeAmount, "pos-maximum-stake-amount", 1000, "(PoS only) maximum stake amount") - cmd.Flags().Uint64Var(&initPOSManagerFlags.minimumStakeDuration, "pos-minimum-stake-duration", 100, "(PoS only) minimum stake duration") - cmd.Flags().Uint16Var(&initPOSManagerFlags.minimumDelegationFee, "pos-minimum-delegation-fee", 1, "(PoS only) minimum delegation fee") - cmd.Flags().Uint8Var(&initPOSManagerFlags.maximumStakeMultiplier, "pos-maximum-stake-multiplier", 1, "(PoS only )maximum stake multiplier") - cmd.Flags().Uint64Var(&initPOSManagerFlags.weightToValueFactor, "pos-weight-to-value-factor", 1, "(PoS only) weight to value factor") - return cmd -} - -func initPOSManager(_ *cobra.Command, args []string) error { - blockchainName := args[0] - chainSpec := contract.ChainSpec{ - BlockchainName: blockchainName, - } - network, err := networkoptions.GetNetworkFromCmdLineFlags( - app, - "", - initPOSManagerFlags.Network, - true, - false, - initPOSManagerSupportedNetworkOptions, - "", - ) - if err != nil { - return err - } - if network.ClusterName != "" { - network = models.ConvertClusterToNetwork(network) - } - - if initPOSManagerFlags.rpcEndpoint == "" { - initPOSManagerFlags.rpcEndpoint, _, err = contract.GetBlockchainEndpoints( - app, - network, - chainSpec, - true, - false, - ) - if err != nil { - return err - } - } - ux.Logger.PrintToUser(logging.Yellow.Wrap("RPC Endpoint: %s"), initPOSManagerFlags.rpcEndpoint) - genesisAddress, genesisPrivateKey, err := contract.GetEVMSubnetPrefundedKey( - app, - network, - chainSpec, - ) - if err != nil { - return err - } - privateKey, err := initPOSManagerFlags.PrivateKeyFlags.GetPrivateKey(app, genesisPrivateKey) - if err != nil { - return err - } - if privateKey == "" { - privateKey, err = prompts.PromptPrivateKey( - app.Prompt, - "pay for initializing Proof of Stake Validator Manager contract? (Uses Blockchain gas token)", - app.GetKeyDir(), - app.GetKey, - genesisAddress, - genesisPrivateKey, - ) - if err != nil { - return err - } - } - sc, err := app.LoadSidecar(chainSpec.BlockchainName) - if err != nil { - return fmt.Errorf("failed to load sidecar: %w", err) - } - if sc.Networks[network.Name()].BlockchainID == ids.Empty { - return fmt.Errorf("blockchain has not been deployed to %s", network.Name()) - } - bootstrapValidators := sc.Networks[network.Name()].BootstrapValidators - if len(bootstrapValidators) == 0 { - return fmt.Errorf("no bootstrap validators found for blockchain %s", blockchainName) - } - avaGoBootstrapValidators, err := blockchaincmd.ConvertToAvalancheGoSubnetValidator(bootstrapValidators) - if err != nil { - return err - } - clusterName := sc.Networks[network.Name()].ClusterName - extraAggregatorPeers, err := blockchaincmd.GetAggregatorExtraPeers(clusterName, initPOAManagerFlags.aggregatorExtraEndpoints) - if err != nil { - return err - } - if initPOSManagerFlags.rewardCalculatorAddress == "" { - initPOSManagerFlags.rewardCalculatorAddress = validatorManagerSDK.RewardCalculatorAddress - } - subnetID, err := contract.GetSubnetID( - app, - network, - chainSpec, - ) - if err != nil { - return err - } - blockchainID, err := contract.GetBlockchainID( - app, - network, - chainSpec, - ) - if err != nil { - return err - } - ownerAddress := common.HexToAddress(sc.ProxyContractOwner) - subnetSDK := blockchainSDK.Subnet{ - SubnetID: subnetID, - BlockchainID: blockchainID, - BootstrapValidators: avaGoBootstrapValidators, - OwnerAddress: &ownerAddress, - RPC: initPOSManagerFlags.rpcEndpoint, - } - ux.Logger.PrintToUser("Initializing native token Proof of Stake Validator Manager contract on blockchain %s", subnetSDK.RPC) - if err := validatormanager.SetupPoS( - subnetSDK, - network, - privateKey, - extraAggregatorPeers, - initPOSManagerFlags.aggregatorLogLevel, - validatorManagerSDK.PoSParams{ - MinimumStakeAmount: big.NewInt(int64(initPOSManagerFlags.minimumStakeAmount)), - MaximumStakeAmount: big.NewInt(int64(initPOSManagerFlags.maximumStakeAmount)), - MinimumStakeDuration: initPOSManagerFlags.minimumStakeDuration, - MinimumDelegationFee: initPOSManagerFlags.minimumDelegationFee, - MaximumStakeMultiplier: initPOSManagerFlags.maximumStakeMultiplier, - WeightToValueFactor: big.NewInt(int64(initPOSManagerFlags.weightToValueFactor)), - RewardCalculatorAddress: initPOSManagerFlags.rewardCalculatorAddress, - }, - ); err != nil { - return err - } - ux.Logger.GreenCheckmarkToUser("Native Token Proof of Stake Validator Manager contract successfully initialized on blockchain %s", blockchainName) - return nil -} diff --git a/cmd/contractcmd/init_validator_manager.go b/cmd/contractcmd/init_validator_manager.go new file mode 100644 index 000000000..0f6308a8b --- /dev/null +++ b/cmd/contractcmd/init_validator_manager.go @@ -0,0 +1,220 @@ +// Copyright (C) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. +package contractcmd + +import ( + "fmt" + "math/big" + + "github.com/ava-labs/avalanche-cli/cmd/blockchaincmd" + "github.com/ava-labs/avalanche-cli/pkg/cobrautils" + "github.com/ava-labs/avalanche-cli/pkg/contract" + "github.com/ava-labs/avalanche-cli/pkg/models" + "github.com/ava-labs/avalanche-cli/pkg/networkoptions" + "github.com/ava-labs/avalanche-cli/pkg/prompts" + "github.com/ava-labs/avalanche-cli/pkg/ux" + "github.com/ava-labs/avalanche-cli/pkg/validatormanager" + blockchainSDK "github.com/ava-labs/avalanche-cli/sdk/blockchain" + validatorManagerSDK "github.com/ava-labs/avalanche-cli/sdk/validatormanager" + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/logging" + "github.com/ethereum/go-ethereum/common" + "github.com/spf13/cobra" +) + +type ValidatorManagerFlags struct { + Network networkoptions.NetworkFlags + PrivateKeyFlags contract.PrivateKeyFlags + rpcEndpoint string + aggregatorLogLevel string + aggregatorExtraEndpoints []string +} + +type POSManagerSpecFlags struct { + rewardCalculatorAddress string + minimumStakeAmount uint64 // big.Int + maximumStakeAmount uint64 // big.Int + minimumStakeDuration uint64 + minimumDelegationFee uint16 + maximumStakeMultiplier uint8 + weightToValueFactor uint64 // big.Int +} + +var ( + validatorManagerSupportedNetworkOptions = []networkoptions.NetworkOption{ + networkoptions.Local, + networkoptions.Devnet, + networkoptions.EtnaDevnet, + networkoptions.Fuji, + } + validatorManagerFlags ValidatorManagerFlags + initPOSManagerFlags POSManagerSpecFlags +) + +// avalanche contract initValidatorManager +func newInitValidatorManagerCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "initValidatorManager blockchainName", + Short: "Initializes Proof of Authority(PoA) or Proof of Stake(PoS) Validator Manager on a given Network and Blockchain", + Long: "Initializes Proof of Authority(PoA) or Proof of Stake(PoS)Validator Manager contract on a Blockchain and sets up initial validator set on the Blockchain. For more info on Validator Manager, please head to https://github.com/ava-labs/teleporter/tree/staking-contract/contracts/validator-manager", + RunE: initValidatorManager, + Args: cobrautils.ExactArgs(1), + } + networkoptions.AddNetworkFlagsToCmd(cmd, &validatorManagerFlags.Network, true, validatorManagerSupportedNetworkOptions) + validatorManagerFlags.PrivateKeyFlags.AddToCmd(cmd, "as contract deployer") + cmd.Flags().StringVar(&validatorManagerFlags.rpcEndpoint, "rpc", "", "deploy the contract into the given rpc endpoint") + cmd.Flags().StringSliceVar(&validatorManagerFlags.aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") + cmd.Flags().StringVar(&validatorManagerFlags.aggregatorLogLevel, "aggregator-log-level", "Off", "log level to use with signature aggregator") + + cmd.Flags().StringVar(&initPOSManagerFlags.rewardCalculatorAddress, "pos-reward-calculator-address", "", "(PoS only) initialize the ValidatorManager with reward calculator address") + cmd.Flags().Uint64Var(&initPOSManagerFlags.minimumStakeAmount, "pos-minimum-stake-amount", 1, "(PoS only) minimum stake amount") + cmd.Flags().Uint64Var(&initPOSManagerFlags.maximumStakeAmount, "pos-maximum-stake-amount", 1000, "(PoS only) maximum stake amount") + cmd.Flags().Uint64Var(&initPOSManagerFlags.minimumStakeDuration, "pos-minimum-stake-duration", 100, "(PoS only) minimum stake duration") + cmd.Flags().Uint16Var(&initPOSManagerFlags.minimumDelegationFee, "pos-minimum-delegation-fee", 1, "(PoS only) minimum delegation fee") + cmd.Flags().Uint8Var(&initPOSManagerFlags.maximumStakeMultiplier, "pos-maximum-stake-multiplier", 1, "(PoS only )maximum stake multiplier") + cmd.Flags().Uint64Var(&initPOSManagerFlags.weightToValueFactor, "pos-weight-to-value-factor", 1, "(PoS only) weight to value factor") + return cmd +} + +func initValidatorManager(_ *cobra.Command, args []string) error { + blockchainName := args[0] + chainSpec := contract.ChainSpec{ + BlockchainName: blockchainName, + } + network, err := networkoptions.GetNetworkFromCmdLineFlags( + app, + "", + validatorManagerFlags.Network, + true, + false, + validatorManagerSupportedNetworkOptions, + "", + ) + if err != nil { + return err + } + if network.ClusterName != "" { + network = models.ConvertClusterToNetwork(network) + } + if validatorManagerFlags.rpcEndpoint == "" { + validatorManagerFlags.rpcEndpoint, _, err = contract.GetBlockchainEndpoints( + app, + network, + chainSpec, + true, + false, + ) + if err != nil { + return err + } + } + ux.Logger.PrintToUser(logging.Yellow.Wrap("RPC Endpoint: %s"), validatorManagerFlags.rpcEndpoint) + genesisAddress, genesisPrivateKey, err := contract.GetEVMSubnetPrefundedKey( + app, + network, + chainSpec, + ) + if err != nil { + return err + } + privateKey, err := validatorManagerFlags.PrivateKeyFlags.GetPrivateKey(app, genesisPrivateKey) + if err != nil { + return err + } + if privateKey == "" { + privateKey, err = prompts.PromptPrivateKey( + app.Prompt, + "pay for initializing Proof of Authority Validator Manager contract? (Uses Blockchain gas token)", + app.GetKeyDir(), + app.GetKey, + genesisAddress, + genesisPrivateKey, + ) + if err != nil { + return err + } + } + sc, err := app.LoadSidecar(chainSpec.BlockchainName) + if err != nil { + return fmt.Errorf("failed to load sidecar: %w", err) + } + scNetwork := sc.Networks[network.Name()] + if scNetwork.BlockchainID == ids.Empty { + return fmt.Errorf("blockchain has not been deployed to %s", network.Name()) + } + bootstrapValidators := scNetwork.BootstrapValidators + avaGoBootstrapValidators, err := blockchaincmd.ConvertToAvalancheGoSubnetValidator(bootstrapValidators) + if err != nil { + return err + } + clusterName := scNetwork.ClusterName + extraAggregatorPeers, err := blockchaincmd.GetAggregatorExtraPeers(clusterName, validatorManagerFlags.aggregatorExtraEndpoints) + if err != nil { + return err + } + subnetID, err := contract.GetSubnetID( + app, + network, + chainSpec, + ) + if err != nil { + return err + } + blockchainID, err := contract.GetBlockchainID( + app, + network, + chainSpec, + ) + if err != nil { + return err + } + ownerAddress := common.HexToAddress(sc.ProxyContractOwner) + subnetSDK := blockchainSDK.Subnet{ + SubnetID: subnetID, + BlockchainID: blockchainID, + BootstrapValidators: avaGoBootstrapValidators, + OwnerAddress: &ownerAddress, + RPC: validatorManagerFlags.rpcEndpoint, + } + switch { + case sc.PoA(): // PoA + ux.Logger.PrintToUser(logging.Yellow.Wrap("Initializing Proof of Authority Validator Manager contract on blockchain %s"), blockchainName) + if err := validatormanager.SetupPoA( + subnetSDK, + network, + privateKey, + extraAggregatorPeers, + validatorManagerFlags.aggregatorLogLevel, + ); err != nil { + return err + } + ux.Logger.GreenCheckmarkToUser("Proof of Authority Validator Manager contract successfully initialized on blockchain %s", blockchainName) + case sc.PoS(): // PoS + ux.Logger.PrintToUser(logging.Yellow.Wrap("Initializing Proof of Stake Validator Manager contract on blockchain %s"), blockchainName) + if initPOSManagerFlags.rewardCalculatorAddress == "" { + initPOSManagerFlags.rewardCalculatorAddress = validatorManagerSDK.RewardCalculatorAddress + } + if err := validatormanager.SetupPoS( + subnetSDK, + network, + privateKey, + extraAggregatorPeers, + validatorManagerFlags.aggregatorLogLevel, + validatorManagerSDK.PoSParams{ + MinimumStakeAmount: big.NewInt(int64(initPOSManagerFlags.minimumStakeAmount)), + MaximumStakeAmount: big.NewInt(int64(initPOSManagerFlags.maximumStakeAmount)), + MinimumStakeDuration: initPOSManagerFlags.minimumStakeDuration, + MinimumDelegationFee: initPOSManagerFlags.minimumDelegationFee, + MaximumStakeMultiplier: initPOSManagerFlags.maximumStakeMultiplier, + WeightToValueFactor: big.NewInt(int64(initPOSManagerFlags.weightToValueFactor)), + RewardCalculatorAddress: initPOSManagerFlags.rewardCalculatorAddress, + }, + ); err != nil { + return err + } + ux.Logger.GreenCheckmarkToUser("Native Token Proof of Stake Validator Manager contract successfully initialized on blockchain %s", blockchainName) + default: // unsupported + return fmt.Errorf("only PoA and PoS supported") + } + return nil +} diff --git a/tests/e2e/commands/etna.go b/tests/e2e/commands/etna.go index f315e6062..77179b4a1 100644 --- a/tests/e2e/commands/etna.go +++ b/tests/e2e/commands/etna.go @@ -203,16 +203,11 @@ func InitValidatorManager( clusterName string, endpoint string, blockchainID string, - subnetManagementType SubnetManagementType, ) (string, error) { - initManagerString := "initPoaManager" - if subnetManagementType == PoS { - initManagerString = "initPosManager" - } cmd := exec.Command( CLIBinary, "contract", - initManagerString, + "initValidatorManager", subnetName, "--cluster", clusterName, diff --git a/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoA/suite.go b/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoA/suite.go index 260aa2697..82c89929d 100644 --- a/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoA/suite.go +++ b/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoA/suite.go @@ -81,7 +81,6 @@ var _ = ginkgo.Describe("[Etna AddRemove Validator SOV PoA]", func() { testLocalNodeName, "http://127.0.0.1:9650", blockchainID, - commands.PoA, ) gomega.Expect(err).Should(gomega.BeNil()) fmt.Println(output) diff --git a/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoS/suite.go b/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoS/suite.go index a6914ba3c..2a4967e66 100644 --- a/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoS/suite.go +++ b/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoS/suite.go @@ -83,7 +83,6 @@ var _ = ginkgo.Describe("[Etna AddRemove Validator SOV PoS]", func() { testLocalNodeName, "http://127.0.0.1:9650", blockchainID, - commands.PoS, ) gomega.Expect(err).Should(gomega.BeNil()) fmt.Println(output) diff --git a/tests/e2e/testcases/subnet/sov/etna/suite.go b/tests/e2e/testcases/subnet/sov/etna/suite.go index dc85db488..ad85ed3d0 100644 --- a/tests/e2e/testcases/subnet/sov/etna/suite.go +++ b/tests/e2e/testcases/subnet/sov/etna/suite.go @@ -173,14 +173,14 @@ func deployEtnaSubnetClusterFlagConvertOnly(clusterName string) { gomega.Expect(err).Should(gomega.BeNil()) } -func initPoaManagerClusterFlag( +func initValidatorManagerClusterFlag( subnetName string, clusterName string, ) error { cmd := exec.Command( CLIBinary, "contract", - "initPoaManager", + "initValidatorManager", subnetName, "--cluster", clusterName, @@ -197,13 +197,13 @@ func initPoaManagerClusterFlag( return err } -func initPoaManagerEtnaFlag( +func initValidatorManagerEtnaFlag( subnetName string, ) (string, error) { cmd := exec.Command( CLIBinary, "contract", - "initPoaManager", + "initValidatorManager", subnetName, "--etna-devnet", "--genesis-key", @@ -253,7 +253,7 @@ var _ = ginkgo.Describe("[Etna Subnet SOV]", func() { deployEtnaSubnetClusterFlagConvertOnly(testLocalNodeName) _, err = commands.TrackLocalEtnaSubnet(testLocalNodeName, subnetName) gomega.Expect(err).Should(gomega.BeNil()) - err = initPoaManagerClusterFlag(subnetName, testLocalNodeName) + err = initValidatorManagerClusterFlag(subnetName, testLocalNodeName) gomega.Expect(err).Should(gomega.BeNil()) }) @@ -264,7 +264,7 @@ var _ = ginkgo.Describe("[Etna Subnet SOV]", func() { deployEtnaSubnetClusterFlagConvertOnly(testLocalNodeName) _, err = commands.TrackLocalEtnaSubnet(testLocalNodeName, subnetName) gomega.Expect(err).Should(gomega.BeNil()) - _, err = initPoaManagerEtnaFlag(subnetName) + _, err = initValidatorManagerEtnaFlag(subnetName) gomega.Expect(err).Should(gomega.BeNil()) }) ginkgo.It("Mix and match network and cluster flags test 2", func() { @@ -272,7 +272,7 @@ var _ = ginkgo.Describe("[Etna Subnet SOV]", func() { deployEtnaSubnetEtnaFlagConvertOnly() _, err := commands.TrackLocalEtnaSubnet(testLocalNodeName, subnetName) gomega.Expect(err).Should(gomega.BeNil()) - err = initPoaManagerClusterFlag(subnetName, testLocalNodeName) + err = initValidatorManagerClusterFlag(subnetName, testLocalNodeName) gomega.Expect(err).Should(gomega.BeNil()) }) })