diff --git a/cmd/blockchaincmd/add_validator.go b/cmd/blockchaincmd/add_validator.go index 73f841f2b..8430ac2a1 100644 --- a/cmd/blockchaincmd/add_validator.go +++ b/cmd/blockchaincmd/add_validator.go @@ -5,7 +5,6 @@ package blockchaincmd import ( "errors" "fmt" - "math/big" "strings" "time" @@ -108,7 +107,6 @@ Testnet or Mainnet.`, cmd.Flags().StringVar(&nodeEndpoint, "node-endpoint", "", "gather node id/bls from publicly available avalanchego apis on the given endpoint") cmd.Flags().StringSliceVar(&aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") cmd.Flags().BoolVar(&aggregatorAllowPrivatePeers, "aggregator-allow-private-peers", true, "allow the signature aggregator to connect to peers with private IP") - privateKeyFlags.AddToCmd(cmd, "to pay fees for completing the validator's registration (blockchain gas token)") cmd.Flags().StringVar(&rpcURL, "rpc", "", "connect to validator manager at the given rpc endpoint") cmd.Flags().StringVar(&aggregatorLogLevel, "aggregator-log-level", constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") cmd.Flags().BoolVar(&aggregatorLogToStdout, "aggregator-log-to-stdout", false, "use stdout for signature aggregator logs") @@ -120,7 +118,6 @@ Testnet or Mainnet.`, cmd.Flags().StringSliceVar(&subnetAuthKeys, "subnet-auth-keys", nil, "(for Subnets, not L1s) control keys that will be used to authenticate add validator tx") cmd.Flags().StringVar(&outputTxPath, "output-tx-path", "", "(for Subnets, not L1s) file path of the add validator tx") cmd.Flags().BoolVar(&waitForTxAcceptance, "wait-for-tx-acceptance", true, "(for Subnets, not L1s) just issue the add validator tx, without waiting for its acceptance") - cmd.Flags().Uint64Var(&stakeAmount, "stake-amount", 0, "(PoS only) amount of tokens to stake") cmd.Flags().Uint16Var(&delegationFee, "delegation-fee", 100, "(PoS only) delegation fee (in bips)") return cmd @@ -384,22 +381,7 @@ func CallAddValidator( pos := sc.PoS() if pos { - // should take input prior to here for stake amount, delegation fee, and min stake duration - if stakeAmount == 0 { - stakeAmount, err = app.Prompt.CaptureUint64Compare( - fmt.Sprintf("Enter the amount of %s to stake ", sc.TokenName), - []prompts.Comparator{ - { - Label: "Positive", - Type: prompts.MoreThan, - Value: 0, - }, - }, - ) - if err != nil { - return err - } - } + // should take input prior to here for delegation fee, and min stake duration if duration == 0 { duration, err = PromptDuration(time.Now(), network, true) // it's pos if err != nil { @@ -521,7 +503,6 @@ func CallAddValidator( pos, delegationFee, duration, - big.NewInt(int64(stakeAmount)), validatorManagerAddress, ) if err != nil { diff --git a/cmd/blockchaincmd/convert.go b/cmd/blockchaincmd/convert.go index ed236dddc..595002a3f 100644 --- a/cmd/blockchaincmd/convert.go +++ b/cmd/blockchaincmd/convert.go @@ -25,6 +25,7 @@ import ( "github.com/ava-labs/avalanche-cli/pkg/txutils" "github.com/ava-labs/avalanche-cli/pkg/utils" "github.com/ava-labs/avalanche-cli/pkg/ux" + "github.com/ava-labs/avalanche-cli/pkg/validatormanager" "github.com/ava-labs/avalanche-cli/pkg/vm" blockchainSDK "github.com/ava-labs/avalanche-cli/sdk/blockchain" sdkutils "github.com/ava-labs/avalanche-cli/sdk/utils" @@ -56,8 +57,6 @@ Sovereign L1s require bootstrap validators. avalanche blockchain convert command Args: cobrautils.ExactArgs(1), } networkoptions.AddNetworkFlagsToCmd(cmd, &globalNetworkFlags, true, networkoptions.DefaultSupportedNetworkOptions) - privateKeyFlags.SetFlagNames("blockchain-private-key", "blockchain-key", "blockchain-genesis-key") - privateKeyFlags.AddToCmd(cmd, "to fund validator manager initialization") cmd.Flags().StringVarP(&keyName, "key", "k", "", "select the key to use [fuji/devnet convert to l1 tx only]") cmd.Flags().StringSliceVar(&subnetAuthKeys, "auth-keys", nil, "control keys that will be used to authenticate convert to L1 tx") cmd.Flags().StringVar(&outputTxPath, "output-tx-path", "", "file path of the convert to L1 tx (for multi-sig)") @@ -249,13 +248,16 @@ func StartLocalMachine( return nil } -func InitializeValidatorManager(blockchainName, +func InitializeValidatorManager( + blockchainName, validatorManagerOwner string, - subnetID, blockchainID ids.ID, + subnetID ids.ID, + blockchainID ids.ID, network models.Network, avaGoBootstrapValidators []*txs.ConvertSubnetToL1Validator, pos bool, validatorManagerAddrStr string, + proxyContractOwner string, ) (bool, error) { var err error clusterName := clusterNameFlagValue @@ -280,7 +282,9 @@ func InitializeValidatorManager(blockchainName, } } } + tracked := true + chainSpec := contract.ChainSpec{ BlockchainName: blockchainName, } @@ -302,11 +306,40 @@ func InitializeValidatorManager(blockchainName, if err != nil { return tracked, err } + client, err := evm.GetClient(rpcURL) if err != nil { return tracked, err } evm.WaitForChainID(client) + + if pos { + deployed, err := validatormanager.ProxyHasValidatorManagerSet(rpcURL) + if err != nil { + return tracked, err + } + if !deployed { + // it is not in genesis + ux.Logger.PrintToUser("Deploying Proof of Stake Validator Manager contract on blockchain %s ...", blockchainName) + proxyOwnerPrivateKey, err := GetProxyOwnerPrivateKey( + app, + network, + proxyContractOwner, + ux.Logger.PrintToUser, + ) + if err != nil { + return tracked, err + } + if _, err := validatormanager.DeployAndRegisterPoSValidatorManagerContrac( + rpcURL, + genesisPrivateKey, + proxyOwnerPrivateKey, + ); err != nil { + return tracked, err + } + } + } + extraAggregatorPeers, err := blockchain.GetAggregatorExtraPeers(app, clusterName, aggregatorExtraEndpoints) if err != nil { return tracked, err @@ -350,6 +383,7 @@ func InitializeValidatorManager(blockchainName, MaximumStakeMultiplier: poSMaximumStakeMultiplier, WeightToValueFactor: big.NewInt(int64(poSWeightToValueFactor)), RewardCalculatorAddress: validatorManagerSDK.RewardCalculatorAddress, + UptimeBlockchainID: blockchainID, }, validatorManagerAddrStr, ); err != nil { @@ -662,6 +696,7 @@ func convertBlockchain(_ *cobra.Command, args []string) error { avaGoBootstrapValidators, sidecar.ValidatorManagement == models.ProofOfStake, validatorManagerAddress, + sidecar.ProxyContractOwner, ); err != nil { return err } diff --git a/cmd/blockchaincmd/deploy.go b/cmd/blockchaincmd/deploy.go index bc234a6d0..cf29378d8 100644 --- a/cmd/blockchaincmd/deploy.go +++ b/cmd/blockchaincmd/deploy.go @@ -74,7 +74,6 @@ var ( icmSpec subnet.ICMSpec generateNodeID bool bootstrapValidatorsJSONFilePath string - privateKeyFlags contract.PrivateKeyFlags bootstrapEndpoints []string convertOnly bool numNodes uint32 @@ -120,8 +119,6 @@ so you can take your locally tested Blockchain and deploy it on Fuji or Mainnet. Args: cobrautils.ExactArgs(1), } networkoptions.AddNetworkFlagsToCmd(cmd, &globalNetworkFlags, true, networkoptions.DefaultSupportedNetworkOptions) - privateKeyFlags.SetFlagNames("blockchain-private-key", "blockchain-key", "blockchain-genesis-key") - privateKeyFlags.AddToCmd(cmd, "to fund validator manager initialization") cmd.Flags().StringVar( &userProvidedAvagoVersion, "avalanchego-version", @@ -806,7 +803,17 @@ func deployBlockchain(cmd *cobra.Command, args []string) error { return nil } - tracked, err = InitializeValidatorManager(blockchainName, sidecar.ValidatorManagerOwner, subnetID, blockchainID, network, avaGoBootstrapValidators, sidecar.ValidatorManagement == models.ProofOfStake, validatorManagerStr) + tracked, err = InitializeValidatorManager( + blockchainName, + sidecar.ValidatorManagerOwner, + subnetID, + blockchainID, + network, + avaGoBootstrapValidators, + sidecar.ValidatorManagement == models.ProofOfStake, + validatorManagerStr, + sidecar.ProxyContractOwner, + ) if err != nil { return err } diff --git a/cmd/blockchaincmd/helpers.go b/cmd/blockchaincmd/helpers.go index 44f54834c..aab0e92b8 100644 --- a/cmd/blockchaincmd/helpers.go +++ b/cmd/blockchaincmd/helpers.go @@ -5,14 +5,18 @@ package blockchaincmd import ( "fmt" + "github.com/ava-labs/avalanche-cli/pkg/application" "github.com/ava-labs/avalanche-cli/pkg/binutils" - "github.com/ava-labs/avalanche-cli/pkg/utils" - + "github.com/ava-labs/avalanche-cli/pkg/contract" "github.com/ava-labs/avalanche-cli/pkg/keychain" "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/txutils" + "github.com/ava-labs/avalanche-cli/pkg/utils" "github.com/ava-labs/avalanchego/ids" + + "github.com/ethereum/go-ethereum/common" "github.com/spf13/cobra" ) @@ -112,3 +116,35 @@ func getLocalBootstrapEndpoints() ([]string, error) { } return localBootstrapEndpoints, nil } + +func GetProxyOwnerPrivateKey( + app *application.Avalanche, + network models.Network, + proxyContractOwner string, + printFunc func(msg string, args ...interface{}), +) (string, error) { + found, _, _, proxyOwnerPrivateKey, err := contract.SearchForManagedKey( + app, + network, + common.HexToAddress(proxyContractOwner), + true, + ) + if err != nil { + return "", err + } + if !found { + printFunc("Private key for proxy owner address %s was not found", proxyContractOwner) + proxyOwnerPrivateKey, err = prompts.PromptPrivateKey( + app.Prompt, + "configure validator manager proxy for PoS", + app.GetKeyDir(), + app.GetKey, + "", + "", + ) + if err != nil { + return "", err + } + } + return proxyOwnerPrivateKey, nil +} diff --git a/cmd/blockchaincmd/remove_validator.go b/cmd/blockchaincmd/remove_validator.go index d6c625483..b764b34cb 100644 --- a/cmd/blockchaincmd/remove_validator.go +++ b/cmd/blockchaincmd/remove_validator.go @@ -61,7 +61,6 @@ these prompts by providing the values with flags.`, cmd.Flags().StringVar(&nodeEndpoint, "node-endpoint", "", "remove validator that responds to the given endpoint") cmd.Flags().StringSliceVar(&aggregatorExtraEndpoints, "aggregator-extra-endpoints", nil, "endpoints for extra nodes that are needed in signature aggregation") cmd.Flags().BoolVar(&aggregatorAllowPrivatePeers, "aggregator-allow-private-peers", true, "allow the signature aggregator to connect to peers with private IP") - privateKeyFlags.AddToCmd(cmd, "to pay fees for completing the validator's removal (blockchain gas token)") cmd.Flags().StringVar(&rpcURL, "rpc", "", "connect to validator manager at the given rpc endpoint") cmd.Flags().StringVar(&aggregatorLogLevel, "aggregator-log-level", constants.DefaultAggregatorLogLevel, "log level to use with signature aggregator") cmd.Flags().BoolVar(&aggregatorLogToStdout, "aggregator-log-to-stdout", false, "use stdout for signature aggregator logs") diff --git a/cmd/contractcmd/init_validator_manager.go b/cmd/contractcmd/init_validator_manager.go index 773ace8c3..6f9efeeb3 100644 --- a/cmd/contractcmd/init_validator_manager.go +++ b/cmd/contractcmd/init_validator_manager.go @@ -23,6 +23,7 @@ import ( 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" ) @@ -214,6 +215,30 @@ func initValidatorManager(_ *cobra.Command, args []string) error { } ux.Logger.GreenCheckmarkToUser("Proof of Authority Validator Manager contract successfully initialized on blockchain %s", blockchainName) case sc.PoS(): // PoS + deployed, err := validatormanager.ProxyHasValidatorManagerSet(validatorManagerFlags.rpcEndpoint) + if err != nil { + return err + } + if !deployed { + // it is not in genesis + ux.Logger.PrintToUser("Deploying Proof of Stake Validator Manager contract on blockchain %s ...", blockchainName) + proxyOwnerPrivateKey, err := blockchaincmd.GetProxyOwnerPrivateKey( + app, + network, + sc.ProxyContractOwner, + ux.Logger.PrintToUser, + ) + if err != nil { + return err + } + if _, err := validatormanager.DeployAndRegisterPoSValidatorManagerContrac( + validatorManagerFlags.rpcEndpoint, + genesisPrivateKey, + proxyOwnerPrivateKey, + ); err != nil { + return err + } + } ux.Logger.PrintToUser(logging.Yellow.Wrap("Initializing Proof of Stake Validator Manager contract on blockchain %s"), blockchainName) if initPOSManagerFlags.rewardCalculatorAddress == "" { initPOSManagerFlags.rewardCalculatorAddress = validatorManagerSDK.RewardCalculatorAddress @@ -234,6 +259,7 @@ func initValidatorManager(_ *cobra.Command, args []string) error { MaximumStakeMultiplier: initPOSManagerFlags.maximumStakeMultiplier, WeightToValueFactor: big.NewInt(int64(initPOSManagerFlags.weightToValueFactor)), RewardCalculatorAddress: initPOSManagerFlags.rewardCalculatorAddress, + UptimeBlockchainID: blockchainID, }, validatorManagerAddress, ); err != nil { diff --git a/cmd/nodecmd/local.go b/cmd/nodecmd/local.go index b6e8d81a5..a8d34419d 100644 --- a/cmd/nodecmd/local.go +++ b/cmd/nodecmd/local.go @@ -4,7 +4,6 @@ package nodecmd import ( "fmt" - "math/big" "path/filepath" "strings" "time" @@ -561,7 +560,6 @@ func addAsValidator(network models.Network, true, delegationFee, time.Duration(minimumStakeDuration)*time.Second, - big.NewInt(int64(stakeAmount)), validatorManagerAddressStr, ) if err != nil { diff --git a/pkg/contract/contract.go b/pkg/contract/contract.go index 84e1ac82c..2b862f2cd 100644 --- a/pkg/contract/contract.go +++ b/pkg/contract/contract.go @@ -341,6 +341,8 @@ func TxToMethod( } if errorFromSignature, err := evm.GetErrorFromTrace(trace, errorSignatureToError); err != nil && !errors.Is(err, evm.ErrUnknownErrorSelector) { ux.Logger.RedXToUser("failed to match error selector on trace: %s", err) + ux.Logger.PrintToUser("error trace for %s error:", description) + ux.Logger.PrintToUser("%#v", trace) } else if errorFromSignature != nil { return tx, nil, errorFromSignature } else { @@ -584,6 +586,9 @@ func DeployContract( return common.Address{}, err } bin := common.FromHex(metadata.Bin) + if len(bin) == 0 { + return common.Address{}, fmt.Errorf("failure on given binary for smart contract: zero len") + } client, err := evm.GetClient(rpcURL) if err != nil { return common.Address{}, err diff --git a/pkg/validatormanager/deployed_example_reward_calculator_bytecode_v1.0.0.txt b/pkg/validatormanager/deployed_example_reward_calculator_bytecode_v1.0.0.txt new file mode 100644 index 000000000..097ea5dbc --- /dev/null +++ b/pkg/validatormanager/deployed_example_reward_calculator_bytecode_v1.0.0.txt @@ -0,0 +1,2 @@ +0x608060405234801561000f575f80fd5b5060043610610055575f3560e01c80634f22429f146100595780635dcc93911461007f578063a9778a7a1461008a578063afba878a146100a6578063bb65b242146100c0575b5f80fd5b61006c6100673660046101db565b610100565b6040519081526020015b60405180910390f35b61006c6301e1338081565b61009361271081565b60405161ffff9091168152602001610076565b6100ae605081565b60405160ff9091168152602001610076565b6100e77f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610076565b5f605061010d8685610249565b6101179190610271565b67ffffffffffffffff1661012c836064610271565b67ffffffffffffffff16101561014357505f6101b6565b6127106301e133806101558686610249565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1689610195919061029d565b61019f919061029d565b6101a991906102ba565b6101b391906102ba565b90505b95945050505050565b803567ffffffffffffffff811681146101d6575f80fd5b919050565b5f805f805f60a086880312156101ef575f80fd5b853594506101ff602087016101bf565b935061020d604087016101bf565b925061021b606087016101bf565b9150610229608087016101bf565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff82811682821603908082111561026a5761026a610235565b5092915050565b67ffffffffffffffff81811683821602808216919082811461029557610295610235565b505092915050565b80820281158282048414176102b4576102b4610235565b92915050565b5f826102d457634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a + diff --git a/pkg/validatormanager/native_token_staking_manager_bytecode_v1.0.0.txt b/pkg/validatormanager/native_token_staking_manager_bytecode_v1.0.0.txt new file mode 100644 index 000000000..c2e850e2d --- /dev/null +++ b/pkg/validatormanager/native_token_staking_manager_bytecode_v1.0.0.txt @@ -0,0 +1,2 @@ +0x608060405234801561000f575f80fd5b50604051615c51380380615c5183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b048061014d5f395ff3fe608060405260043610610228575f3560e01c80637d8d2f7711610129578063b771b3bc116100a8578063c974d1b61161006d578063c974d1b614610666578063d5f20ff61461067a578063df93d8de146106a6578063fb8b11dd146106bc578063fd7ac5e7146106db575f80fd5b8063b771b3bc146105db578063ba3a4b97146105f5578063bc5fbfec14610614578063bee0a03f14610634578063c599e24f14610653575f80fd5b80639ae06447116100ee5780639ae0644714610557578063a3a65e4814610576578063a9778a7a1461037c578063af2f5feb14610595578063afb98096146105a8575f80fd5b80637d8d2f77146104c757806380dd672f146104e65780638280a25a146105055780638ef34c981461051957806393e2459814610538575f80fd5b806335455ded116101b557806360305d621161017a57806360305d621461042057806360ad7784146104495780636206585614610468578063732214f81461049557806376f78621146104a8575f80fd5b806335455ded1461037c57806337b9be8f146103a45780633a1cfff6146103c3578063467ef06f146103e25780635dd6a6cb14610401575f80fd5b80631ec44724116101fb5780631ec44724146102b657806320d91b7a146102d557806325e1c776146102f45780632e2194d814610313578063329c3e121461034a575f80fd5b80630118acc41461022c5780630322ed981461024d5780630ba512d11461026c578063151d30d11461028b575b5f80fd5b348015610237575f80fd5b5061024b610246366004614aff565b6106fa565b005b348015610258575f80fd5b5061024b610267366004614b3a565b61070b565b348015610277575f80fd5b5061024b610286366004614b51565b61099b565b348015610296575f80fd5b5061029f600a81565b60405160ff90911681526020015b60405180910390f35b3480156102c1575f80fd5b5061024b6102d0366004614aff565b610a78565b3480156102e0575f80fd5b5061024b6102ef366004614b68565b610a84565b3480156102ff575f80fd5b5061024b61030e366004614bb6565b61103a565b34801561031e575f80fd5b5061033261032d366004614b3a565b6110ae565b6040516001600160401b0390911681526020016102ad565b348015610355575f80fd5b506103646001600160991b0181565b6040516001600160a01b0390911681526020016102ad565b348015610387575f80fd5b5061039161271081565b60405161ffff90911681526020016102ad565b3480156103af575f80fd5b5061024b6103be366004614beb565b611102565b3480156103ce575f80fd5b5061024b6103dd366004614aff565b611115565b3480156103ed575f80fd5b5061024b6103fc366004614c39565b611121565b34801561040c575f80fd5b5061024b61041b366004614beb565b6111f3565b34801561042b575f80fd5b50610434601481565b60405163ffffffff90911681526020016102ad565b348015610454575f80fd5b5061024b610463366004614bb6565b6111ff565b348015610473575f80fd5b50610487610482366004614c66565b6114c7565b6040519081526020016102ad565b3480156104a0575f80fd5b506104875f81565b3480156104b3575f80fd5b5061024b6104c2366004614aff565b6114e7565b3480156104d2575f80fd5b5061024b6104e1366004614beb565b6114f3565b3480156104f1575f80fd5b5061024b610500366004614bb6565b6114ff565b348015610510575f80fd5b5061029f603081565b348015610524575f80fd5b5061024b610533366004614c81565b611739565b348015610543575f80fd5b5061024b610552366004614b3a565b6117ea565b348015610562575f80fd5b5061024b610571366004614beb565b61187e565b348015610581575f80fd5b5061024b610590366004614c39565b61188a565b6104876105a3366004614cc0565b611a80565b3480156105b3575f80fd5b506104877f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081565b3480156105e6575f80fd5b506103646005600160991b0181565b348015610600575f80fd5b5061024b61060f366004614b3a565b611ab4565b34801561061f575f80fd5b506104875f80516020615a9883398151915281565b34801561063f575f80fd5b5061024b61064e366004614b3a565b611d0d565b610487610661366004614b3a565b611e49565b348015610671575f80fd5b5061029f601481565b348015610685575f80fd5b50610699610694366004614b3a565b611e7a565b6040516102ad9190614d96565b3480156106b1575f80fd5b506103326202a30081565b3480156106c7575f80fd5b5061024b6106d6366004614c81565b611fc9565b3480156106e6575f80fd5b506104876106f5366004614e16565b612060565b6107068383835f6120bb565b505050565b5f8181525f80516020615ab88339815191526020526040808220815160e0810190925280545f80516020615a9883398151915293929190829060ff16600581111561075857610758614d21565b600581111561076957610769614d21565b815260200160018201805461077d90614e81565b80601f01602080910402602001604051908101604052809291908181526020018280546107a990614e81565b80156107f45780601f106107cb576101008083540402835291602001916107f4565b820191905f5260205f20905b8154815290600101906020018083116107d757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561085f5761085f614d21565b1461089b575f8381526005830160205260409081902054905163170cc93360e21b81526108929160ff1690600401614eb3565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015610912573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109399190810190614fbc565b6040518263ffffffff1660e01b81526004016109559190614fed565b6020604051808303815f875af1158015610971573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109959190614fff565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109e4575080546001600160401b03808416911610155b15610a025760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a2c836120e7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6109958383835f6120f8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f80516020615a988339815191529060ff1615610ad657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3d9190614fff565b836020013514610b66576040516372b0a7e760e11b815260208401356004820152602401610892565b30610b776060850160408601615016565b6001600160a01b031614610bba57610b956060840160408501615016565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610892565b5f610bc86060850185615031565b905090505f805b828163ffffffff161015610e30575f610beb6060880188615031565b8363ffffffff16818110610c0157610c01615076565b9050602002810190610c13919061508a565b610c1c906150f5565b80516040519192505f916006880191610c3491615170565b90815260200160405180910390205414610c6457805160405163a41f772f60e01b81526108929190600401614fed565b5f6002885f013584604051602001610c9392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610cad91615170565b602060405180830381855afa158015610cc8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ceb9190614fff565b90508086600601835f0151604051610d039190615170565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff191660021781558251600190910190610d4390826151c5565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff19169055610dc39085615294565b8251604051919550610dd491615170565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a3505080610e29906152b4565b9050610bcf565b5060038301805467ffffffffffffffff60401b1916600160401b6001600160401b0384168102919091179091556001840154606491610e73910460ff16836152d6565b6001600160401b03161015610ea657604051633e1a785160e01b81526001600160401b0382166004820152602401610892565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d847884610eca8761242d565b604001516040518263ffffffff1660e01b8152600401610eea9190614fed565b602060405180830381865af4158015610f05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f299190614fff565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610f63919061542c565b5f60405180830381865af4158015610f7d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fa49190810190614fbc565b90505f600282604051610fb79190615170565b602060405180830381855afa158015610fd2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ff59190614fff565b90508281146110215760405163baaea89d60e01b81526004810182905260248101849052604401610892565b5050506007909201805460ff1916600117905550505050565b61104382612543565b611063576040516330efa98b60e01b815260048101839052602401610892565b5f61106d83611e7a565b519050600281600581111561108457611084614d21565b146110a4578060405163170cc93360e21b81526004016108929190614eb3565b610995838361256c565b5f806110b861280b565b600301546110c690846154c0565b90508015806110db57506001600160401b0381115b156110fc5760405163222d164360e21b815260048101849052602401610892565b92915050565b61110e848484846120f8565b5050505050565b6109958383835f61282f565b611129612a6c565b5f61113261280b565b90505f8061113f84612aa3565b9150915061114c82612543565b611158575050506111da565b5f828152600684016020908152604080832054600b870190925290912080546001600160a01b031981169091556001600160a01b0391821691168061119a5750805b6004835160058111156111af576111af614d21565b036111be576111be8185612e5b565b6111d4826111cf85604001516114c7565b612e85565b50505050505b6111f060015f80516020615ad883398151915255565b50565b61099584848484612eab565b5f61120861280b565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561124157611241614d21565b600381111561125257611252614d21565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6112c882611e7a565b90506001835160038111156112df576112df614d21565b14611300578251604051633b0d540d60e21b815261089291906004016154df565b60048151600581111561131557611315614d21565b0361132b5761132386612ed7565b505050505050565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f6113508961242d565b604001516040518263ffffffff1660e01b81526004016113709190614fed565b606060405180830381865af415801561138b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113af91906154f9565b50915091508184146113dc57846040015160405163089938b360e11b815260040161089291815260200190565b806001600160401b031683606001516001600160401b031610806114155750806001600160401b03168560a001516001600160401b0316115b1561143e57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610892565b5f888152600787016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b810267ffffffffffffffff60401b1990921691909117909155915191825285918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f6114d061280b565b600301546110fc906001600160401b03841661552e565b6107068383835f612eab565b61110e8484848461282f565b611507612a6c565b5f61151061280b565b5f848152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561154957611549614d21565b600381111561155a5761155a614d21565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115d3576115d3614d21565b146115f4578051604051633b0d540d60e21b815261089291906004016154df565b60046116038260400151611e7a565b51600581111561161557611615614d21565b14611714575f6116248461242d565b90505f8073__$fd0c147b4031eef6079b0498cbafa865f0$__6350782b0f84604001516040518263ffffffff1660e01b81526004016116639190614fed565b606060405180830381865af415801561167e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a291906154f9565b5091509150818460400151146116ce5760405163089938b360e11b815260048101839052602401610892565b806001600160401b03168460c001516001600160401b0316111561171057604051632e19bc2d60e11b81526001600160401b0382166004820152602401610892565b5050505b61171d84612ed7565b505061173560015f80516020615ad883398151915255565b5050565b5f61174261280b565b90506001600160a01b0382166117765760405163caa903f960e01b81526001600160a01b0383166004820152602401610892565b5f8381526006820160205260409020546001600160a01b031633146117bc57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610892565b5f928352600b01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f6117f361280b565b90505f6117ff83611e7a565b519050600481600581111561181657611816614d21565b14611836578060405163170cc93360e21b81526004016108929190614eb3565b5f8381526006830160205260409020546001600160a01b0316331461185b5733611797565b5f838152600683016020526040902054610706906001600160a01b031684612e5b565b610995848484846120bb565b5f80516020615a988339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f6118bd8661242d565b604001516040518263ffffffff1660e01b81526004016118dd9190614fed565b6040805180830381865af41580156118f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061191b9190615545565b915091508061194157604051632d07135360e01b81528115156004820152602401610892565b5f8281526004840160205260409020805461195b90614e81565b90505f0361197f5760405163089938b360e11b815260048101839052602401610892565b60015f838152600580860160205260409091205460ff16908111156119a6576119a6614d21565b146119d9575f8281526005840160205260409081902054905163170cc93360e21b81526108929160ff1690600401614eb3565b5f82815260048401602052604081206119f191614a53565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f611a89612a6c565b611a95848484346130d1565b9050611aad60015f80516020615ad883398151915255565b9392505050565b5f611abd61280b565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115611af657611af6614d21565b6003811115611b0757611b07614d21565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611b8057611b80614d21565b14158015611ba15750600381516003811115611b9e57611b9e614d21565b14155b15611bc2578051604051633b0d540d60e21b815261089291906004016154df565b5f611bd08260400151611e7a565b905080606001516001600160401b03165f03611c02576040516339b894f960e21b815260048101859052602401610892565b60408083015160608301516080840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93611c7093906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015611c8a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cb19190810190614fbc565b6040518263ffffffff1660e01b8152600401611ccd9190614fed565b6020604051808303815f875af1158015611ce9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110e9190614fff565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f80516020615a988339815191529190611d5490614e81565b90505f03611d785760405163089938b360e11b815260048101839052602401610892565b60015f838152600580840160205260409091205460ff1690811115611d9f57611d9f614d21565b14611dd2575f8281526005820160205260409081902054905163170cc93360e21b81526108929160ff1690600401614eb3565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92611e099201615568565b6020604051808303815f875af1158015611e25573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107069190614fff565b5f611e52612a6c565b611e5d823334613246565b9050611e7560015f80516020615ad883398151915255565b919050565b611e82614a8a565b5f8281525f80516020615ab8833981519152602052604090819020815160e0810190925280545f80516020615a98833981519152929190829060ff166005811115611ecf57611ecf614d21565b6005811115611ee057611ee0614d21565b8152602001600182018054611ef490614e81565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2090614e81565b8015611f6b5780601f10611f4257610100808354040283529160200191611f6b565b820191905f5260205f20905b815481529060010190602001808311611f4e57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6001600160a01b038116611ffb5760405163caa903f960e01b81526001600160a01b0382166004820152602401610892565b5f61200461280b565b5f8481526007820160205260409020549091506001600160a01b036101009091041633146120325733611797565b5f928352600901602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6040515f905f80516020615a98833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06906120a390869086906155f2565b90815260200160405180910390205491505092915050565b6120c7848484846120f8565b61099557604051631036cf9160e11b815260048101859052602401610892565b6120ef613486565b6111f0816134d1565b5f8061210261280b565b5f878152600782016020526040808220815160e0810190925280549394509192909190829060ff16600381111561213b5761213b614d21565b600381111561214c5761214c614d21565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6121c282611e7a565b90506002835160038111156121d9576121d9614d21565b146121fa578251604051633b0d540d60e21b815261089291906004016154df565b60208301516001600160a01b03163314612296575f8281526006850160205260409020546001600160a01b031633146122335733611797565b5f82815260068501602052604090205460a082015161226291600160b01b90046001600160401b031690615294565b6001600160401b03164210156122965760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610892565b6002815160058111156122ab576122ab614d21565b036123cd57600284015460808401516122cd916001600160401b031690615294565b6001600160401b03164210156123015760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610892565b871561231357612311828861256c565b505b5f8981526007850160205260409020805460ff191660031790556060830151608082015161234c9184916123479190615601565b61354b565b505f8a8152600786016020526040812060020180546001600160401b03909316600160c01b026001600160c01b039093169290921790915561238f84888c613722565b9050828a7f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5760405160405180910390a3151594506124259350505050565b6004815160058111156123e2576123e2614d21565b03612409576123f283878b613722565b506123fc89612ed7565b6001945050505050612425565b805160405163170cc93360e21b81526108929190600401614eb3565b949350505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612491573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124b89190810190615621565b91509150806124da57604051636b2f19e960e01b815260040160405180910390fd5b815115612500578151604051636ba589a560e01b81526004810191909152602401610892565b60208201516001600160a01b03161561253c576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610892565b5092915050565b5f8061254d61280b565b5f938452600601602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125b7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125de9190810190615621565b915091508061260057604051636b2f19e960e01b815260040160405180910390fd5b5f61260961280b565b6005810154845191925014612637578251604051636ba589a560e01b81526004810191909152602401610892565b60208301516001600160a01b031615612673576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610892565b60208301516001600160a01b0316156126af576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610892565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b81526004016126ec9190614fed565b6040805180830381865af4158015612706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272a91906156b1565b915091508188146127515760405163089938b360e11b815260048101899052602401610892565b5f8881526006840160205260409020600101546001600160401b0390811690821611156127e2575f888152600684016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612800565b505f8781526006830160205260409020600101546001600160401b03165b979650505050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0090565b5f8061283961280b565b90505f61284587613910565b905061285087612543565b61285f57600192505050612425565b5f8781526006830160205260409020546001600160a01b031633146128845733611797565b5f87815260068301602052604090205460a08201516128b391600160b01b90046001600160401b031690615294565b6001600160401b03168160c001516001600160401b031610156128fa5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610892565b5f86156129125761290b888761256c565b9050612930565b505f8781526006830160205260409020600101546001600160401b03165b600483015460408301515f916001600160a01b031690634f22429f90612955906114c7565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b03918216602484018190526044840152811660648301528516608482015260a401602060405180830381865afa1580156129be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e29190614fff565b90506001600160a01b038616612a0e575f8981526006850160205260409020546001600160a01b031695505b5f898152600a8501602052604081208054839290612a2d9084906156d4565b90915550505f898152600b909401602052604090932080546001600160a01b0387166001600160a01b0319909116179055505015159050949350505050565b5f80516020615ad8833981519152805460011901612a9d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612aac614a8a565b5f80516020615a988339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f612adf8861242d565b604001516040518263ffffffff1660e01b8152600401612aff9190614fed565b6040805180830381865af4158015612b19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b3d9190615545565b915091508015612b6457604051632d07135360e01b81528115156004820152602401610892565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff90911690811115612b9b57612b9b614d21565b6005811115612bac57612bac614d21565b8152602001600182018054612bc090614e81565b80601f0160208091040260200160405190810160405280929190818152602001828054612bec90614e81565b8015612c375780601f10612c0e57610100808354040283529160200191612c37565b820191905f5260205f20905b815481529060010190602001808311612c1a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a09091015290915081516005811115612ca257612ca2614d21565b14158015612cc35750600181516005811115612cc057612cc0614d21565b14155b15612ce457805160405163170cc93360e21b81526108929190600401614eb3565b600381516005811115612cf957612cf9614d21565b03612d075760048152612d0c565b600581525b836006018160200151604051612d229190615170565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff1916906001908490811115612d6557612d65614d21565b021790555060208201516001820190612d7e90826151c5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612e2457612e24614d21565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f612e6461280b565b5f838152600a82016020526040812080549190559091506109958482613bf5565b6117356001600160a01b03831682613c53565b60015f80516020615ad883398151915255565b612eb78484848461282f565b61099557604051635bff683f60e11b815260048101859052602401610892565b5f612ee061280b565b5f838152600782016020526040808220815160e0810190925280549394509192909190829060ff166003811115612f1957612f19614d21565b6003811115612f2a57612f2a614d21565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152810151909150612fc77fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b031690565b8260800151612fd69190615294565b6001600160401b031642101561300a5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610892565b5f848152600784016020908152604080832080546001600160a81b03191681556001810184905560020183905560098601909152902080546001600160a01b031981169091556001600160a01b031680613065575060208201515b5f80613072838886613ce6565b9150915061308b85602001516111cf87606001516114c7565b6040805183815260208101839052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f806130db61280b565b600281015490915061ffff600160401b90910481169086161080613104575061271061ffff8616115b1561312857604051635f12e6c360e11b815261ffff86166004820152602401610892565b60028101546001600160401b039081169085161015613164576040516202a06d60e11b81526001600160401b0385166004820152602401610892565b80548310806131765750806001015483115b156131975760405163222d164360e21b815260048101849052602401610892565b825f6131a2826110ae565b90505f6131af8983613d93565b5f818152600686016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600b9096019095529790932080546001600160a01b031916909617909555509395945050505050565b5f8061325061280b565b90505f61325c846110ae565b90505f61326887611e7a565b905061327387612543565b613293576040516330efa98b60e01b815260048101889052602401610892565b6002815160058111156132a8576132a8614d21565b146132c957805160405163170cc93360e21b81526108929190600401614eb3565b5f8282608001516132da9190615294565b905083600201600a9054906101000a90046001600160401b0316826040015161330391906152d6565b6001600160401b0316816001600160401b0316111561334057604051636d51fe0560e11b81526001600160401b0382166004820152602401610892565b5f8061334c8a8461354b565b915091505f8a8360405160200161337a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260078b019093529120805491925060019160ff1916828002179055505f8181526007880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a2234269060800160405180910390a49a9950505050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134cf57604051631afcd79f60e31b815260040160405180910390fd5b565b6134d9613486565b6134e281614305565b6134ea61431e565b6111f06060820135608083013561350760c0850160a08601614c66565b61351760e0860160c087016156e7565b613528610100870160e08801615700565b61010087013561354061014089016101208a01615016565b88610140013561432e565b5f8281525f80516020615ab8833981519152602052604081206002015481905f80516020615a9883398151915290600160801b90046001600160401b03166135938582614513565b5f61359d8761477d565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af4158015613646573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261366d9190810190614fbc565b6040518263ffffffff1660e01b81526004016136899190614fed565b6020604051808303815f875af11580156136a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136c99190614fff565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8061372c61280b565b90505f61373c8660400151611e7a565b90505f60038251600581111561375457613754614d21565b1480613772575060048251600581111561377057613770614d21565b145b15613782575060c08101516137bf565b60028251600581111561379757613797614d21565b036137a35750426137bf565b815160405163170cc93360e21b81526108929190600401614eb3565b86608001516001600160401b0316816001600160401b0316116137e7575f9350505050611aad565b600483015460608801515f916001600160a01b031690634f22429f9061380c906114c7565b60a086015160808c01516040808e01515f90815260068b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa15801561388d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b19190614fff565b90506001600160a01b0387166138c957876020015196505b5f8681526008850160209081526040808320849055600990960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b613918614a8a565b5f8281525f80516020615ab88339815191526020526040808220815160e0810190925280545f80516020615a9883398151915293929190829060ff16600581111561396557613965614d21565b600581111561397657613976614d21565b815260200160018201805461398a90614e81565b80601f01602080910402602001604051908101604052809291908181526020018280546139b690614e81565b8015613a015780601f106139d857610100808354040283529160200191613a01565b820191905f5260205f20905b8154815290600101906020018083116139e457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613a6f57613a6f614d21565b14613aa2575f8481526005830160205260409081902054905163170cc93360e21b81526108929160ff1690600401614eb3565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff1916906001908490811115613ae757613ae7614d21565b021790555060208201516001820190613b0090826151c5565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613b9e858261354b565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015613c41575f80fd5b505af1158015611323573d5f803e3d5ffd5b80471015613c765760405163cd78605960e01b8152306004820152602401610892565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613cbf576040519150601f19603f3d011682016040523d82523d5f602084013e613cc4565b606091505b505090508061070657604051630a12f52160e11b815260040160405180910390fd5b5f805f613cf161280b565b5f86815260088201602052604081208054908290559192509081908015613d85575f87815260068501602052604090205461271090613d3b90600160a01b900461ffff168361552e565b613d4591906154c0565b91508184600a015f8981526020019081526020015f205f828254613d6991906156d4565b90915550613d7990508282615720565b9250613d858984613bf5565b509097909650945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16613dd757604051637fab81e560e01b815260040160405180910390fd5b5f80516020615a9883398151915242613df66060860160408701614c66565b6001600160401b0316111580613e305750613e146202a300426156d4565b613e246060860160408701614c66565b6001600160401b031610155b15613e6a57613e456060850160408601614c66565b604051635879da1360e11b81526001600160401b039091166004820152602401610892565b60038101546001600160401b0390613e8d90600160401b900482168583166156d4565b1115613eb757604051633e1a785160e01b81526001600160401b0384166004820152602401610892565b613ecc613ec76060860186615733565b6147f2565b613edc613ec76080860186615733565b6030613eeb6020860186615747565b905014613f1d57613eff6020850185615747565b6040516326475b2f60e11b8152610892925060040190815260200190565b613f278480615747565b90505f03613f5457613f398480615747565b604051633e08a12560e11b8152600401610892929190615789565b5f60068201613f638680615747565b604051613f719291906155f2565b90815260200160405180910390205414613faa57613f8f8480615747565b60405163a41f772f60e01b8152600401610892929190615789565b613fb4835f614513565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101613ff18a80615747565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614039908b018b615747565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161408260608b0160408c01614c66565b6001600160401b0316815260200161409d60608b018b615733565b6140a69061579c565b81526020016140b860808b018b615733565b6140c19061579c565b8152602001886001600160401b03168152506040518263ffffffff1660e01b81526004016140ef91906158c9565b5f60405180830381865af4158015614109573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526141309190810190615980565b5f8281526004860160205260409020919350915061414e82826151c5565b50816006840161415e8880615747565b60405161416c9291906155f2565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141a8908590600401614fed565b6020604051808303815f875af11580156141c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141e89190614fff565b5f8481526005860160205260409020805460ff19166001179055905061420e8780615747565b5f85815260058701602052604090206001019161422c9190836159c3565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff191690558061428b8880615747565b6040516142999291906155f2565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b60400160208101906142d79190614c66565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61430d613486565b61431561495b565b6111f081614963565b614326613486565b6134cf614a4b565b614336613486565b5f61433f61280b565b905061ffff86161580614357575061271061ffff8716115b1561437b57604051635f12e6c360e11b815261ffff87166004820152602401610892565b8789111561439f5760405163222d164360e21b8152600481018a9052602401610892565b60ff851615806143b25750600a60ff8616115b156143d55760405163170db35960e31b815260ff86166004820152602401610892565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01546001600160401b03166001600160401b0316876001600160401b0316101561443c576040516202a06d60e11b81526001600160401b0388166004820152602401610892565b835f0361445c5760405163a733007160e01b815260040160405180910390fd5b8161447d57604051632f6bd1db60e01b815260048101839052602401610892565b97885560018801969096556002870180546001600160401b039690961669ffffffffffffffffffff1990961695909517600160401b61ffff95909516949094029390931767ffffffffffffffff60501b191660ff92909216600160501b029190911790925560038401919091556004830180546001600160a01b0319166001600160a01b03909216919091179055600590910155565b5f80516020615a988339815191525f6001600160401b038084169085161115614547576145408385615601565b9050614554565b6145518484615601565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b90049092166060820152429115806145c15750600184015481516145bd916001600160401b0316906156d4565b8210155b156145e9576001600160401b0380841660608301528282526040820151166020820152614608565b82816060018181516145fb9190615294565b6001600160401b03169052505b60608101516146189060646152d6565b602082015160018601546001600160401b0392909216916146439190600160401b900460ff166152d6565b6001600160401b0316101561467c57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610892565b858160400181815161468e9190615294565b6001600160401b03169052506040810180518691906146ae908390615601565b6001600160401b0316905250600184015460408201516064916146dc91600160401b90910460ff16906152d6565b6001600160401b03161015614715576040808201519051633e1a785160e01b81526001600160401b039091166004820152602401610892565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b5f8181525f80516020615ab88339815191526020526040812060020180545f80516020615a9883398151915291906008906147c790600160401b90046001600160401b0316615a7c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6147ff6020820182614c39565b63ffffffff1615801561481f575061481a6020820182615031565b151590505b15614866576148316020820182614c39565b61483e6020830183615031565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610892565b6148736020820182615031565b90506148826020830183614c39565b63ffffffff16111561489b576148316020820182614c39565b60015b6148ab6020830183615031565b9050811015611735576148c16020830183615031565b6148cc600184615720565b8181106148db576148db615076565b90506020020160208101906148f09190615016565b6001600160a01b03166149066020840184615031565b8381811061491657614916615076565b905060200201602081019061492b9190615016565b6001600160a01b0316101561495357604051630dbc8d5f60e31b815260040160405180910390fd5b60010161489e565b6134cf613486565b61496b613486565b80355f80516020615a9883398151915290815560146149906060840160408501615700565b60ff1611806149af57506149aa6060830160408401615700565b60ff16155b156149e3576149c46060830160408401615700565b604051634a59bbff60e11b815260ff9091166004820152602401610892565b6149f36060830160408401615700565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a246040830160208401614c66565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612e98613486565b508054614a5f90614e81565b5f825580601f10614a6e575050565b601f0160209004905f5260205f20908101906111f09190614ac7565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614adb575f8155600101614ac8565b5090565b80151581146111f0575f80fd5b803563ffffffff81168114611e75575f80fd5b5f805f60608486031215614b11575f80fd5b833592506020840135614b2381614adf565b9150614b3160408501614aec565b90509250925092565b5f60208284031215614b4a575f80fd5b5035919050565b5f6101608284031215614b62575f80fd5b50919050565b5f8060408385031215614b79575f80fd5b82356001600160401b03811115614b8e575f80fd5b830160808186031215614b9f575f80fd5b9150614bad60208401614aec565b90509250929050565b5f8060408385031215614bc7575f80fd5b82359150614bad60208401614aec565b6001600160a01b03811681146111f0575f80fd5b5f805f8060808587031215614bfe575f80fd5b843593506020850135614c1081614adf565b9250614c1e60408601614aec565b91506060850135614c2e81614bd7565b939692955090935050565b5f60208284031215614c49575f80fd5b611aad82614aec565b6001600160401b03811681146111f0575f80fd5b5f60208284031215614c76575f80fd5b8135611aad81614c52565b5f8060408385031215614c92575f80fd5b823591506020830135614ca481614bd7565b809150509250929050565b803561ffff81168114611e75575f80fd5b5f805f60608486031215614cd2575f80fd5b83356001600160401b03811115614ce7575f80fd5b840160a08187031215614cf8575f80fd5b9250614d0660208501614caf565b91506040840135614d1681614c52565b809150509250925092565b634e487b7160e01b5f52602160045260245ffd5b60068110614d4557614d45614d21565b9052565b5f5b83811015614d63578181015183820152602001614d4b565b50505f910152565b5f8151808452614d82816020860160208601614d49565b601f01601f19169290920160200192915050565b60208152614da8602082018351614d35565b5f602083015160e06040840152614dc3610100840182614d6b565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215614e27575f80fd5b82356001600160401b0380821115614e3d575f80fd5b818501915085601f830112614e50575f80fd5b813581811115614e5e575f80fd5b866020828501011115614e6f575f80fd5b60209290920196919550909350505050565b600181811c90821680614e9557607f821691505b602082108103614b6257634e487b7160e01b5f52602260045260245ffd5b602081016110fc8284614d35565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614ef757614ef7614ec1565b60405290565b604080519081016001600160401b0381118282101715614ef757614ef7614ec1565b604051601f8201601f191681016001600160401b0381118282101715614f4757614f47614ec1565b604052919050565b5f6001600160401b03821115614f6757614f67614ec1565b50601f01601f191660200190565b5f82601f830112614f84575f80fd5b8151614f97614f9282614f4f565b614f1f565b818152846020838601011115614fab575f80fd5b612425826020830160208701614d49565b5f60208284031215614fcc575f80fd5b81516001600160401b03811115614fe1575f80fd5b61242584828501614f75565b602081525f611aad6020830184614d6b565b5f6020828403121561500f575f80fd5b5051919050565b5f60208284031215615026575f80fd5b8135611aad81614bd7565b5f808335601e19843603018112615046575f80fd5b8301803591506001600160401b0382111561505f575f80fd5b6020019150600581901b360382131561371b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261509e575f80fd5b9190910192915050565b5f82601f8301126150b7575f80fd5b81356150c5614f9282614f4f565b8181528460208386010111156150d9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615105575f80fd5b61510d614ed5565b82356001600160401b0380821115615123575f80fd5b61512f368387016150a8565b83526020850135915080821115615144575f80fd5b50615151368286016150a8565b602083015250604083013561516581614c52565b604082015292915050565b5f825161509e818460208701614d49565b601f82111561070657805f5260205f20601f840160051c810160208510156151a65750805b601f840160051c820191505b8181101561110e575f81556001016151b2565b81516001600160401b038111156151de576151de614ec1565b6151f2816151ec8454614e81565b84615181565b602080601f831160018114615225575f841561520e5750858301515b5f19600386901b1c1916600185901b178555611323565b5f85815260208120601f198616915b8281101561525357888601518255948401946001909101908401615234565b508582101561527057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561253c5761253c615280565b5f63ffffffff8083168181036152cc576152cc615280565b6001019392505050565b6001600160401b038181168382160280821691908281146152f9576152f9615280565b505092915050565b5f808335601e19843603018112615316575f80fd5b83016020810192503590506001600160401b03811115615334575f80fd5b80360382131561371b575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b8781101561541f57848303601f19018952813536889003605e190181126153a6575f80fd5b870160606153b48280615301565b8287526153c48388018284615342565b925050506153d486830183615301565b868303888801526153e6838284615342565b9250505060408083013592506153fb83614c52565b6001600160401b039290921694909101939093529783019790830190600101615381565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561545081614bd7565b6001600160a01b031660608381019190915283013536849003601e19018112615477575f80fd5b83016020810190356001600160401b03811115615492575f80fd5b8060051b36038213156154a3575f80fd5b6080808501526154b760a08501828461536a565b95945050505050565b5f826154da57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106154f3576154f3614d21565b91905290565b5f805f6060848603121561550b575f80fd5b83519250602084015161551d81614c52565b6040850151909250614d1681614c52565b80820281158282048414176110fc576110fc615280565b5f8060408385031215615556575f80fd5b825191506020830151614ca481614adf565b5f60208083525f845461557a81614e81565b806020870152604060018084165f811461559b57600181146155b7576155e4565b60ff19851660408a0152604084151560051b8a010195506155e4565b895f5260205f205f5b858110156155db5781548b82018601529083019088016155c0565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b0382811682821603908082111561253c5761253c615280565b5f8060408385031215615632575f80fd5b82516001600160401b0380821115615648575f80fd5b908401906060828703121561565b575f80fd5b615663614ed5565b82518152602083015161567581614bd7565b602082015260408301518281111561568b575f80fd5b61569788828601614f75565b6040830152508094505050506020830151614ca481614adf565b5f80604083850312156156c2575f80fd5b825191506020830151614ca481614c52565b808201808211156110fc576110fc615280565b5f602082840312156156f7575f80fd5b611aad82614caf565b5f60208284031215615710575f80fd5b813560ff81168114611aad575f80fd5b818103818111156110fc576110fc615280565b5f8235603e1983360301811261509e575f80fd5b5f808335601e1984360301811261575c575f80fd5b8301803591506001600160401b03821115615775575f80fd5b60200191503681900382131561371b575f80fd5b602081525f612425602083018486615342565b5f604082360312156157ac575f80fd5b6157b4614efd565b6157bd83614aec565b81526020808401356001600160401b03808211156157d9575f80fd5b9085019036601f8301126157eb575f80fd5b8135818111156157fd576157fd614ec1565b8060051b915061580e848301614f1f565b8181529183018401918481019036841115615827575f80fd5b938501935b83851015615851578435925061584183614bd7565b828252938501939085019061582c565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156158be5784516001600160a01b03168252938301936001929092019190830190615895565b509695505050505050565b60208152815160208201525f602083015160e060408401526158ef610100840182614d6b565b90506040840151601f198085840301606086015261590d8383614d6b565b92506001600160401b03606087015116608086015260808601519150808584030160a086015261593d8383615863565b925060a08601519150808584030160c08601525061595b8282615863565b91505060c084015161597860e08501826001600160401b03169052565b509392505050565b5f8060408385031215615991575f80fd5b8251915060208301516001600160401b038111156159ad575f80fd5b6159b985828601614f75565b9150509250929050565b6001600160401b038311156159da576159da614ec1565b6159ee836159e88354614e81565b83615181565b5f601f841160018114615a1f575f8515615a085750838201355b5f19600387901b1c1916600186901b17835561110e565b5f83815260208120601f198716915b82811015615a4e5786850135825560209485019460019092019101615a2e565b5086821015615a6a575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f6001600160401b038083168181036152cc576152cc61528056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb059b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a + diff --git a/pkg/validatormanager/proxy.go b/pkg/validatormanager/proxy.go new file mode 100644 index 000000000..688d0ebdd --- /dev/null +++ b/pkg/validatormanager/proxy.go @@ -0,0 +1,70 @@ +// Copyright (C) 2022, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. +package validatormanager + +import ( + _ "embed" + "fmt" + "math/big" + + "github.com/ava-labs/avalanche-cli/pkg/contract" + "github.com/ava-labs/avalanche-cli/pkg/evm" + validatorManagerSDK "github.com/ava-labs/avalanche-cli/sdk/validatormanager" + "github.com/ava-labs/subnet-evm/core/types" + + "github.com/ethereum/go-ethereum/common" +) + +func SetupValidatorManagerAtProxy( + rpcURL string, + proxyManagerPrivateKey string, + validatorManager common.Address, +) (*types.Transaction, *types.Receipt, error) { + return contract.TxToMethod( + rpcURL, + proxyManagerPrivateKey, + common.HexToAddress(validatorManagerSDK.ProxyAdminContractAddress), + big.NewInt(0), + "set proxy to PoS", + validatorManagerSDK.ErrorSignatureToError, + "upgrade(address,address)", + common.HexToAddress(validatorManagerSDK.ProxyContractAddress), + validatorManager, + ) +} + +func GetProxyValidatorManager( + rpcURL string, +) (common.Address, error) { + out, err := contract.CallToMethod( + rpcURL, + common.HexToAddress(validatorManagerSDK.ProxyAdminContractAddress), + "getProxyImplementation(address)->(address)", + common.HexToAddress(validatorManagerSDK.ProxyContractAddress), + ) + if err != nil { + return common.Address{}, err + } + validatorManagerAddress, b := out[0].(common.Address) + if !b { + return common.Address{}, fmt.Errorf("error obtaining proxy implementation, expected common.Address, got %T", out[0]) + } + return validatorManagerAddress, nil +} + +func ProxyHasValidatorManagerSet( + rpcURL string, +) (bool, error) { + validatorManagerAddress, err := GetProxyValidatorManager(rpcURL) + if err != nil { + return false, err + } + client, err := evm.GetClient(rpcURL) + if err != nil { + return false, err + } + return evm.ContractAlreadyDeployed( + client, + validatorManagerAddress.Hex(), + ) +} diff --git a/pkg/validatormanager/registration.go b/pkg/validatormanager/registration.go index a975df61a..b457ecf4a 100644 --- a/pkg/validatormanager/registration.go +++ b/pkg/validatormanager/registration.go @@ -239,25 +239,25 @@ func GetSubnetValidatorRegistrationMessage( return signedMessage, validationID, err } -func GetValidatorWeight( +func PoSWeightToValue( rpcURL string, managerAddress common.Address, - validatorID ids.ID, -) (uint64, error) { + weight uint64, +) (*big.Int, error) { out, err := contract.CallToMethod( rpcURL, managerAddress, - "getWeight(bytes32)->(uint64)", - validatorID, + "weightToValue(uint64)->(uint256)", + weight, ) if err != nil { - return 0, err + return nil, err } - weight, b := out[0].(uint64) + value, b := out[0].(*big.Int) if !b { - return 0, fmt.Errorf("error at getWeight call, expected uint64, got %T", out[0]) + return nil, fmt.Errorf("error at weightToValue, expected *big.Int, got %T", out[0]) } - return weight, nil + return value, nil } func GetPChainSubnetValidatorRegistrationWarpMessage( @@ -352,7 +352,6 @@ func InitValidatorRegistration( initWithPos bool, delegationFee uint16, stakeDuration time.Duration, - stakeAmount *big.Int, validatorManagerAddressStr string, ) (*warp.Message, ids.ID, error) { subnetID, err := contract.GetSubnetID( @@ -374,6 +373,14 @@ func InitValidatorRegistration( managerAddress := common.HexToAddress(validatorManagerAddressStr) alreadyInitialized := false if initWithPos { + stakeAmount, err := PoSWeightToValue( + rpcURL, + managerAddress, + weight, + ) + if err != nil { + return nil, ids.Empty, fmt.Errorf("failure obtaining value from weight: %w", err) + } ux.Logger.PrintLineSeparator() ux.Logger.PrintToUser("Initializing validator registration with PoS validator manager") ux.Logger.PrintToUser("Using RPC URL: %s", rpcURL) @@ -399,6 +406,7 @@ func InitValidatorRegistration( ux.Logger.PrintToUser(logging.LightBlue.Wrap("The validator registration was already initialized. Proceeding to the next step")) alreadyInitialized = true } + ux.Logger.PrintToUser(fmt.Sprintf("Validator staked amount: %d", stakeAmount)) } else { managerAddress = common.HexToAddress(validatorManagerAddressStr) tx, _, err := InitializeValidatorRegistrationPoA( @@ -419,20 +427,6 @@ func InitValidatorRegistration( ux.Logger.PrintToUser(logging.LightBlue.Wrap("The validator registration was already initialized. Proceeding to the next step")) alreadyInitialized = true } - } - if initWithPos { - validationID, err := validator.GetRegisteredValidator(rpcURL, managerAddress, nodeID) - if err != nil { - ux.Logger.PrintToUser("Error getting validation ID") - return nil, ids.Empty, err - } - weight, err = GetValidatorWeight(rpcURL, managerAddress, validationID) - if err != nil { - ux.Logger.PrintToUser("Error getting validator weight") - return nil, ids.Empty, err - } - } else { - // Print validator weight for POA only ux.Logger.PrintToUser(fmt.Sprintf("Validator weight: %d", weight)) } diff --git a/pkg/validatormanager/validatormanager.go b/pkg/validatormanager/validatormanager.go index f9dee0ff1..2eb33519b 100644 --- a/pkg/validatormanager/validatormanager.go +++ b/pkg/validatormanager/validatormanager.go @@ -8,12 +8,14 @@ import ( "math/big" "strings" + "github.com/ava-labs/avalanche-cli/pkg/contract" "github.com/ava-labs/avalanche-cli/pkg/models" blockchainSDK "github.com/ava-labs/avalanche-cli/sdk/blockchain" validatorManagerSDK "github.com/ava-labs/avalanche-cli/sdk/validatormanager" "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/utils/logging" "github.com/ava-labs/subnet-evm/core" + "github.com/ethereum/go-ethereum/common" ) @@ -69,6 +71,47 @@ func AddPoSValidatorManagerContractToAllocations( } } +//go:embed native_token_staking_manager_bytecode_v1.0.0.txt +var posValidatorManagerBytecode []byte + +func DeployPoSValidatorManagerContract( + rpcURL string, + privateKey string, +) (common.Address, error) { + posValidatorManagerString := strings.TrimSpace(string(posValidatorManagerBytecode)) + posValidatorManagerString = fillValidatorMessagesAddressPlaceholder(posValidatorManagerString) + posValidatorManagerBytes := []byte(posValidatorManagerString) + return contract.DeployContract( + rpcURL, + privateKey, + posValidatorManagerBytes, + "(uint8)", + uint8(0), + ) +} + +func DeployAndRegisterPoSValidatorManagerContrac( + rpcURL string, + privateKey string, + proxyOwnerPrivateKey string, +) (common.Address, error) { + posValidatorManagerAddress, err := DeployPoSValidatorManagerContract( + rpcURL, + privateKey, + ) + if err != nil { + return common.Address{}, err + } + if _, _, err := SetupValidatorManagerAtProxy( + rpcURL, + proxyOwnerPrivateKey, + posValidatorManagerAddress, + ); err != nil { + return common.Address{}, err + } + return posValidatorManagerAddress, nil +} + //go:embed deployed_transparent_proxy_bytecode.txt var deployedTransparentProxyBytecode []byte @@ -79,6 +122,12 @@ func AddTransparentProxyContractToAllocations( allocs core.GenesisAlloc, proxyManager string, ) { + if _, found := allocs[common.HexToAddress(proxyManager)]; !found { + ownerBalance := big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(1)) + allocs[common.HexToAddress(proxyManager)] = core.GenesisAccount{ + Balance: ownerBalance, + } + } // proxy admin deployedProxyAdmin := common.FromHex(strings.TrimSpace(string(deployedProxyAdminBytecode))) allocs[common.HexToAddress(validatorManagerSDK.ProxyAdminContractAddress)] = core.GenesisAccount{ @@ -104,7 +153,7 @@ func AddTransparentProxyContractToAllocations( } } -//go:embed deployed_reward_calculator_bytecode.txt +//go:embed deployed_example_reward_calculator_bytecode_v1.0.0.txt var deployedRewardCalculatorBytecode []byte func AddRewardCalculatorToAllocations( diff --git a/pkg/vm/create_evm.go b/pkg/vm/create_evm.go index 050823a15..14dedfdda 100644 --- a/pkg/vm/create_evm.go +++ b/pkg/vm/create_evm.go @@ -126,12 +126,12 @@ func CreateEVMGenesis( return nil, fmt.Errorf("blockchain can not be both PoA and PoS") } if params.UsePoAValidatorManager { + validatormanager.AddTransparentProxyContractToAllocations(params.initialTokenAllocation, proxyOwner) validatormanager.AddValidatorMessagesContractToAllocations(params.initialTokenAllocation) validatormanager.AddPoAValidatorManagerContractToAllocations(params.initialTokenAllocation) - validatormanager.AddTransparentProxyContractToAllocations(params.initialTokenAllocation, proxyOwner) } else if params.UsePoSValidatorManager { - validatormanager.AddPoSValidatorManagerContractToAllocations(params.initialTokenAllocation) validatormanager.AddTransparentProxyContractToAllocations(params.initialTokenAllocation, proxyOwner) + validatormanager.AddValidatorMessagesContractToAllocations(params.initialTokenAllocation) validatormanager.AddRewardCalculatorToAllocations(params.initialTokenAllocation, rewardBasisPoints) params.enableNativeMinterPrecompile = true } diff --git a/sdk/validatormanager/root.go b/sdk/validatormanager/root.go index f0b08f298..4cbece3e7 100644 --- a/sdk/validatormanager/root.go +++ b/sdk/validatormanager/root.go @@ -38,6 +38,7 @@ type NativeTokenValidatorManagerSettings struct { MaximumStakeMultiplier uint8 WeightToValueFactor *big.Int RewardCalculator common.Address + UptimeBlockchainID [32]byte } const ( @@ -151,6 +152,7 @@ type PoSParams struct { MaximumStakeMultiplier uint8 WeightToValueFactor *big.Int RewardCalculatorAddress string + UptimeBlockchainID ids.ID } func (p PoSParams) Verify() error { diff --git a/sdk/validatormanager/validator_manager_pos.go b/sdk/validatormanager/validator_manager_pos.go index 817accc8a..4e08fbf0a 100644 --- a/sdk/validatormanager/validator_manager_pos.go +++ b/sdk/validatormanager/validator_manager_pos.go @@ -41,6 +41,7 @@ func PoSValidatorManagerInitialize( MaximumStakeMultiplier: posParams.MaximumStakeMultiplier, WeightToValueFactor: posParams.WeightToValueFactor, RewardCalculator: common.HexToAddress(posParams.RewardCalculatorAddress), + UptimeBlockchainID: posParams.UptimeBlockchainID, } return contract.TxToMethod( @@ -50,7 +51,7 @@ func PoSValidatorManagerInitialize( nil, "initialize Native Token PoS manager", ErrorSignatureToError, - "initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,uint256,address))", + "initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,uint256,address,bytes32))", params, ) } diff --git a/tests/e2e/commands/etna.go b/tests/e2e/commands/etna.go index bd59ca59c..a355077ec 100644 --- a/tests/e2e/commands/etna.go +++ b/tests/e2e/commands/etna.go @@ -240,7 +240,6 @@ func AddEtnaSubnetValidatorToCluster( nodeEndpoint string, ewoqPChainAddress string, balance int, - stakeAmount int, createLocalValidator bool, ) (string, error) { cmd := exec.Command( @@ -255,8 +254,6 @@ func AddEtnaSubnetValidatorToCluster( ewoqPChainAddress, "--disable-owner", ewoqPChainAddress, - "--stake-amount", - strconv.Itoa(stakeAmount), "--delegation-fee", "100", "--staking-period", @@ -301,9 +298,6 @@ func RemoveEtnaSubnetValidatorFromCluster( clusterName, "--node-endpoint", nodeEndpoint, - "--blockchain-genesis-key", - "--blockchain-key", - keyName, "--key", keyName, "--uptime", diff --git a/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoA/suite.go b/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoA/suite.go index f0016975e..e43d2798c 100644 --- a/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoA/suite.go +++ b/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoA/suite.go @@ -103,7 +103,6 @@ var _ = ginkgo.Describe("[Etna AddRemove Validator SOV PoA]", func() { localClusterUris[5], ewoqPChainAddress, 1, - 100, false, // use existing avago running ) gomega.Expect(err).Should(gomega.BeNil()) @@ -117,7 +116,6 @@ var _ = ginkgo.Describe("[Etna AddRemove Validator SOV PoA]", func() { localClusterUris[6], ewoqPChainAddress, 1, - 100, false, // use existing avago running ) gomega.Expect(err).Should(gomega.BeNil()) diff --git a/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoS/suite.go b/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoS/suite.go index b28edd72b..e9b496ddd 100644 --- a/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoS/suite.go +++ b/tests/e2e/testcases/subnet/sov/addRemoveValidatorPoS/suite.go @@ -105,7 +105,6 @@ var _ = ginkgo.Describe("[Etna AddRemove Validator SOV PoS]", func() { localClusterUris[5], ewoqPChainAddress, 1, - 100, false, // use existing ) gomega.Expect(err).Should(gomega.BeNil()) @@ -119,7 +118,6 @@ var _ = ginkgo.Describe("[Etna AddRemove Validator SOV PoS]", func() { localClusterUris[6], ewoqPChainAddress, 1, - 100, false, // use existing ) gomega.Expect(err).Should(gomega.BeNil()) diff --git a/tests/e2e/testcases/subnet/sov/addValidatorLocal/suite.go b/tests/e2e/testcases/subnet/sov/addValidatorLocal/suite.go index 86c0ee3d1..51fc4e43d 100644 --- a/tests/e2e/testcases/subnet/sov/addValidatorLocal/suite.go +++ b/tests/e2e/testcases/subnet/sov/addValidatorLocal/suite.go @@ -45,7 +45,6 @@ var _ = ginkgo.Describe("[Etna Add Validator SOV Local]", func() { "", ewoqPChainAddress, 1, - 1, true, ) gomega.Expect(err).Should(gomega.BeNil())