Skip to content
Merged
20 changes: 20 additions & 0 deletions cmd/blockchaincmd/add_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ var (
pop string
remainingBalanceOwnerAddr string
disableOwnerAddr string
rewardsRecipientAddr string
delegationFee uint16
errNoSubnetID = errors.New("failed to find the subnet ID for this subnet, has it been deployed/created on this network?")
errMutuallyExclusiveDurationOptions = errors.New("--use-default-duration/--use-default-validator-params and --staking-period are mutually exclusive")
Expand Down Expand Up @@ -114,6 +115,9 @@ Testnet or Mainnet.`,
cmd.Flags().StringVar(&pop, "bls-proof-of-possession", "", "set the BLS proof of possession of the validator to add")
cmd.Flags().StringVar(&remainingBalanceOwnerAddr, "remaining-balance-owner", "", "P-Chain address that will receive any leftover AVAX from the validator when it is removed from Subnet")
cmd.Flags().StringVar(&disableOwnerAddr, "disable-owner", "", "P-Chain address that will able to disable the validator with a P-Chain transaction")
cmd.Flags().StringVar(&rewardsRecipientAddr, "rewards-recipient", "", "EVM address that will receive the validation rewards")
cmd.Flags().BoolVar(&createLocalValidator, "create-local-validator", false, "create additional local validator and add it to existing running local node")
cmd.Flags().BoolVar(&partialSync, "partial-sync", true, "set primary network partial sync for new validators")
cmd.Flags().StringVar(&nodeEndpoint, "node-endpoint", "", "gather node id/bls from publicly available avalanchego apis on the given endpoint")
cmd.Flags().Uint64Var(&weight, validatorWeightFlag, uint64(constants.DefaultStakeWeight), "set the weight of the validator")
cmd.Flags().StringVar(&validatorManagerOwner, "validator-manager-owner", "", "force using this address to issue transactions to the validator manager")
Expand Down Expand Up @@ -441,6 +445,21 @@ func CallAddValidator(
return nil
}
}
if rewardsRecipientAddr == "" {
rewardsRecipientAddr, err = prompts.PromptAddress(
app.Prompt,
"receive the validation rewards",
app.GetKeyDir(),
app.GetKey,
"",
network,
prompts.EVMFormat,
"Address",
)
if err != nil {
return err
}
}
}

if sc.UseACP99 {
Expand Down Expand Up @@ -563,6 +582,7 @@ func CallAddValidator(
pos,
delegationFee,
duration,
common.HexToAddress(rewardsRecipientAddr),
validatorManagerAddress,
sc.UseACP99,
initiateTxHash,
Expand Down
78 changes: 62 additions & 16 deletions cmd/blockchaincmd/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@ import (
"os"
"time"

"github.com/ava-labs/avalanche-cli/pkg/dependencies"

"github.com/ava-labs/avalanche-cli/cmd/flags"
"github.com/ava-labs/avalanche-cli/pkg/blockchain"
"github.com/ava-labs/avalanche-cli/pkg/cobrautils"
"github.com/ava-labs/avalanche-cli/pkg/constants"
"github.com/ava-labs/avalanche-cli/pkg/contract"
"github.com/ava-labs/avalanche-cli/pkg/dependencies"
"github.com/ava-labs/avalanche-cli/pkg/keychain"
"github.com/ava-labs/avalanche-cli/pkg/localnet"
"github.com/ava-labs/avalanche-cli/pkg/models"
Expand All @@ -30,7 +29,7 @@ import (
blockchainSDK "github.com/ava-labs/avalanche-cli/sdk/blockchain"
"github.com/ava-labs/avalanche-cli/sdk/evm"
sdkutils "github.com/ava-labs/avalanche-cli/sdk/utils"
validatorManagerSDK "github.com/ava-labs/avalanche-cli/sdk/validatormanager"
validatormanagerSDK "github.com/ava-labs/avalanche-cli/sdk/validatormanager"
"github.com/ava-labs/avalanche-cli/sdk/validatormanager/validatormanagertypes"
"github.com/ava-labs/avalanchego/config"
"github.com/ava-labs/avalanchego/ids"
Expand Down Expand Up @@ -259,7 +258,7 @@ func InitializeValidatorManager(
network models.Network,
avaGoBootstrapValidators []*txs.ConvertSubnetToL1Validator,
pos bool,
validatorManagerAddrStr string,
managerAddress string,
proxyContractOwner string,
useACP99 bool,
useLocalMachine bool,
Expand Down Expand Up @@ -328,8 +327,10 @@ func InitializeValidatorManager(
return tracked, err
}

ownerAddress := common.HexToAddress(validatorManagerOwner)

if pos {
deployed, err := validatormanager.ProxyHasValidatorManagerSet(rpcURL)
deployed, err := validatormanager.ValidatorProxyHasImplementationSet(rpcURL)
if err != nil {
return tracked, err
}
Expand All @@ -345,12 +346,31 @@ func InitializeValidatorManager(
if err != nil {
return tracked, err
}
if _, err := validatormanager.DeployAndRegisterPoSValidatorManagerContrac(
rpcURL,
genesisPrivateKey,
proxyOwnerPrivateKey,
); err != nil {
return tracked, err
if useACP99 {
_, err := validatormanager.DeployAndRegisterValidatorManagerV2_0_0Contract(
rpcURL,
genesisPrivateKey,
proxyOwnerPrivateKey,
)
if err != nil {
return tracked, err
}
_, err = validatormanager.DeployAndRegisterPoSValidatorManagerV2_0_0Contract(
rpcURL,
genesisPrivateKey,
proxyOwnerPrivateKey,
)
if err != nil {
return tracked, err
}
} else {
if _, err := validatormanager.DeployAndRegisterPoSValidatorManagerV1_0_0Contract(
rpcURL,
genesisPrivateKey,
proxyOwnerPrivateKey,
); err != nil {
return tracked, err
}
}
}
}
Expand All @@ -360,7 +380,6 @@ func InitializeValidatorManager(
return tracked, err
}

ownerAddress := common.HexToAddress(validatorManagerOwner)
subnetSDK := blockchainSDK.Subnet{
SubnetID: subnetID,
BlockchainID: blockchainID,
Expand All @@ -380,24 +399,39 @@ func InitializeValidatorManager(
defer aggregatorCancel()
if pos {
ux.Logger.PrintToUser("Initializing Native Token Proof of Stake Validator Manager contract on blockchain %s ...", blockchainName)
found, _, _, managerOwnerPrivateKey, err := contract.SearchForManagedKey(
app,
network,
ownerAddress,
true,
)
if err != nil {
return tracked, err
}
if !found {
return tracked, fmt.Errorf("could not find validator manager owner private key")
}
if err := subnetSDK.InitializeProofOfStake(
aggregatorCtx,
app.Log,
network.SDKNetwork(),
genesisPrivateKey,
extraAggregatorPeers,
aggregatorLogger,
validatorManagerSDK.PoSParams{
validatormanagerSDK.PoSParams{
MinimumStakeAmount: big.NewInt(int64(proofOfStakeFlags.MinimumStakeAmount)),
MaximumStakeAmount: big.NewInt(int64(proofOfStakeFlags.MaximumStakeAmount)),
MinimumStakeDuration: proofOfStakeFlags.MinimumStakeDuration,
MinimumDelegationFee: proofOfStakeFlags.MinimumDelegationFee,
MaximumStakeMultiplier: proofOfStakeFlags.MaximumStakeMultiplier,
WeightToValueFactor: big.NewInt(int64(proofOfStakeFlags.WeightToValueFactor)),
RewardCalculatorAddress: validatorManagerSDK.RewardCalculatorAddress,
RewardCalculatorAddress: validatormanagerSDK.RewardCalculatorAddress,
UptimeBlockchainID: blockchainID,
},
validatorManagerAddrStr,
managerAddress,
validatormanagerSDK.SpecializationProxyContractAddress,
managerOwnerPrivateKey,
useACP99,
); err != nil {
return tracked, err
}
Expand All @@ -411,7 +445,7 @@ func InitializeValidatorManager(
genesisPrivateKey,
extraAggregatorPeers,
aggregatorLogger,
validatorManagerAddrStr,
managerAddress,
useACP99,
); err != nil {
return tracked, err
Expand Down Expand Up @@ -731,6 +765,18 @@ func convertBlockchain(cmd *cobra.Command, args []string) error {
); err != nil {
return err
}
if sidecar.UseACP99 && sidecar.ValidatorManagement == validatormanagertypes.ProofOfStake {
sidecar, err := app.LoadSidecar(chain)
if err != nil {
return err
}
networkInfo := sidecar.Networks[network.Name()]
networkInfo.ValidatorManagerAddress = validatormanagerSDK.SpecializationProxyContractAddress
sidecar.Networks[network.Name()] = networkInfo
if err := app.UpdateSidecar(&sidecar); err != nil {
return err
}
}
} else {
printSuccessfulConvertOnlyOutput(blockchainName, subnetID.String(), convertFlags.BootstrapValidatorFlags.GenerateNodeID)
}
Expand Down
24 changes: 17 additions & 7 deletions cmd/blockchaincmd/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,15 @@ import (
"os"
"path/filepath"

"github.com/ava-labs/avalanche-cli/pkg/cobrautils"

"github.com/ava-labs/avalanche-cli/pkg/dependencies"
"github.com/spf13/pflag"

"github.com/ava-labs/avalanche-cli/cmd/flags"
"github.com/ava-labs/avalanche-cli/cmd/interchaincmd/messengercmd"
"github.com/ava-labs/avalanche-cli/cmd/interchaincmd/relayercmd"
"github.com/ava-labs/avalanche-cli/cmd/networkcmd"
"github.com/ava-labs/avalanche-cli/pkg/blockchain"
"github.com/ava-labs/avalanche-cli/pkg/cobrautils"
"github.com/ava-labs/avalanche-cli/pkg/constants"
"github.com/ava-labs/avalanche-cli/pkg/contract"
"github.com/ava-labs/avalanche-cli/pkg/dependencies"
"github.com/ava-labs/avalanche-cli/pkg/interchain/relayer"
"github.com/ava-labs/avalanche-cli/pkg/keychain"
"github.com/ava-labs/avalanche-cli/pkg/localnet"
Expand All @@ -35,7 +32,7 @@ import (
"github.com/ava-labs/avalanche-cli/pkg/ux"
"github.com/ava-labs/avalanche-cli/pkg/vm"
sdkutils "github.com/ava-labs/avalanche-cli/sdk/utils"
validatorManagerSDK "github.com/ava-labs/avalanche-cli/sdk/validatormanager"
validatormanagerSDK "github.com/ava-labs/avalanche-cli/sdk/validatormanager"
"github.com/ava-labs/avalanche-cli/sdk/validatormanager/validatormanagertypes"
"github.com/ava-labs/avalanchego/api/info"
"github.com/ava-labs/avalanchego/ids"
Expand All @@ -51,6 +48,7 @@ import (

"github.com/jedib0t/go-pretty/v6/table"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)

const skipRelayerFlagName = "skip-relayer"
Expand Down Expand Up @@ -827,7 +825,7 @@ func deployBlockchain(cmd *cobra.Command, args []string) error {
tracked := false

if sidecar.Sovereign {
validatorManagerStr := validatorManagerSDK.ProxyContractAddress
validatorManagerStr := validatormanagerSDK.ValidatorProxyContractAddress
avaGoBootstrapValidators, cancel, savePartialTx, err := convertSubnetToL1(
bootstrapValidators,
deployer,
Expand Down Expand Up @@ -874,6 +872,18 @@ func deployBlockchain(cmd *cobra.Command, args []string) error {
if err != nil {
return err
}
if sidecar.UseACP99 && sidecar.ValidatorManagement == validatormanagertypes.ProofOfStake {
sidecar, err := app.LoadSidecar(chain)
if err != nil {
return err
}
networkInfo := sidecar.Networks[network.Name()]
networkInfo.ValidatorManagerAddress = validatormanagerSDK.SpecializationProxyContractAddress
sidecar.Networks[network.Name()] = networkInfo
if err := app.UpdateSidecar(&sidecar); err != nil {
return err
}
}
} else {
if err := app.UpdateSidecarNetworks(
&sidecar,
Expand Down
15 changes: 11 additions & 4 deletions cmd/blockchaincmd/describe.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,9 @@ func PrintSubnetInfo(blockchainName string, onlyLocalnetInfo bool) error {
localEndpoint = endpoint
}
t.AppendRow(table.Row{net, "RPC Endpoint", endpoint})
if data.ValidatorManagerAddress != "" {
t.AppendRow(table.Row{net, "Manager", data.ValidatorManagerAddress})
}
}
ux.Logger.PrintToUser(t.Render())

Expand Down Expand Up @@ -356,11 +359,15 @@ func printSmartContracts(sc models.Sidecar, genesis core.Genesis) {
} else {
description = "v1.0.0 Compatible " + description
}
case address == common.HexToAddress(validatorManagerSDK.ProxyContractAddress):
description = "Transparent Proxy"
case address == common.HexToAddress(validatorManagerSDK.ProxyAdminContractAddress):
description = "Proxy Admin"
case address == common.HexToAddress(validatorManagerSDK.ValidatorProxyContractAddress):
description = "Validator Transparent Proxy"
case address == common.HexToAddress(validatorManagerSDK.ValidatorProxyAdminContractAddress):
description = "Validator Proxy Admin"
deployer = sc.ProxyContractOwner
case address == common.HexToAddress(validatorManagerSDK.SpecializationProxyContractAddress):
description = "Validator Specialization Transparent Proxy"
case address == common.HexToAddress(validatorManagerSDK.SpecializationProxyAdminContractAddress):
description = "Validator Specialization Proxy Admin"
case address == common.HexToAddress(validatorManagerSDK.RewardCalculatorAddress):
description = "Reward Calculator"
}
Expand Down
1 change: 1 addition & 0 deletions cmd/blockchaincmd/import_public.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ func importBlockchain(

if !subnetInfo.IsPermissioned {
sc.Sovereign = true
sc.UseACP99 = true
validatorManagerAddress = "0x" + hex.EncodeToString(subnetInfo.ManagerAddress)
e := sc.Networks[network.Name()]
e.ValidatorManagerAddress = validatorManagerAddress
Expand Down
2 changes: 1 addition & 1 deletion cmd/blockchaincmd/remove_validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ func removeValidatorSOV(
extraAggregatorPeers,
aggregatorLogger,
validatorManagerAddress,
sc.PoA() && sc.UseACP99,
sc.UseACP99,
)
if err != nil {
return err
Expand Down
Loading
Loading