From 1157360f35fbb9d01e52d57a9c279cb84c3d1096 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 5 Mar 2025 15:31:12 -0600 Subject: [PATCH 1/5] wip --- tests/flows/validator-manager/poa_to_pos.go | 54 ++-- tests/network/network.go | 132 +++++++++ .../validator_manager_suite_test.go | 20 +- tests/utils/validator_manager.go | 263 ++++++++++++++++++ 4 files changed, 441 insertions(+), 28 deletions(-) diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index c3dbea607..0c9462065 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -9,6 +9,7 @@ import ( "github.com/ava-labs/avalanchego/utils/units" ownableupgradeable "github.com/ava-labs/icm-contracts/abi-bindings/go/OwnableUpgradeable" nativetokenstakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/PoAValidatorManagerV1" validatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ValidatorManager" istakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/interfaces/IStakingManager" localnetwork "github.com/ava-labs/icm-contracts/tests/network" @@ -61,17 +62,15 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { fundAmount, ) - // Deploy ValidatorManager as PoA - nodes, initialValidationIDs := network.ConvertSubnet( + // Deploy PoAValidatorManager + nodes, initialValidationIDs := network.ConvertSubnetPoAV1( ctx, l1AInfo, - utils.PoAValidatorManager, []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits ownerKey, - true, ) - validatorManagerProxy, _ := network.GetValidatorManager(l1AInfo.SubnetID) - validatorManager, err := validatormanager.NewValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) + validatorManagerProxy, proxyAdmin := network.GetValidatorManager(l1AInfo.SubnetID) + poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) Expect(err).Should(BeNil()) signatureAggregator := utils.NewSignatureAggregator( @@ -85,13 +84,14 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { // // Delist one initial validator // - utils.InitiateAndCompleteEndInitialPoAValidation( + utils.InitializeAndCompleteEndInitialPoAValidationV1( ctx, signatureAggregator, ownerKey, + fundedKey, l1AInfo, pChainInfo, - validatorManager, + poaValidatorManager, validatorManagerProxy.Address, initialValidationIDs[0], 0, @@ -104,13 +104,15 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) - _, err = validatorManager.InitiateValidatorRegistration( + _, err = poaValidatorManager.InitializeValidatorRegistration( opts, - nodes[0].NodeID[:], - nodes[0].NodePoP.PublicKey[:], - uint64(time.Now().Add(24*time.Hour).Unix()), - validatormanager.PChainOwner{}, - validatormanager.PChainOwner{}, + poavalidatormanager.ValidatorRegistrationInput{ + NodeID: nodes[0].NodeID[:], + BlsPublicKey: nodes[0].NodePoP.PublicKey[:], + RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), + RemainingBalanceOwner: poavalidatormanager.PChainOwner{}, + DisableOwner: poavalidatormanager.PChainOwner{}, + }, nodes[0].Weight, ) Expect(err).ShouldNot(BeNil()) @@ -119,13 +121,14 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { // Re-register the validator as a SoV validator // expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) - poaValidationID := utils.InitiateAndCompletePoAValidatorRegistration( + poaValidationID := utils.InitializeAndCompletePoAValidatorRegistrationV1( ctx, signatureAggregator, ownerKey, + fundedKey, l1AInfo, pChainInfo, - validatorManager, + poaValidatorManager, validatorManagerProxy.Address, expiry, nodes[0], @@ -133,7 +136,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { network.GetNetworkID(), ) - poaValidator, err := validatorManager.GetValidator(&bind.CallOpts{}, poaValidationID) + poaValidator, err := poaValidatorManager.GetValidator(&bind.CallOpts{}, poaValidationID) Expect(err).Should(BeNil()) poaNodeID := poaValidator.NodeID @@ -142,6 +145,13 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { * Migrate PoAValidatorManager to StakingManager ****************** */ + // Deploy ValidatorManager contract + validatorManagerAddress, _ := utils.DeployValidatorManager(ctx, ownerKey, l1AInfo, false) + opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := proxyAdmin.UpgradeAndCall(opts, validatorManagerProxy.Address, validatorManagerAddress, []byte{}) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) // Deploy StakingManager contract stakingManagerAddress, _ := utils.DeployAndInitializeValidatorManagerSpecialization( @@ -167,15 +177,23 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := ownable.TransferOwnership(opts, stakingManagerAddress) + tx, err = ownable.TransferOwnership(opts, stakingManagerAddress) Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(context.Background(), l1AInfo, tx.Hash()) + validatorManager, err := validatormanager.NewValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) + // Check that previous validator is still registered validationID, err := validatorManager.RegisteredValidators(&bind.CallOpts{}, poaNodeID) Expect(err).Should(BeNil()) Expect(validationID[:]).Should(Equal(poaValidationID[:])) + // Check the subnetID was migrated + subnetID, err := validatorManager.SubnetID(&bind.CallOpts{}) + Expect(err).Should(BeNil()) + Expect(subnetID[:]).Should(Equal(l1AInfo.SubnetID[:])) + // // Remove the PoA validator and re-register as a PoS validator // diff --git a/tests/network/network.go b/tests/network/network.go index 835cc624f..6ba9bfda2 100644 --- a/tests/network/network.go +++ b/tests/network/network.go @@ -29,6 +29,7 @@ import ( "github.com/ava-labs/avalanchego/wallet/subnet/primary" ownableupgradeable "github.com/ava-labs/icm-contracts/abi-bindings/go/OwnableUpgradeable" proxyadmin "github.com/ava-labs/icm-contracts/abi-bindings/go/ProxyAdmin" + poavalidatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/PoAValidatorManagerV1" validatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ValidatorManager" "github.com/ava-labs/icm-contracts/tests/interfaces" "github.com/ava-labs/icm-contracts/tests/utils" @@ -188,6 +189,137 @@ func NewLocalNetwork( return localNetwork } +func (n *LocalNetwork) ConvertSubnetPoAV1( + ctx context.Context, + l1 interfaces.L1TestInfo, + weights []uint64, + senderKey *ecdsa.PrivateKey, +) ([]utils.Node, []ids.ID) { + goLog.Println("Converting l1", l1.SubnetID) + cChainInfo := n.GetPrimaryNetworkInfo() + pClient := platformvm.NewClient(cChainInfo.NodeURIs[0]) + currentValidators, err := pClient.GetCurrentValidators(ctx, l1.SubnetID, nil) + Expect(err).Should(BeNil()) + + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) + Expect(err).Should(BeNil()) + + // Reset the global binary data for better test isolation + poavalidatormanager.PoAValidatorManagerBin = poavalidatormanager.PoAValidatorManagerMetaData.Bin + + vdrManagerAddress, tx, poaValidatorManager, err := poavalidatormanager.DeployPoAValidatorManager( + opts, + l1.RPCClient, + 0, // ICMInitializable.Allowed + ) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, l1, tx.Hash()) + + tx, err = poaValidatorManager.Initialize( + opts, + poavalidatormanager.ValidatorManagerSettings{ + L1ID: l1.SubnetID, + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(20), + }, + utils.PrivateKeyToAddress(senderKey), + ) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, l1, tx.Hash()) + + var vdrManagerProxyAdmin *proxyadmin.ProxyAdmin + // Overwrite the manager address with the proxy address + vdrManagerAddress, vdrManagerProxyAdmin = utils.DeployTransparentUpgradeableProxy( + ctx, + l1, + senderKey, + vdrManagerAddress, + ) + + n.validatorManagers[l1.SubnetID] = ProxyAddress{ + Address: vdrManagerAddress, + ProxyAdmin: vdrManagerProxyAdmin, + } + + tmpnetNodes := n.GetExtraNodes(len(weights)) + sort.Slice(tmpnetNodes, func(i, j int) bool { + return string(tmpnetNodes[i].NodeID.Bytes()) < string(tmpnetNodes[j].NodeID.Bytes()) + }) + + var nodes []utils.Node + // Construct the converted l1 info + destAddr, err := address.ParseToID(utils.DefaultPChainAddress) + Expect(err).Should(BeNil()) + vdrs := make([]*txs.ConvertSubnetToL1Validator, len(tmpnetNodes)) + for i, node := range tmpnetNodes { + signer, err := node.GetProofOfPossession() + Expect(err).Should(BeNil()) + nodes = append(nodes, utils.Node{ + NodeID: node.NodeID, + NodePoP: signer, + Weight: weights[i], + }) + vdrs[i] = &txs.ConvertSubnetToL1Validator{ + NodeID: node.NodeID.Bytes(), + Weight: weights[i], + Balance: units.Avax * 100, + Signer: *signer, + RemainingBalanceOwner: warpMessage.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + DeactivationOwner: warpMessage.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + } + } + pChainWallet := n.GetPChainWallet() + _, err = pChainWallet.IssueConvertSubnetToL1Tx( + l1.SubnetID, + l1.BlockchainID, + vdrManagerAddress[:], + vdrs, + ) + Expect(err).Should(BeNil()) + + l1 = n.AddSubnetValidators(tmpnetNodes, l1, true) + + utils.PChainProposerVMWorkaround(pChainWallet) + utils.AdvanceProposerVM(ctx, l1, senderKey, 5) + + aggregator := n.GetSignatureAggregator() + defer aggregator.Shutdown() + validationIDs := utils.InitializeValidatorSetV1( + ctx, + senderKey, + l1, + utils.GetPChainInfo(cChainInfo), + vdrManagerAddress, + n.GetNetworkID(), + aggregator, + nodes, + ) + + // Remove the bootstrap nodes as l1 validators + for _, vdr := range currentValidators { + _, err := pChainWallet.IssueRemoveSubnetValidatorTx(vdr.NodeID, l1.SubnetID) + Expect(err).Should(BeNil()) + for _, node := range n.Network.Nodes { + if node.NodeID == vdr.NodeID { + port := getTmpnetNodePort(node) + node.Flags[config.HTTPPortKey] = port + goLog.Println("Restarting bootstrap node", node.NodeID) + n.Network.RestartNode(ctx, n.logger, node) + } + } + } + utils.PChainProposerVMWorkaround(pChainWallet) + utils.AdvanceProposerVM(ctx, l1, senderKey, 5) + + return nodes, validationIDs +} + func (n *LocalNetwork) ConvertSubnet( ctx context.Context, l1 interfaces.L1TestInfo, diff --git a/tests/suites/validator-manager/validator_manager_suite_test.go b/tests/suites/validator-manager/validator_manager_suite_test.go index 1c5ff81b1..1090cfe53 100644 --- a/tests/suites/validator-manager/validator_manager_suite_test.go +++ b/tests/suites/validator-manager/validator_manager_suite_test.go @@ -67,16 +67,16 @@ var _ = ginkgo.AfterEach(func() { var _ = ginkgo.Describe("[Validator manager integration tests]", func() { // Validator Manager tests - ginkgo.It("Native token staking manager", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManagerFlows.NativeTokenStakingManager(LocalNetworkInstance) - }) - ginkgo.It("ERC20 token staking manager", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManagerFlows.ERC20TokenStakingManager(LocalNetworkInstance) - }) + // ginkgo.It("Native token staking manager", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManagerFlows.NativeTokenStakingManager(LocalNetworkInstance) + // }) + // ginkgo.It("ERC20 token staking manager", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManagerFlows.ERC20TokenStakingManager(LocalNetworkInstance) + // }) ginkgo.It("PoA migration to PoS", ginkgo.Label(validatorManagerLabel), func() { diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 6a7d1a2f1..0b6328936 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -25,6 +25,7 @@ import ( erc20tokenstakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ERC20TokenStakingManager" examplerewardcalculator "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ExampleRewardCalculator" nativetokenstakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/PoAValidatorManagerV1" validatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ValidatorManager" istakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/interfaces/IStakingManager" "github.com/ava-labs/icm-contracts/tests/interfaces" @@ -266,6 +267,88 @@ func DeployExampleRewardCalculator( // Validator Set Initialization utils // +func InitializeValidatorSetV1( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, + validatorManagerAddress common.Address, + networkID uint32, + signatureAggregator *SignatureAggregator, + nodes []Node, +) []ids.ID { + log.Println("Initializing validator set", "l1", l1Info.SubnetID) + initialValidators := make([]warpMessage.SubnetToL1ConversionValidatorData, len(nodes)) + initialValidatorsABI := make([]poavalidatormanager.InitialValidator, len(nodes)) + for i, node := range nodes { + initialValidators[i] = warpMessage.SubnetToL1ConversionValidatorData{ + NodeID: node.NodeID.Bytes(), + BLSPublicKey: node.NodePoP.PublicKey, + Weight: nodes[i].Weight, + } + initialValidatorsABI[i] = poavalidatormanager.InitialValidator{ + NodeID: node.NodeID.Bytes(), + BlsPublicKey: node.NodePoP.PublicKey[:], + Weight: nodes[i].Weight, + } + } + + l1ConversionData := warpMessage.SubnetToL1ConversionData{ + SubnetID: l1Info.SubnetID, + ManagerChainID: l1Info.BlockchainID, + ManagerAddress: validatorManagerAddress[:], + Validators: initialValidators, + } + l1ConversionDataABI := poavalidatormanager.ConversionData{ + L1ID: l1Info.SubnetID, + ValidatorManagerBlockchainID: l1Info.BlockchainID, + ValidatorManagerAddress: validatorManagerAddress, + InitialValidators: initialValidatorsABI, + } + l1ConversionID, err := warpMessage.SubnetToL1ConversionID(l1ConversionData) + Expect(err).Should(BeNil()) + l1ConversionSignedMessage := ConstructL1ConversionMessage( + l1ConversionID, + l1Info, + pChainInfo, + networkID, + signatureAggregator, + ) + + // Deliver the Warp message to the L1 + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("initializeValidatorSet", l1ConversionDataABI, uint32(0)) + Expect(err).Should(BeNil()) + receipt := CallWarpReceiver( + ctx, + callData, + senderKey, + l1Info, + validatorManagerAddress, + l1ConversionSignedMessage.Bytes(), + ) + + manager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerAddress, l1Info.RPCClient) + Expect(err).Should(BeNil()) + initialValidatorCreatedEvent, err := GetEventFromLogs( + receipt.Logs, + manager.ParseInitialValidatorCreated, + ) + Expect(err).Should(BeNil()) + var validationIDs []ids.ID + for i := range nodes { + validationIDs = append(validationIDs, l1Info.SubnetID.Append(uint32(i))) + } + + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(nodes[0].Weight)) + + emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) + Expect(emittedValidationID).Should(Equal(validationIDs[0])) + + return validationIDs +} + func InitializeValidatorSet( ctx context.Context, senderKey *ecdsa.PrivateKey, @@ -699,6 +782,186 @@ func InitiateAndCompleteERC20ValidatorRegistration( return validationID } +func InitializeAndCompleteEndInitialPoAValidationV1( + ctx context.Context, + signatureAggregator *SignatureAggregator, + ownerKey *ecdsa.PrivateKey, + fundedKey *ecdsa.PrivateKey, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, + validatorManager *poavalidatormanager.PoAValidatorManager, + validatorManagerAddress common.Address, + validationID ids.ID, + index uint32, + weight uint64, + pchainWallet pwallet.Wallet, + networkID uint32, +) { + log.Println("Initializing initial validator removal") + WaitMinStakeDuration(ctx, l1Info, fundedKey) + opts, err := bind.NewKeyedTransactorWithChainID(ownerKey, l1Info.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := validatorManager.InitializeEndValidation( + opts, + validationID, + ) + Expect(err).Should(BeNil()) + receipt := WaitForTransactionSuccess(ctx, l1Info, tx.Hash()) + + validatorRemovalEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.Weight).Should(Equal(weight)) + + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) + signedWarpMessage, err := signatureAggregator.CreateSignedMessage( + unsignedMessage, + nil, + l1Info.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + + // Deliver the Warp message to the P-Chain + pchainWallet.IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) + PChainProposerVMWorkaround(pchainWallet) + AdvanceProposerVM(ctx, l1Info, fundedKey, 5) + + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing initial validator removal") + registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( + validationID, + index, + false, + l1Info, + pChainInfo, + networkID, + signatureAggregator, + ) + + // Deliver the Warp message to the L1 + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeEndValidation", uint32(0)) + Expect(err).Should(BeNil()) + receipt = CallWarpReceiver( + ctx, + callData, + ownerKey, + l1Info, + validatorManagerAddress, + registrationSignedMessage.Bytes(), + ) + + // Check that the validator is has been delisted from the staking contract + validationEndedEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) +} + +func InitializeAndCompletePoAValidatorRegistrationV1( + ctx context.Context, + signatureAggregator *SignatureAggregator, + ownerKey *ecdsa.PrivateKey, + fundedKey *ecdsa.PrivateKey, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, + validatorManager *poavalidatormanager.PoAValidatorManager, + validatorManagerAddress common.Address, + expiry uint64, + node Node, + pchainWallet pwallet.Wallet, + networkID uint32, +) ids.ID { + // Initiate validator registration + // receipt, validationID := InitializePoAValidatorRegistration( + // ctx, + // ownerKey, + // l1Info, + // node, + // expiry, + // validatorManager, + // ) + + opts, err := bind.NewKeyedTransactorWithChainID(ownerKey, l1Info.EVMChainID) + Expect(err).Should(BeNil()) + + tx, err := validatorManager.InitializeValidatorRegistration( + opts, + poavalidatormanager.ValidatorRegistrationInput{ + NodeID: node.NodeID[:], + RegistrationExpiry: expiry, + BlsPublicKey: node.NodePoP.PublicKey[:], + }, + node.Weight, + ) + Expect(err).Should(BeNil()) + receipt := WaitForTransactionSuccess(ctx, l1Info, tx.Hash()) + registrationInitiatedEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodCreated, + ) + Expect(err).Should(BeNil()) + validationID := ids.ID(registrationInitiatedEvent.ValidationID) + + // Gather subnet-evm Warp signatures for the RegisterL1ValidatorMessage & relay to the P-Chain + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) + + _, err = pchainWallet.IssueRegisterL1ValidatorTx( + 100*units.Avax, + node.NodePoP.ProofOfPossession, + signedWarpMessage.Bytes(), + ) + Expect(err).Should(BeNil()) + PChainProposerVMWorkaround(pchainWallet) + AdvanceProposerVM(ctx, l1Info, fundedKey, 5) + + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing validator registration") + registrationSignedMessage := ConstructL1ValidatorRegistrationMessage( + validationID, + expiry, + node, + true, + l1Info, + pChainInfo, + networkID, + signatureAggregator, + ) + + // Deliver the Warp message to the L1 + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) + Expect(err).Should(BeNil()) + receipt = CallWarpReceiver( + ctx, + callData, + ownerKey, + l1Info, + validatorManagerAddress, + registrationSignedMessage.Bytes(), + ) + + // Check that the validator is registered in the staking contract + registrationEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + + return validationID +} + func InitiateAndCompletePoAValidatorRegistration( ctx context.Context, signatureAggregator *SignatureAggregator, From b49e55c286cef429f96b4880c59299862596caf6 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 6 Mar 2025 16:22:13 -0600 Subject: [PATCH 2/5] v1 migration e2e test draft --- .../PoAValidatorManager.go | 2518 +++++++++++++++++ .../PoAValidatorManagerV1/README.md | 0 tests/flows/validator-manager/poa_to_pos.go | 16 +- tests/network/network.go | 28 +- 4 files changed, 2544 insertions(+), 18 deletions(-) create mode 100644 abi-bindings/go/validator-manager/PoAValidatorManagerV1/PoAValidatorManager.go create mode 100644 abi-bindings/go/validator-manager/PoAValidatorManagerV1/README.md diff --git a/abi-bindings/go/validator-manager/PoAValidatorManagerV1/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManagerV1/PoAValidatorManager.go new file mode 100644 index 000000000..e2616ba15 --- /dev/null +++ b/abi-bindings/go/validator-manager/PoAValidatorManagerV1/PoAValidatorManager.go @@ -0,0 +1,2518 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package poavalidatormanager + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ConversionData is an auto generated low-level Go binding around an user-defined struct. +type ConversionData struct { + L1ID [32]byte + ValidatorManagerBlockchainID [32]byte + ValidatorManagerAddress common.Address + InitialValidators []InitialValidator +} + +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID []byte + BlsPublicKey []byte + Weight uint64 +} + +// PChainOwner is an auto generated low-level Go binding around an user-defined struct. +type PChainOwner struct { + Threshold uint32 + Addresses []common.Address +} + +// Validator is an auto generated low-level Go binding around an user-defined struct. +type Validator struct { + Status uint8 + NodeID []byte + StartingWeight uint64 + MessageNonce uint64 + Weight uint64 + StartedAt uint64 + EndedAt uint64 +} + +// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type ValidatorManagerSettings struct { + L1ID [32]byte + ChurnPeriodSeconds uint64 + MaximumChurnPercentage uint8 +} + +// ValidatorMessagesValidationPeriod is an auto generated low-level Go binding around an user-defined struct. +type ValidatorMessagesValidationPeriod struct { + L1ID [32]byte + NodeID []byte + BlsPublicKey []byte + RegistrationExpiry uint64 + RemainingBalanceOwner PChainOwner + DisableOwner PChainOwner + Weight uint64 +} + +// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. +type ValidatorRegistrationInput struct { + NodeID []byte + BlsPublicKey []byte + RegistrationExpiry uint64 + RemainingBalanceOwner PChainOwner + DisableOwner PChainOwner +} + +// PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. +var PoAValidatorManagerMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidBLSKeyLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"encodedConversionID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedConversionID\",\"type\":\"bytes32\"}],\"name\":\"InvalidConversionID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitializationStatus\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"name\":\"InvalidMaximumChurnPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"InvalidNodeID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"InvalidRegistrationExpiry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"churn\",\"type\":\"uint8\"}],\"name\":\"InvalidTotalWeightTest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"}],\"name\":\"InvalidValidatorManagerAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidValidatorManagerBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"name\":\"MaxChurnRateExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"NodeAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PChainOwnerAddressesNotSorted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitialValidatorCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"}],\"name\":\"ValidationPeriodCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"ValidationPeriodEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"ValidationPeriodRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"}],\"name\":\"ValidatorRemovalInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorWeightUpdate\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADDRESS_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BLS_PUBLIC_KEY_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_CHURN_PERCENTAGE_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VALIDATOR_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"startingWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startedAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endedAt\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initializeEndValidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"}],\"internalType\":\"structValidatorRegistrationInput\",\"name\":\"registrationInput\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"initializeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initializeValidatorSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"registeredValidators\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendEndValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b506040516137eb3803806137eb83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61369e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c8063a3a65e48116100a9578063d588c18f1161006e578063d588c18f14610279578063d5f20ff61461028c578063df93d8de146102ac578063f2fde38b146102ce578063fd7ac5e7146102e1575f80fd5b8063a3a65e4814610229578063b771b3bc1461023c578063bc5fbfec1461024a578063bee0a03f1461025e578063c974d1b614610271575f80fd5b8063732214f8116100ef578063732214f8146101905780638280a25a146101a55780638da5cb5b146101bf57806397fb70d4146102035780639ba96b8614610216575f80fd5b80630322ed981461012b57806320d91b7a14610140578063467ef06f1461015357806360305d6214610166578063715018a614610188575b5f80fd5b61013e6101393660046127ed565b6102f4565b005b61013e61014e36600461281c565b610584565b61013e61016136600461286a565b610b54565b61016e601481565b60405163ffffffff90911681526020015b60405180910390f35b61013e610b62565b6101975f81565b60405190815260200161017f565b6101ad603081565b60405160ff909116815260200161017f565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017f565b61013e6102113660046127ed565b610b75565b610197610224366004612899565b610b8a565b61013e61023736600461286a565b610ba6565b6101eb6005600160991b0181565b6101975f8051602061362983398151915281565b61013e61026c3660046127ed565b610d9c565b6101ad601481565b61013e6102873660046128f2565b610ed8565b61029f61029a3660046127ed565b610fe6565b60405161017f91906129af565b6102b66202a30081565b6040516001600160401b03909116815260200161017f565b61013e6102dc366004612a2f565b611135565b6101976102ef366004612a51565b611172565b5f8181525f805160206136498339815191526020526040808220815160e0810190925280545f8051602061362983398151915293929190829060ff1660058111156103415761034161292e565b60058111156103525761035261292e565b815260200160018201805461036690612abc565b80601f016020809104026020016040519081016040528092919081815260200182805461039290612abc565b80156103dd5780601f106103b4576101008083540402835291602001916103dd565b820191905f5260205f20905b8154815290600101906020018083116103c057829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156104485761044861292e565b14610484575f8381526005830160205260409081902054905163170cc93360e21b815261047b9160ff1690600401612af4565b60405180910390fd5b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af41580156104fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105229190810190612c05565b6040518263ffffffff1660e01b815260040161053e9190612c36565b6020604051808303815f875af115801561055a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057e9190612c48565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f805160206136298339815191529060ff16156105d657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063d9190612c48565b836020013514610666576040516372b0a7e760e11b81526020840135600482015260240161047b565b306106776060850160408601612a2f565b6001600160a01b0316146106ba576106956060840160408501612a2f565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161047b565b5f6106c86060850185612c5f565b905090505f805b828163ffffffff161015610930575f6106eb6060880188612c5f565b8363ffffffff1681811061070157610701612ca4565b90506020028101906107139190612cb8565b61071c90612d23565b80516040519192505f91600688019161073491612d9c565b9081526020016040518091039020541461076457805160405163a41f772f60e01b815261047b9190600401612c36565b5f6002885f01358460405160200161079392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526107ad91612d9c565b602060405180830381855afa1580156107c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107eb9190612c48565b90508086600601835f01516040516108039190612d9c565b90815260408051918290036020908101909220929092555f8381526005890190915220805460ff1916600217815582516001909101906108439082612df8565b50604082810180515f84815260058a016020529290922060028101805492516001600160401b039485166001600160c01b031990941693909317600160801b85851602176001600160c01b0316600160c01b429590951694909402939093179092556003909101805467ffffffffffffffff191690556108c39085612ecb565b82516040519195506108d491612d9c565b60408051918290038220908401516001600160401b031682529082907ffe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c9060200160405180910390a350508061092990612eeb565b90506106cf565b506003830180546fffffffffffffffff00000000000000001916600160401b6001600160401b0384168102919091179091556001840154606491610978910460ff1683612f0d565b6001600160401b031610156109c05760018301546040516334db78ed60e01b81526001600160401b0383166004820152600160401b90910460ff16602482015260440161047b565b5f73__$fd0c147b4031eef6079b0498cbafa865f0$__634d8478846109e4876111cd565b604001516040518263ffffffff1660e01b8152600401610a049190612c36565b602060405180830381865af4158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a439190612c48565b90505f73__$fd0c147b4031eef6079b0498cbafa865f0$__6387418b8e886040518263ffffffff1660e01b8152600401610a7d919061305b565b5f60405180830381865af4158015610a97573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610abe9190810190612c05565b90505f600282604051610ad19190612d9c565b602060405180830381855afa158015610aec573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b0f9190612c48565b9050828114610b3b5760405163baaea89d60e01b8152600481018290526024810184905260440161047b565b5050506007909201805460ff1916600117905550505050565b610b5d816112e3565b505050565b610b6a61169b565b610b735f6116f6565b565b610b7d61169b565b610b8681611766565b5050565b5f610b9361169b565b610b9d8383611a4b565b90505b92915050565b5f805160206136298339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f610bd9866111cd565b604001516040518263ffffffff1660e01b8152600401610bf99190612c36565b6040805180830381865af4158015610c13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3791906130fe565b9150915080610c5d57604051632d07135360e01b8152811515600482015260240161047b565b5f82815260048401602052604090208054610c7790612abc565b90505f03610c9b5760405163089938b360e11b81526004810183905260240161047b565b60015f838152600580860160205260409091205460ff1690811115610cc257610cc261292e565b14610cf5575f8281526005840160205260409081902054905163170cc93360e21b815261047b9160ff1690600401612af4565b5f8281526004840160205260408120610d0d91612761565b5f828152600584016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917f8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040902080545f805160206136298339815191529190610de390612abc565b90505f03610e075760405163089938b360e11b81526004810183905260240161047b565b60015f838152600580840160205260409091205460ff1690811115610e2e57610e2e61292e565b14610e61575f8281526005820160205260409081902054905163170cc93360e21b815261047b9160ff1690600401612af4565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92610e98920161311f565b6020604051808303815f875af1158015610eb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5d9190612c48565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610f1c5750825b90505f826001600160401b03166001148015610f375750303b155b905081158015610f45575080155b15610f635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f8d57845460ff60401b1916600160401b1785555b610f978787611fbd565b8315610fdd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610fee612798565b5f8281525f80516020613649833981519152602052604090819020815160e0810190925280545f80516020613629833981519152929190829060ff16600581111561103b5761103b61292e565b600581111561104c5761104c61292e565b815260200160018201805461106090612abc565b80601f016020809104026020016040519081016040528092919081815260200182805461108c90612abc565b80156110d75780601f106110ae576101008083540402835291602001916110d7565b820191905f5260205f20905b8154815290600101906020018083116110ba57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b61113d61169b565b6001600160a01b03811661116657604051631e4fbdf760e01b81525f600482015260240161047b565b61116f816116f6565b50565b6040515f905f80516020613629833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06906111b590869086906131a9565b90815260200160405180910390205491505092915050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611231573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125891908101906131b8565b915091508061127a57604051636b2f19e960e01b815260040160405180910390fd5b8151156112a0578151604051636ba589a560e01b8152600481019190915260240161047b565b60208201516001600160a01b0316156112dc576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161047b565b5092915050565b5f6112ec612798565b5f805160206136298339815191525f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63021de88f61131f886111cd565b604001516040518263ffffffff1660e01b815260040161133f9190612c36565b6040805180830381865af4158015611359573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061137d91906130fe565b9150915080156113a457604051632d07135360e01b8152811515600482015260240161047b565b5f82815260058085016020526040808320815160e08101909252805491929091839160ff909116908111156113db576113db61292e565b60058111156113ec576113ec61292e565b815260200160018201805461140090612abc565b80601f016020809104026020016040519081016040528092919081815260200182805461142c90612abc565b80156114775780601f1061144e57610100808354040283529160200191611477565b820191905f5260205f20905b81548152906001019060200180831161145a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156114e2576114e261292e565b1415801561150357506001815160058111156115005761150061292e565b14155b1561152457805160405163170cc93360e21b815261047b9190600401612af4565b6003815160058111156115395761153961292e565b03611547576004815261154c565b600581525b8360060181602001516040516115629190612d9c565b90815260408051602092819003830190205f90819055858152600587810190935220825181548493839160ff19169060019084908111156115a5576115a561292e565b0217905550602082015160018201906115be9082612df8565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156116645761166461292e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336116cd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b735760405163118cdaa760e01b815233600482015260240161047b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61176e612798565b5f8281525f805160206136498339815191526020526040808220815160e0810190925280545f8051602061362983398151915293929190829060ff1660058111156117bb576117bb61292e565b60058111156117cc576117cc61292e565b81526020016001820180546117e090612abc565b80601f016020809104026020016040519081016040528092919081815260200182805461180c90612abc565b80156118575780601f1061182e57610100808354040283529160200191611857565b820191905f5260205f20905b81548152906001019060200180831161183a57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a090910152909150815160058111156118c5576118c561292e565b146118f8575f8481526005830160205260409081902054905163170cc93360e21b815261047b9160ff1690600401612af4565b60038152426001600160401b031660c08201525f84815260058381016020526040909120825181548493839160ff191690600190849081111561193d5761193d61292e565b0217905550602082015160018201906119569082612df8565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6119f48582611fd7565b6080840151604080516001600160401b03909216825242602083015291935083925087917ffbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07545f9060ff16611a8f57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061362983398151915242611aae6060860160408701613245565b6001600160401b0316111580611ae85750611acc6202a3004261325e565b611adc6060860160408701613245565b6001600160401b031610155b15611b2257611afd6060850160408601613245565b604051635879da1360e11b81526001600160401b03909116600482015260240161047b565b60038101546001600160401b0390611b4590600160401b9004821685831661325e565b1115611b6f57604051633e1a785160e01b81526001600160401b038416600482015260240161047b565b611b84611b7f6060860186613271565b6121ae565b611b94611b7f6080860186613271565b6030611ba36020860186613285565b905014611bd557611bb76020850185613285565b6040516326475b2f60e11b815261047b925060040190815260200190565b611bdf8480613285565b90505f03611c0c57611bf18480613285565b604051633e08a12560e11b815260040161047b9291906132c7565b5f60068201611c1b8680613285565b604051611c299291906131a9565b90815260200160405180910390205414611c6257611c478480613285565b60405163a41f772f60e01b815260040161047b9291906132c7565b611c6c835f612317565b6040805160e08101909152815481525f90819073__$fd0c147b4031eef6079b0498cbafa865f0$__9063eb97ce519060208101611ca98a80613285565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611cf1908b018b613285565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611d3a60608b0160408c01613245565b6001600160401b03168152602001611d5560608b018b613271565b611d5e906132da565b8152602001611d7060808b018b613271565b611d79906132da565b8152602001886001600160401b03168152506040518263ffffffff1660e01b8152600401611da79190613407565b5f60405180830381865af4158015611dc1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611de891908101906134be565b5f82815260048601602052604090209193509150611e068282612df8565b508160068401611e168880613285565b604051611e249291906131a9565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e60908590600401612c36565b6020604051808303815f875af1158015611e7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea09190612c48565b5f8481526005860160205260409020805460ff191660011790559050611ec68780613285565b5f858152600587016020526040902060010191611ee4919083613501565b505f83815260058501602052604090206002810180546001600160c01b0319166001600160401b038916908117600160801b91909102176001600160c01b03169055600301805467ffffffffffffffff1916905580611f438880613285565b604051611f519291906131a9565b6040518091039020847fd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49898b6040016020810190611f8f9190613245565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611fc5612581565b611fce826125ca565b610b86816125e3565b5f8281525f80516020613649833981519152602052604081206002015481905f8051602061362983398151915290600160801b90046001600160401b031661201f8582612317565b5f612029876125f4565b5f888152600585016020526040808220600201805467ffffffffffffffff60801b1916600160801b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$fd0c147b4031eef6079b0498cbafa865f0$__9063854a893f906064015f60405180830381865af41580156120d2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120f99190810190612c05565b6040518263ffffffff1660e01b81526004016121159190612c36565b6020604051808303815f875af1158015612131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121559190612c48565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6121bb602082018261286a565b63ffffffff161580156121db57506121d66020820182612c5f565b151590505b15612222576121ed602082018261286a565b6121fa6020830183612c5f565b60405163c08a0f1d60e01b815263ffffffff909316600484015260248301525060440161047b565b61222f6020820182612c5f565b905061223e602083018361286a565b63ffffffff161115612257576121ed602082018261286a565b60015b6122676020830183612c5f565b9050811015610b865761227d6020830183612c5f565b6122886001846135ba565b81811061229757612297612ca4565b90506020020160208101906122ac9190612a2f565b6001600160a01b03166122c26020840184612c5f565b838181106122d2576122d2612ca4565b90506020020160208101906122e79190612a2f565b6001600160a01b0316101561230f57604051630dbc8d5f60e31b815260040160405180910390fd5b60010161225a565b5f805160206136298339815191525f6001600160401b03808416908516111561234b5761234483856135cd565b9050612358565b61235584846135cd565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b90049092166060820152429115806123c55750600184015481516123c1916001600160401b03169061325e565b8210155b156123ed576001600160401b038084166060830152828252604082015116602082015261240c565b82816060018181516123ff9190612ecb565b6001600160401b03169052505b606081015161241c906064612f0d565b602082015160018601546001600160401b0392909216916124479190600160401b900460ff16612f0d565b6001600160401b0316101561248057606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161047b565b85816040018181516124929190612ecb565b6001600160401b03169052506040810180518691906124b29083906135cd565b6001600160401b0316905250600184015460408201516064916124e091600160401b90910460ff1690612f0d565b6001600160401b03161015612519576040808201519051633e1a785160e01b81526001600160401b03909116600482015260240161047b565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b7357604051631afcd79f60e31b815260040160405180910390fd5b6125d2612581565b6125da612669565b61116f81612671565b6125eb612581565b61116f81612759565b5f8181525f805160206136498339815191526020526040812060020180545f80516020613629833981519152919060089061263e90600160401b90046001600160401b03166135ed565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610b73612581565b612679612581565b80355f80516020613629833981519152908155601461269e6060840160408501613608565b60ff1611806126bd57506126b86060830160408401613608565b60ff16155b156126f1576126d26060830160408401613608565b604051634a59bbff60e11b815260ff909116600482015260240161047b565b6127016060830160408401613608565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556127326040830160208401613245565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61113d612581565b50805461276d90612abc565b5f825580601f1061277c575050565b601f0160209004905f5260205f209081019061116f91906127d5565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b808211156127e9575f81556001016127d6565b5090565b5f602082840312156127fd575f80fd5b5035919050565b803563ffffffff81168114612817575f80fd5b919050565b5f806040838503121561282d575f80fd5b82356001600160401b03811115612842575f80fd5b830160808186031215612853575f80fd5b915061286160208401612804565b90509250929050565b5f6020828403121561287a575f80fd5b610b9d82612804565b80356001600160401b0381168114612817575f80fd5b5f80604083850312156128aa575f80fd5b82356001600160401b038111156128bf575f80fd5b830160a081860312156128d0575f80fd5b915061286160208401612883565b6001600160a01b038116811461116f575f80fd5b5f808284036080811215612904575f80fd5b6060811215612911575f80fd5b508291506060830135612923816128de565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b6006811061295e57634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b8381101561297c578181015183820152602001612964565b50505f910152565b5f815180845261299b816020860160208601612962565b601f01601f19169290920160200192915050565b602081526129c1602082018351612942565b5f602083015160e060408401526129dc610100840182612984565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612a3f575f80fd5b8135612a4a816128de565b9392505050565b5f8060208385031215612a62575f80fd5b82356001600160401b0380821115612a78575f80fd5b818501915085601f830112612a8b575f80fd5b813581811115612a99575f80fd5b866020828501011115612aaa575f80fd5b60209290920196919550909350505050565b600181811c90821680612ad057607f821691505b602082108103612aee57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610ba08284612942565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b3857612b38612b02565b60405290565b604080519081016001600160401b0381118282101715612b3857612b38612b02565b604051601f8201601f191681016001600160401b0381118282101715612b8857612b88612b02565b604052919050565b5f6001600160401b03821115612ba857612ba8612b02565b50601f01601f191660200190565b5f82601f830112612bc5575f80fd5b8151612bd8612bd382612b90565b612b60565b818152846020838601011115612bec575f80fd5b612bfd826020830160208701612962565b949350505050565b5f60208284031215612c15575f80fd5b81516001600160401b03811115612c2a575f80fd5b612bfd84828501612bb6565b602081525f610b9d6020830184612984565b5f60208284031215612c58575f80fd5b5051919050565b5f808335601e19843603018112612c74575f80fd5b8301803591506001600160401b03821115612c8d575f80fd5b6020019150600581901b36038213156121a7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612ccc575f80fd5b9190910192915050565b5f82601f830112612ce5575f80fd5b8135612cf3612bd382612b90565b818152846020838601011115612d07575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215612d33575f80fd5b612d3b612b16565b82356001600160401b0380821115612d51575f80fd5b612d5d36838701612cd6565b83526020850135915080821115612d72575f80fd5b50612d7f36828601612cd6565b602083015250612d9160408401612883565b604082015292915050565b5f8251612ccc818460208701612962565b601f821115610b5d57805f5260205f20601f840160051c81016020851015612dd25750805b601f840160051c820191505b81811015612df1575f8155600101612dde565b5050505050565b81516001600160401b03811115612e1157612e11612b02565b612e2581612e1f8454612abc565b84612dad565b602080601f831160018114612e58575f8415612e415750858301515b5f19600386901b1c1916600185901b178555612eaf565b5f85815260208120601f198616915b82811015612e8657888601518255948401946001909101908401612e67565b5085821015612ea357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156112dc576112dc612eb7565b5f63ffffffff808316818103612f0357612f03612eb7565b6001019392505050565b6001600160401b03818116838216028082169190828114612f3057612f30612eb7565b505092915050565b5f808335601e19843603018112612f4d575f80fd5b83016020810192503590506001600160401b03811115612f6b575f80fd5b8036038213156121a7575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208086019550808560051b830101845f5b8781101561304e57848303601f19018952813536889003605e19018112612fdd575f80fd5b87016060612feb8280612f38565b828752612ffb8388018284612f79565b9250505061300b86830183612f38565b8683038888015261301d838284612f79565b9250505060406001600160401b03613036828501612883565b16950194909452509783019790830190600101612fb8565b5090979650505050505050565b6020815281356020820152602082013560408201525f604083013561307f816128de565b6001600160a01b031660608381019190915283013536849003601e190181126130a6575f80fd5b83016020810190356001600160401b038111156130c1575f80fd5b8060051b36038213156130d2575f80fd5b6080808501526130e660a085018284612fa1565b95945050505050565b80518015158114612817575f80fd5b5f806040838503121561310f575f80fd5b82519150612861602084016130ef565b5f60208083525f845461313181612abc565b806020870152604060018084165f8114613152576001811461316e5761319b565b60ff19851660408a0152604084151560051b8a0101955061319b565b895f5260205f205f5b858110156131925781548b8201860152908301908801613177565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b5f80604083850312156131c9575f80fd5b82516001600160401b03808211156131df575f80fd5b90840190606082870312156131f2575f80fd5b6131fa612b16565b82518152602083015161320c816128de565b6020820152604083015182811115613222575f80fd5b61322e88828601612bb6565b6040830152509350612861915050602084016130ef565b5f60208284031215613255575f80fd5b610b9d82612883565b80820180821115610ba057610ba0612eb7565b5f8235603e19833603018112612ccc575f80fd5b5f808335601e1984360301811261329a575f80fd5b8301803591506001600160401b038211156132b3575f80fd5b6020019150368190038213156121a7575f80fd5b602081525f612bfd602083018486612f79565b5f604082360312156132ea575f80fd5b6132f2612b3e565b6132fb83612804565b81526020808401356001600160401b0380821115613317575f80fd5b9085019036601f830112613329575f80fd5b81358181111561333b5761333b612b02565b8060051b915061334c848301612b60565b8181529183018401918481019036841115613365575f80fd5b938501935b8385101561338f578435925061337f836128de565b828252938501939085019061336a565b94860194909452509295945050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156133fc5784516001600160a01b031682529383019360019290920191908301906133d3565b509695505050505050565b60208152815160208201525f602083015160e0604084015261342d610100840182612984565b90506040840151601f198085840301606086015261344b8383612984565b92506001600160401b03606087015116608086015260808601519150808584030160a086015261347b83836133a1565b925060a08601519150808584030160c08601525061349982826133a1565b91505060c08401516134b660e08501826001600160401b03169052565b509392505050565b5f80604083850312156134cf575f80fd5b8251915060208301516001600160401b038111156134eb575f80fd5b6134f785828601612bb6565b9150509250929050565b6001600160401b0383111561351857613518612b02565b61352c836135268354612abc565b83612dad565b5f601f84116001811461355d575f85156135465750838201355b5f19600387901b1c1916600186901b178355612df1565b5f83815260208120601f198716915b8281101561358c578685013582556020948501946001909201910161356c565b50868210156135a8575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81810381811115610ba057610ba0612eb7565b6001600160401b038281168282160390808211156112dc576112dc612eb7565b5f6001600160401b03808316818103612f0357612f03612eb7565b5f60208284031215613618575f80fd5b813560ff81168114612a4a575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05a26469706673582212207169c5aa40d8ffd8e1fbcb4ec59b3798585699e977d52ef5afb364ed5d231e0864736f6c63430008190033", +} + +// PoAValidatorManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use PoAValidatorManagerMetaData.ABI instead. +var PoAValidatorManagerABI = PoAValidatorManagerMetaData.ABI + +// PoAValidatorManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use PoAValidatorManagerMetaData.Bin instead. +var PoAValidatorManagerBin = PoAValidatorManagerMetaData.Bin + +// DeployPoAValidatorManager deploys a new Ethereum contract, binding an instance of PoAValidatorManager to it. +func DeployPoAValidatorManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *PoAValidatorManager, error) { + parsed, err := PoAValidatorManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + validatorMessagesAddr, _, _, _ := DeployValidatorMessages(auth, backend) + PoAValidatorManagerBin = strings.ReplaceAll(PoAValidatorManagerBin, "__$fd0c147b4031eef6079b0498cbafa865f0$__", validatorMessagesAddr.String()[2:]) + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PoAValidatorManagerBin), backend, init) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &PoAValidatorManager{PoAValidatorManagerCaller: PoAValidatorManagerCaller{contract: contract}, PoAValidatorManagerTransactor: PoAValidatorManagerTransactor{contract: contract}, PoAValidatorManagerFilterer: PoAValidatorManagerFilterer{contract: contract}}, nil +} + +// PoAValidatorManager is an auto generated Go binding around an Ethereum contract. +type PoAValidatorManager struct { + PoAValidatorManagerCaller // Read-only binding to the contract + PoAValidatorManagerTransactor // Write-only binding to the contract + PoAValidatorManagerFilterer // Log filterer for contract events +} + +// PoAValidatorManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type PoAValidatorManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PoAValidatorManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type PoAValidatorManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PoAValidatorManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type PoAValidatorManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PoAValidatorManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type PoAValidatorManagerSession struct { + Contract *PoAValidatorManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PoAValidatorManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type PoAValidatorManagerCallerSession struct { + Contract *PoAValidatorManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// PoAValidatorManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type PoAValidatorManagerTransactorSession struct { + Contract *PoAValidatorManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PoAValidatorManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type PoAValidatorManagerRaw struct { + Contract *PoAValidatorManager // Generic contract binding to access the raw methods on +} + +// PoAValidatorManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type PoAValidatorManagerCallerRaw struct { + Contract *PoAValidatorManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// PoAValidatorManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type PoAValidatorManagerTransactorRaw struct { + Contract *PoAValidatorManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewPoAValidatorManager creates a new instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManager(address common.Address, backend bind.ContractBackend) (*PoAValidatorManager, error) { + contract, err := bindPoAValidatorManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &PoAValidatorManager{PoAValidatorManagerCaller: PoAValidatorManagerCaller{contract: contract}, PoAValidatorManagerTransactor: PoAValidatorManagerTransactor{contract: contract}, PoAValidatorManagerFilterer: PoAValidatorManagerFilterer{contract: contract}}, nil +} + +// NewPoAValidatorManagerCaller creates a new read-only instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManagerCaller(address common.Address, caller bind.ContractCaller) (*PoAValidatorManagerCaller, error) { + contract, err := bindPoAValidatorManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &PoAValidatorManagerCaller{contract: contract}, nil +} + +// NewPoAValidatorManagerTransactor creates a new write-only instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*PoAValidatorManagerTransactor, error) { + contract, err := bindPoAValidatorManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &PoAValidatorManagerTransactor{contract: contract}, nil +} + +// NewPoAValidatorManagerFilterer creates a new log filterer instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*PoAValidatorManagerFilterer, error) { + contract, err := bindPoAValidatorManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &PoAValidatorManagerFilterer{contract: contract}, nil +} + +// bindPoAValidatorManager binds a generic wrapper to an already deployed contract. +func bindPoAValidatorManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := PoAValidatorManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_PoAValidatorManager *PoAValidatorManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PoAValidatorManager.Contract.PoAValidatorManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_PoAValidatorManager *PoAValidatorManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.PoAValidatorManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_PoAValidatorManager *PoAValidatorManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.PoAValidatorManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_PoAValidatorManager *PoAValidatorManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PoAValidatorManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.contract.Transact(opts, method, params...) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "ADDRESS_LENGTH") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_PoAValidatorManager *PoAValidatorManagerSession) ADDRESSLENGTH() (uint32, error) { + return _PoAValidatorManager.Contract.ADDRESSLENGTH(&_PoAValidatorManager.CallOpts) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ADDRESSLENGTH() (uint32, error) { + return _PoAValidatorManager.Contract.ADDRESSLENGTH(&_PoAValidatorManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _PoAValidatorManager.Contract.BLSPUBLICKEYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _PoAValidatorManager.Contract.BLSPUBLICKEYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _PoAValidatorManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _PoAValidatorManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _PoAValidatorManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _PoAValidatorManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) PCHAINBLOCKCHAINID(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "P_CHAIN_BLOCKCHAIN_ID") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerSession) PCHAINBLOCKCHAINID() ([32]byte, error) { + return _PoAValidatorManager.Contract.PCHAINBLOCKCHAINID(&_PoAValidatorManager.CallOpts) +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) PCHAINBLOCKCHAINID() ([32]byte, error) { + return _PoAValidatorManager.Contract.PCHAINBLOCKCHAINID(&_PoAValidatorManager.CallOpts) +} + +// VALIDATORMANAGERSTORAGELOCATION is a free data retrieval call binding the contract method 0xbc5fbfec. +// +// Solidity: function VALIDATOR_MANAGER_STORAGE_LOCATION() view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) VALIDATORMANAGERSTORAGELOCATION(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "VALIDATOR_MANAGER_STORAGE_LOCATION") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// VALIDATORMANAGERSTORAGELOCATION is a free data retrieval call binding the contract method 0xbc5fbfec. +// +// Solidity: function VALIDATOR_MANAGER_STORAGE_LOCATION() view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerSession) VALIDATORMANAGERSTORAGELOCATION() ([32]byte, error) { + return _PoAValidatorManager.Contract.VALIDATORMANAGERSTORAGELOCATION(&_PoAValidatorManager.CallOpts) +} + +// VALIDATORMANAGERSTORAGELOCATION is a free data retrieval call binding the contract method 0xbc5fbfec. +// +// Solidity: function VALIDATOR_MANAGER_STORAGE_LOCATION() view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) VALIDATORMANAGERSTORAGELOCATION() ([32]byte, error) { + return _PoAValidatorManager.Contract.VALIDATORMANAGERSTORAGELOCATION(&_PoAValidatorManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "WARP_MESSENGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerSession) WARPMESSENGER() (common.Address, error) { + return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) WARPMESSENGER() (common.Address, error) { + return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) +func (_PoAValidatorManager *PoAValidatorManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "getValidator", validationID) + + if err != nil { + return *new(Validator), err + } + + out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) + + return out0, err + +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) +func (_PoAValidatorManager *PoAValidatorManagerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerSession) Owner() (common.Address, error) { + return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) Owner() (common.Address, error) { + return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) +} + +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. +// +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID []byte) ([32]byte, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "registeredValidators", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. +// +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerSession) RegisteredValidators(nodeID []byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.RegisteredValidators(&_PoAValidatorManager.CallOpts, nodeID) +} + +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. +// +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) RegisteredValidators(nodeID []byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.RegisteredValidators(&_PoAValidatorManager.CallOpts, nodeID) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "completeEndValidation", messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// Initialize is a paid mutator transaction binding the contract method 0xd588c18f. +// +// Solidity: function initialize((bytes32,uint64,uint8) settings, address initialOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) Initialize(opts *bind.TransactOpts, settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initialize", settings, initialOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xd588c18f. +// +// Solidity: function initialize((bytes32,uint64,uint8) settings, address initialOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xd588c18f. +// +// Solidity: function initialize((bytes32,uint64,uint8) settings, address initialOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. +// +// Solidity: function initializeEndValidation(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeEndValidation", validationID) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. +// +// Solidity: function initializeEndValidation(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeEndValidation(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. +// +// Solidity: function initializeEndValidation(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeEndValidation(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x9ba96b86. +// +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint64 weight) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, weight) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x9ba96b86. +// +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint64 weight) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x9ba96b86. +// +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint64 weight) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, conversionData ConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorSet", conversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorSet(conversionData ConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, conversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorSet(conversionData ConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, conversionData, messageIndex) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) RenounceOwnership() (*types.Transaction, error) { + return _PoAValidatorManager.Contract.RenounceOwnership(&_PoAValidatorManager.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _PoAValidatorManager.Contract.RenounceOwnership(&_PoAValidatorManager.TransactOpts) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendEndValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendEndValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendRegisterValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendRegisterValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) +} + +// PoAValidatorManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialValidatorCreatedIterator struct { + Event *PoAValidatorManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID common.Hash + Weight uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte) (*PoAValidatorManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerInitialValidatorCreatedIterator{contract: _PoAValidatorManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerInitialValidatorCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xfe3e5983f71c8253fb0b678f2bc587aa8574d8f1aab9cf82b983777f5998392c. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint64 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*PoAValidatorManagerInitialValidatorCreated, error) { + event := new(PoAValidatorManagerInitialValidatorCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitializedIterator struct { + Event *PoAValidatorManagerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerInitialized represents a Initialized event raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*PoAValidatorManagerInitializedIterator, error) { + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &PoAValidatorManagerInitializedIterator{contract: _PoAValidatorManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialized(log types.Log) (*PoAValidatorManagerInitialized, error) { + event := new(PoAValidatorManagerInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the PoAValidatorManager contract. +type PoAValidatorManagerOwnershipTransferredIterator struct { + Event *PoAValidatorManagerOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerOwnershipTransferred represents a OwnershipTransferred event raised by the PoAValidatorManager contract. +type PoAValidatorManagerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*PoAValidatorManagerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerOwnershipTransferredIterator{contract: _PoAValidatorManager.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerOwnershipTransferred) + if err := _PoAValidatorManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseOwnershipTransferred(log types.Log) (*PoAValidatorManagerOwnershipTransferred, error) { + event := new(PoAValidatorManagerOwnershipTransferred) + if err := _PoAValidatorManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodCreatedIterator struct { + Event *PoAValidatorManagerValidationPeriodCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodCreated struct { + ValidationID [32]byte + NodeID common.Hash + RegisterValidationMessageID [32]byte + Weight uint64 + RegistrationExpiry uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (*PoAValidatorManagerValidationPeriodCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidationPeriodCreatedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidationPeriodCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xd8a184af94a03e121609cc5f803a446236793e920c7945abc6ba355c8a30cb49. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint64 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*PoAValidatorManagerValidationPeriodCreated, error) { + event := new(PoAValidatorManagerValidationPeriodCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodEndedIterator struct { + Event *PoAValidatorManagerValidationPeriodEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidationPeriodEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidationPeriodEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidationPeriodEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodEnded struct { + ValidationID [32]byte + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*PoAValidatorManagerValidationPeriodEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidationPeriodEndedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidationPeriodEnded) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*PoAValidatorManagerValidationPeriodEnded, error) { + event := new(PoAValidatorManagerValidationPeriodEnded) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodRegisteredIterator struct { + Event *PoAValidatorManagerValidationPeriodRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodRegistered struct { + ValidationID [32]byte + Weight uint64 + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*PoAValidatorManagerValidationPeriodRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidationPeriodRegisteredIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidationPeriodRegistered) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0x8629ec2bfd8d3b792ba269096bb679e08f20ba2caec0785ef663cf94788e349b. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint64 weight, uint256 timestamp) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*PoAValidatorManagerValidationPeriodRegistered, error) { + event := new(PoAValidatorManagerValidationPeriodRegistered) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorRemovalInitializedIterator struct { + Event *PoAValidatorManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Weight uint64 + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*PoAValidatorManagerValidatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidatorRemovalInitializedIterator{contract: _PoAValidatorManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidatorRemovalInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0xfbfc4c00cddda774e9bce93712e29d12887b46526858a1afb0937cce8c30fa42. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint64 weight, uint256 endTime) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*PoAValidatorManagerValidatorRemovalInitialized, error) { + event := new(PoAValidatorManagerValidatorRemovalInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorWeightUpdateIterator struct { + Event *PoAValidatorManagerValidatorWeightUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorWeightUpdate struct { + ValidationID [32]byte + Nonce uint64 + Weight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*PoAValidatorManagerValidatorWeightUpdateIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidatorWeightUpdateIterator{contract: _PoAValidatorManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil +} + +// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidatorWeightUpdate) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 weight, bytes32 setWeightMessageID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*PoAValidatorManagerValidatorWeightUpdate, error) { + event := new(PoAValidatorManagerValidatorWeightUpdate) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorMessagesMetaData contains all meta data concerning the ValidatorMessages contract. +var ValidatorMessagesMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"name\":\"InvalidBLSPublicKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"}],\"name\":\"InvalidCodecID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"actual\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageType\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"validatorManagerBlockchainID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"validatorManagerAddress\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structInitialValidator[]\",\"name\":\"initialValidators\",\"type\":\"tuple[]\"}],\"internalType\":\"structConversionData\",\"name\":\"conversionData\",\"type\":\"tuple\"}],\"name\":\"packConversionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"valid\",\"type\":\"bool\"}],\"name\":\"packL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"packL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"validationPeriod\",\"type\":\"tuple\"}],\"name\":\"packRegisterL1ValidatorMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"conversionID\",\"type\":\"bytes32\"}],\"name\":\"packSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"packValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorRegistrationMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackL1ValidatorWeightMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackRegisterL1ValidatorMessage\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"l1ID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorMessages.ValidationPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackSubnetToL1ConversionMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"input\",\"type\":\"bytes\"}],\"name\":\"unpackValidationUptimeMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", + Bin: "0x61217b610034600b8282823980515f1a607314602857634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100b1575f3560e01c8063854a893f11610079578063854a893f146101b257806387418b8e1461020f5780639b83546514610222578063a699c13514610242578063e1d68f3014610255578063eb97ce5114610268575f80fd5b8063021de88f146100b5578063088c2463146100e25780634d8478841461011257806350782b0f146101335780637f7c427a1461016b575b5f80fd5b6100c86100c33660046118a9565b610289565b604080519283529015156020830152015b60405180910390f35b6100f56100f03660046118a9565b61044a565b604080519283526001600160401b039091166020830152016100d9565b6101256101203660046118a9565b61063b565b6040519081526020016100d9565b6101466101413660046118a9565b6107c8565b604080519384526001600160401b0392831660208501529116908201526060016100d9565b6101a56101793660046118e2565b604080515f60208201819052602282015260268082019390935281518082039093018352604601905290565b6040516100d99190611946565b6101a56101c036600461197a565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6101a561021d3660046119eb565b610a1e565b6102356102303660046118a9565b610b60565b6040516100d99190611bb4565b6101a5610250366004611c6b565b6114ab565b6101a5610263366004611c9d565b6114ef565b61027b610276366004611d80565b611525565b6040516100d9929190611e7c565b5f8082516027146102c457825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044015b60405180910390fd5b5f805b6002811015610313576102db816001611ea8565b6102e6906008611ebb565b61ffff168582815181106102fc576102fc611ed2565b016020015160f81c901b91909117906001016102c7565b5061ffff81161561033d5760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561039857610354816003611ea8565b61035f906008611ebb565b63ffffffff1686610371836002611ee6565b8151811061038157610381611ed2565b016020015160f81c901b9190911790600101610340565b5063ffffffff81166002146103c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015610415576103d781601f611ea8565b6103e2906008611ebb565b876103ee836006611ee6565b815181106103fe576103fe611ed2565b016020015160f81c901b91909117906001016103c3565b505f8660268151811061042a5761042a611ed2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461048057825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016102bb565b5f805b60028110156104cf57610497816001611ea8565b6104a2906008611ebb565b61ffff168582815181106104b8576104b8611ed2565b016020015160f81c901b9190911790600101610483565b5061ffff8116156104f95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561055457610510816003611ea8565b61051b906008611ebb565b63ffffffff168661052d836002611ee6565b8151811061053d5761053d611ed2565b016020015160f81c901b91909117906001016104fc565b5063ffffffff81161561057a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156105cf5761059181601f611ea8565b61059c906008611ebb565b876105a8836006611ee6565b815181106105b8576105b8611ed2565b016020015160f81c901b919091179060010161057d565b505f805b600881101561062e576105e7816007611ea8565b6105f2906008611ebb565b6001600160401b031688610607836026611ee6565b8151811061061757610617611ed2565b016020015160f81c901b91909117906001016105d3565b5090969095509350505050565b5f815160261461067057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016102bb565b5f805b60028110156106bf57610687816001611ea8565b610692906008611ebb565b61ffff168482815181106106a8576106a8611ed2565b016020015160f81c901b9190911790600101610673565b5061ffff8116156106e95760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b600481101561074457610700816003611ea8565b61070b906008611ebb565b63ffffffff168561071d836002611ee6565b8151811061072d5761072d611ed2565b016020015160f81c901b91909117906001016106ec565b5063ffffffff81161561076a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156107bf5761078181601f611ea8565b61078c906008611ebb565b86610798836006611ee6565b815181106107a8576107a8611ed2565b016020015160f81c901b919091179060010161076d565b50949350505050565b5f805f83516036146107ff57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016102bb565b5f805b600281101561084e57610816816001611ea8565b610821906008611ebb565b61ffff1686828151811061083757610837611ed2565b016020015160f81c901b9190911790600101610802565b5061ffff8116156108785760405163407b587360e01b815261ffff821660048201526024016102bb565b5f805b60048110156108d35761088f816003611ea8565b61089a906008611ebb565b63ffffffff16876108ac836002611ee6565b815181106108bc576108bc611ed2565b016020015160f81c901b919091179060010161087b565b5063ffffffff81166003146108fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156109505761091281601f611ea8565b61091d906008611ebb565b88610929836006611ee6565b8151811061093957610939611ed2565b016020015160f81c901b91909117906001016108fe565b505f805b60088110156109af57610968816007611ea8565b610973906008611ebb565b6001600160401b031689610988836026611ee6565b8151811061099857610998611ed2565b016020015160f81c901b9190911790600101610954565b505f805b6008811015610a0e576109c7816007611ea8565b6109d2906008611ebb565b6001600160401b03168a6109e783602e611ee6565b815181106109f7576109f7611ed2565b016020015160f81c901b91909117906001016109b3565b5091989097509095509350505050565b80516020808301516040808501516060868101515192515f95810186905260228101969096526042860193909352600560e21b60628601526bffffffffffffffffffffffff1990831b16606685015260e01b6001600160e01b031916607a84015291607e0160405160208183030381529060405290505f5b836060015151811015610b59578184606001518281518110610aba57610aba611ed2565b60200260200101515f01515185606001518381518110610adc57610adc611ed2565b60200260200101515f015186606001518481518110610afd57610afd611ed2565b60200260200101516020015187606001518581518110610b1f57610b1f611ed2565b602002602001015160400151604051602001610b3f959493929190611ef9565b60408051601f198184030181529190529150600101610a96565b5092915050565b610b68611712565b5f610b71611712565b5f805b6002811015610bcf57610b88816001611ea8565b610b93906008611ebb565b61ffff1686610ba863ffffffff871684611ee6565b81518110610bb857610bb8611ed2565b016020015160f81c901b9190911790600101610b74565b5061ffff811615610bf95760405163407b587360e01b815261ffff821660048201526024016102bb565b610c04600284611f72565b9250505f805b6004811015610c6957610c1e816003611ea8565b610c29906008611ebb565b63ffffffff16868563ffffffff1683610c429190611ee6565b81518110610c5257610c52611ed2565b016020015160f81c901b9190911790600101610c0a565b5063ffffffff8116600114610c9157604051635b60892f60e01b815260040160405180910390fd5b610c9c600484611f72565b9250505f805b6020811015610cf957610cb681601f611ea8565b610cc1906008611ebb565b86610cd263ffffffff871684611ee6565b81518110610ce257610ce2611ed2565b016020015160f81c901b9190911790600101610ca2565b50808252610d08602084611f72565b9250505f805b6004811015610d6d57610d22816003611ea8565b610d2d906008611ebb565b63ffffffff16868563ffffffff1683610d469190611ee6565b81518110610d5657610d56611ed2565b016020015160f81c901b9190911790600101610d0e565b50610d79600484611f72565b92505f8163ffffffff166001600160401b03811115610d9a57610d9a61176c565b6040519080825280601f01601f191660200182016040528015610dc4576020820181803683370190505b5090505f5b8263ffffffff16811015610e335786610de863ffffffff871683611ee6565b81518110610df857610df8611ed2565b602001015160f81c60f81b828281518110610e1557610e15611ed2565b60200101906001600160f81b03191690815f1a905350600101610dc9565b5060208301819052610e458285611f72565b604080516030808252606082019092529195505f92506020820181803683370190505090505f5b6030811015610ed15786610e8663ffffffff871683611ee6565b81518110610e9657610e96611ed2565b602001015160f81c60f81b828281518110610eb357610eb3611ed2565b60200101906001600160f81b03191690815f1a905350600101610e6c565b5060408301819052610ee4603085611f72565b9350505f805b6008811015610f4a57610efe816007611ea8565b610f09906008611ebb565b6001600160401b031687610f2363ffffffff881684611ee6565b81518110610f3357610f33611ed2565b016020015160f81c901b9190911790600101610eea565b506001600160401b0381166060840152610f65600885611f72565b9350505f805f5b6004811015610fcb57610f80816003611ea8565b610f8b906008611ebb565b63ffffffff16888763ffffffff1683610fa49190611ee6565b81518110610fb457610fb4611ed2565b016020015160f81c901b9190911790600101610f6c565b50610fd7600486611f72565b94505f5b600481101561103a57610fef816003611ea8565b610ffa906008611ebb565b63ffffffff16888763ffffffff16836110139190611ee6565b8151811061102357611023611ed2565b016020015160f81c901b9290921791600101610fdb565b50611046600486611f72565b94505f8263ffffffff166001600160401b038111156110675761106761176c565b604051908082528060200260200182016040528015611090578160200160208202803683370190505b5090505f5b8363ffffffff16811015611178576040805160148082528183019092525f916020820181803683370190505090505f5b601481101561112a578a6110df63ffffffff8b1683611ee6565b815181106110ef576110ef611ed2565b602001015160f81c60f81b82828151811061110c5761110c611ed2565b60200101906001600160f81b03191690815f1a9053506001016110c5565b505f601482015190508084848151811061114657611146611ed2565b6001600160a01b039092166020928302919091019091015261116960148a611f72565b98505050806001019050611095565b506040805180820190915263ffffffff9092168252602082015260808401525f80805b60048110156111fa576111af816003611ea8565b6111ba906008611ebb565b63ffffffff16898863ffffffff16836111d39190611ee6565b815181106111e3576111e3611ed2565b016020015160f81c901b919091179060010161119b565b50611206600487611f72565b95505f5b60048110156112695761121e816003611ea8565b611229906008611ebb565b63ffffffff16898863ffffffff16836112429190611ee6565b8151811061125257611252611ed2565b016020015160f81c901b929092179160010161120a565b50611275600487611f72565b95505f8263ffffffff166001600160401b038111156112965761129661176c565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5090505f5b8363ffffffff168110156113a7576040805160148082528183019092525f916020820181803683370190505090505f5b6014811015611359578b61130e63ffffffff8c1683611ee6565b8151811061131e5761131e611ed2565b602001015160f81c60f81b82828151811061133b5761133b611ed2565b60200101906001600160f81b03191690815f1a9053506001016112f4565b505f601482015190508084848151811061137557611375611ed2565b6001600160a01b039092166020928302919091019091015261139860148b611f72565b995050508060010190506112c4565b506040805180820190915263ffffffff9092168252602082015260a08501525f6113d18284611f72565b6113dc906014611f8f565b6113e785607a611f72565b6113f19190611f72565b90508063ffffffff1688511461142d57875160405163cc92daa160e01b815263ffffffff918216600482015290821660248201526044016102bb565b5f805b600881101561149057611444816007611ea8565b61144f906008611ebb565b6001600160401b03168a61146963ffffffff8b1684611ee6565b8151811061147957611479611ed2565b016020015160f81c901b9190911790600101611430565b506001600160401b031660c086015250929695505050505050565b6040515f6020820152600160e11b60228201526026810183905281151560f81b60468201526060906047015b60405160208183030381529060405290505b92915050565b6040515f602082018190526022820152602681018390526001600160c01b031960c083901b166046820152606090604e016114d7565b5f606082604001515160301461154e5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861158f988a986001989297929690959094909390929101611fb7565b60405160208183030381529060405290505f5b84608001516020015151811015611601578185608001516020015182815181106115ce576115ce611ed2565b60200260200101516040516020016115e7929190612071565b60408051601f1981840301815291905291506001016115a2565b5060a08401518051602091820151516040516116219385939291016120a7565b60405160208183030381529060405290505f5b8460a00151602001515181101561169357818560a0015160200151828151811061166057611660611ed2565b6020026020010151604051602001611679929190612071565b60408051601f198184030181529190529150600101611634565b5060c08401516040516116aa9183916020016120e2565b60405160208183030381529060405290506002816040516116cb9190612113565b602060405180830381855afa1580156116e6573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611709919061212e565b94909350915050565b6040805160e0810182525f808252606060208084018290528385018290528184018390528451808601865283815280820183905260808501528451808601909552918452908301529060a082019081525f60209091015290565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156117a2576117a261176c565b60405290565b604051606081016001600160401b03811182821017156117a2576117a261176c565b604080519081016001600160401b03811182821017156117a2576117a261176c565b60405160e081016001600160401b03811182821017156117a2576117a261176c565b604051601f8201601f191681016001600160401b03811182821017156118365761183661176c565b604052919050565b5f82601f83011261184d575f80fd5b81356001600160401b038111156118665761186661176c565b611879601f8201601f191660200161180e565b81815284602083860101111561188d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156118b9575f80fd5b81356001600160401b038111156118ce575f80fd5b6118da8482850161183e565b949350505050565b5f602082840312156118f2575f80fd5b5035919050565b5f5b838110156119135781810151838201526020016118fb565b50505f910152565b5f81518084526119328160208601602086016118f9565b601f01601f19169290920160200192915050565b602081525f611958602083018461191b565b9392505050565b80356001600160401b0381168114611975575f80fd5b919050565b5f805f6060848603121561198c575f80fd5b8335925061199c6020850161195f565b91506119aa6040850161195f565b90509250925092565b80356001600160a01b0381168114611975575f80fd5b5f6001600160401b038211156119e1576119e161176c565b5060051b60200190565b5f60208083850312156119fc575f80fd5b82356001600160401b0380821115611a12575f80fd5b9084019060808287031215611a25575f80fd5b611a2d611780565b823581528383013584820152611a45604084016119b3565b604082015260608084013583811115611a5c575f80fd5b80850194505087601f850112611a70575f80fd5b8335611a83611a7e826119c9565b61180e565b81815260059190911b8501860190868101908a831115611aa1575f80fd5b8787015b83811015611b3a57803587811115611abb575f80fd5b8801808d03601f1901861315611acf575f80fd5b611ad76117a8565b8a82013589811115611ae7575f80fd5b611af58f8d8386010161183e565b825250604082013589811115611b09575f80fd5b611b178f8d8386010161183e565b8c83015250611b2787830161195f565b6040820152845250918801918801611aa5565b506060850152509198975050505050505050565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b80831015611ba95784516001600160a01b03168252938301936001929092019190830190611b80565b509695505050505050565b60208152815160208201525f602083015160e06040840152611bda61010084018261191b565b90506040840151601f1980858403016060860152611bf8838361191b565b92506001600160401b03606087015116608086015260808601519150808584030160a0860152611c288383611b4e565b925060a08601519150808584030160c086015250611c468282611b4e565b91505060c0840151611c6360e08501826001600160401b03169052565b509392505050565b5f8060408385031215611c7c575f80fd5b8235915060208301358015158114611c92575f80fd5b809150509250929050565b5f8060408385031215611cae575f80fd5b82359150611cbe6020840161195f565b90509250929050565b5f60408284031215611cd7575f80fd5b611cdf6117ca565b9050813563ffffffff81168114611cf4575f80fd5b81526020828101356001600160401b03811115611d0f575f80fd5b8301601f81018513611d1f575f80fd5b8035611d2d611a7e826119c9565b81815260059190911b82018301908381019087831115611d4b575f80fd5b928401925b82841015611d7057611d61846119b3565b82529284019290840190611d50565b8085870152505050505092915050565b5f60208284031215611d90575f80fd5b81356001600160401b0380821115611da6575f80fd5b9083019060e08286031215611db9575f80fd5b611dc16117ec565b82358152602083013582811115611dd6575f80fd5b611de28782860161183e565b602083015250604083013582811115611df9575f80fd5b611e058782860161183e565b604083015250611e176060840161195f565b6060820152608083013582811115611e2d575f80fd5b611e3987828601611cc7565b60808301525060a083013582811115611e50575f80fd5b611e5c87828601611cc7565b60a083015250611e6e60c0840161195f565b60c082015295945050505050565b828152604060208201525f6118da604083018461191b565b634e487b7160e01b5f52601160045260245ffd5b818103818111156114e9576114e9611e94565b80820281158282048414176114e9576114e9611e94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156114e9576114e9611e94565b5f8651611f0a818460208b016118f9565b60e087901b6001600160e01b0319169083019081528551611f32816004840160208a016118f9565b8551910190611f488160048401602089016118f9565b60c09490941b6001600160c01b031916600491909401908101939093525050600c01949350505050565b63ffffffff818116838216019080821115610b5957610b59611e94565b63ffffffff818116838216028082169190828114611faf57611faf611e94565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651611ffd81602a850160208b016118f9565b86519083019061201481602a840160208b016118f9565b60c087901b6001600160c01b031916602a9290910191820152612046603282018660e01b6001600160e01b0319169052565b61205f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516120828184602088016118f9565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516120b88184602089016118f9565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516120f38184602088016118f9565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f82516121248184602087016118f9565b9190910192915050565b5f6020828403121561213e575f80fd5b505191905056fea264697066735822122021bc83cb762d019261a415f663497547f82a60b24f9f9026058db0ae0972d18e64736f6c63430008190033", +} + +// ValidatorMessagesABI is the input ABI used to generate the binding from. +// Deprecated: Use ValidatorMessagesMetaData.ABI instead. +var ValidatorMessagesABI = ValidatorMessagesMetaData.ABI + +// ValidatorMessagesBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ValidatorMessagesMetaData.Bin instead. +var ValidatorMessagesBin = ValidatorMessagesMetaData.Bin + +// DeployValidatorMessages deploys a new Ethereum contract, binding an instance of ValidatorMessages to it. +func DeployValidatorMessages(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ValidatorMessages, error) { + parsed, err := ValidatorMessagesMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ValidatorMessagesBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ValidatorMessages{ValidatorMessagesCaller: ValidatorMessagesCaller{contract: contract}, ValidatorMessagesTransactor: ValidatorMessagesTransactor{contract: contract}, ValidatorMessagesFilterer: ValidatorMessagesFilterer{contract: contract}}, nil +} + +// ValidatorMessages is an auto generated Go binding around an Ethereum contract. +type ValidatorMessages struct { + ValidatorMessagesCaller // Read-only binding to the contract + ValidatorMessagesTransactor // Write-only binding to the contract + ValidatorMessagesFilterer // Log filterer for contract events +} + +// ValidatorMessagesCaller is an auto generated read-only Go binding around an Ethereum contract. +type ValidatorMessagesCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ValidatorMessagesTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ValidatorMessagesTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ValidatorMessagesFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ValidatorMessagesFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ValidatorMessagesSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ValidatorMessagesSession struct { + Contract *ValidatorMessages // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ValidatorMessagesCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ValidatorMessagesCallerSession struct { + Contract *ValidatorMessagesCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ValidatorMessagesTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ValidatorMessagesTransactorSession struct { + Contract *ValidatorMessagesTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ValidatorMessagesRaw is an auto generated low-level Go binding around an Ethereum contract. +type ValidatorMessagesRaw struct { + Contract *ValidatorMessages // Generic contract binding to access the raw methods on +} + +// ValidatorMessagesCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ValidatorMessagesCallerRaw struct { + Contract *ValidatorMessagesCaller // Generic read-only contract binding to access the raw methods on +} + +// ValidatorMessagesTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ValidatorMessagesTransactorRaw struct { + Contract *ValidatorMessagesTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewValidatorMessages creates a new instance of ValidatorMessages, bound to a specific deployed contract. +func NewValidatorMessages(address common.Address, backend bind.ContractBackend) (*ValidatorMessages, error) { + contract, err := bindValidatorMessages(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ValidatorMessages{ValidatorMessagesCaller: ValidatorMessagesCaller{contract: contract}, ValidatorMessagesTransactor: ValidatorMessagesTransactor{contract: contract}, ValidatorMessagesFilterer: ValidatorMessagesFilterer{contract: contract}}, nil +} + +// NewValidatorMessagesCaller creates a new read-only instance of ValidatorMessages, bound to a specific deployed contract. +func NewValidatorMessagesCaller(address common.Address, caller bind.ContractCaller) (*ValidatorMessagesCaller, error) { + contract, err := bindValidatorMessages(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ValidatorMessagesCaller{contract: contract}, nil +} + +// NewValidatorMessagesTransactor creates a new write-only instance of ValidatorMessages, bound to a specific deployed contract. +func NewValidatorMessagesTransactor(address common.Address, transactor bind.ContractTransactor) (*ValidatorMessagesTransactor, error) { + contract, err := bindValidatorMessages(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ValidatorMessagesTransactor{contract: contract}, nil +} + +// NewValidatorMessagesFilterer creates a new log filterer instance of ValidatorMessages, bound to a specific deployed contract. +func NewValidatorMessagesFilterer(address common.Address, filterer bind.ContractFilterer) (*ValidatorMessagesFilterer, error) { + contract, err := bindValidatorMessages(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ValidatorMessagesFilterer{contract: contract}, nil +} + +// bindValidatorMessages binds a generic wrapper to an already deployed contract. +func bindValidatorMessages(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ValidatorMessagesMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ValidatorMessages *ValidatorMessagesRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ValidatorMessages.Contract.ValidatorMessagesCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ValidatorMessages *ValidatorMessagesRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ValidatorMessages.Contract.ValidatorMessagesTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ValidatorMessages *ValidatorMessagesRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ValidatorMessages.Contract.ValidatorMessagesTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ValidatorMessages *ValidatorMessagesCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ValidatorMessages.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ValidatorMessages *ValidatorMessagesTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ValidatorMessages.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ValidatorMessages *ValidatorMessagesTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ValidatorMessages.Contract.contract.Transact(opts, method, params...) +} + +// PackConversionData is a free data retrieval call binding the contract method 0x51f48008. +// +// Solidity: function packConversionData((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCaller) PackConversionData(opts *bind.CallOpts, conversionData ConversionData) ([]byte, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "packConversionData", conversionData) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// PackConversionData is a free data retrieval call binding the contract method 0x51f48008. +// +// Solidity: function packConversionData((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesSession) PackConversionData(conversionData ConversionData) ([]byte, error) { + return _ValidatorMessages.Contract.PackConversionData(&_ValidatorMessages.CallOpts, conversionData) +} + +// PackConversionData is a free data retrieval call binding the contract method 0x51f48008. +// +// Solidity: function packConversionData((bytes32,bytes32,address,(bytes,bytes,uint64)[]) conversionData) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCallerSession) PackConversionData(conversionData ConversionData) ([]byte, error) { + return _ValidatorMessages.Contract.PackConversionData(&_ValidatorMessages.CallOpts, conversionData) +} + +// PackL1ValidatorRegistrationMessage is a free data retrieval call binding the contract method 0xa699c135. +// +// Solidity: function packL1ValidatorRegistrationMessage(bytes32 validationID, bool valid) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCaller) PackL1ValidatorRegistrationMessage(opts *bind.CallOpts, validationID [32]byte, valid bool) ([]byte, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "packL1ValidatorRegistrationMessage", validationID, valid) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// PackL1ValidatorRegistrationMessage is a free data retrieval call binding the contract method 0xa699c135. +// +// Solidity: function packL1ValidatorRegistrationMessage(bytes32 validationID, bool valid) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesSession) PackL1ValidatorRegistrationMessage(validationID [32]byte, valid bool) ([]byte, error) { + return _ValidatorMessages.Contract.PackL1ValidatorRegistrationMessage(&_ValidatorMessages.CallOpts, validationID, valid) +} + +// PackL1ValidatorRegistrationMessage is a free data retrieval call binding the contract method 0xa699c135. +// +// Solidity: function packL1ValidatorRegistrationMessage(bytes32 validationID, bool valid) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCallerSession) PackL1ValidatorRegistrationMessage(validationID [32]byte, valid bool) ([]byte, error) { + return _ValidatorMessages.Contract.PackL1ValidatorRegistrationMessage(&_ValidatorMessages.CallOpts, validationID, valid) +} + +// PackL1ValidatorWeightMessage is a free data retrieval call binding the contract method 0x854a893f. +// +// Solidity: function packL1ValidatorWeightMessage(bytes32 validationID, uint64 nonce, uint64 weight) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCaller) PackL1ValidatorWeightMessage(opts *bind.CallOpts, validationID [32]byte, nonce uint64, weight uint64) ([]byte, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "packL1ValidatorWeightMessage", validationID, nonce, weight) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// PackL1ValidatorWeightMessage is a free data retrieval call binding the contract method 0x854a893f. +// +// Solidity: function packL1ValidatorWeightMessage(bytes32 validationID, uint64 nonce, uint64 weight) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesSession) PackL1ValidatorWeightMessage(validationID [32]byte, nonce uint64, weight uint64) ([]byte, error) { + return _ValidatorMessages.Contract.PackL1ValidatorWeightMessage(&_ValidatorMessages.CallOpts, validationID, nonce, weight) +} + +// PackL1ValidatorWeightMessage is a free data retrieval call binding the contract method 0x854a893f. +// +// Solidity: function packL1ValidatorWeightMessage(bytes32 validationID, uint64 nonce, uint64 weight) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCallerSession) PackL1ValidatorWeightMessage(validationID [32]byte, nonce uint64, weight uint64) ([]byte, error) { + return _ValidatorMessages.Contract.PackL1ValidatorWeightMessage(&_ValidatorMessages.CallOpts, validationID, nonce, weight) +} + +// PackRegisterL1ValidatorMessage is a free data retrieval call binding the contract method 0xe0d5478f. +// +// Solidity: function packRegisterL1ValidatorMessage((bytes32,bytes,bytes,uint64,(uint32,address[]),(uint32,address[]),uint64) validationPeriod) pure returns(bytes32, bytes) +func (_ValidatorMessages *ValidatorMessagesCaller) PackRegisterL1ValidatorMessage(opts *bind.CallOpts, validationPeriod ValidatorMessagesValidationPeriod) ([32]byte, []byte, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "packRegisterL1ValidatorMessage", validationPeriod) + + if err != nil { + return *new([32]byte), *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + out1 := *abi.ConvertType(out[1], new([]byte)).(*[]byte) + + return out0, out1, err + +} + +// PackRegisterL1ValidatorMessage is a free data retrieval call binding the contract method 0xe0d5478f. +// +// Solidity: function packRegisterL1ValidatorMessage((bytes32,bytes,bytes,uint64,(uint32,address[]),(uint32,address[]),uint64) validationPeriod) pure returns(bytes32, bytes) +func (_ValidatorMessages *ValidatorMessagesSession) PackRegisterL1ValidatorMessage(validationPeriod ValidatorMessagesValidationPeriod) ([32]byte, []byte, error) { + return _ValidatorMessages.Contract.PackRegisterL1ValidatorMessage(&_ValidatorMessages.CallOpts, validationPeriod) +} + +// PackRegisterL1ValidatorMessage is a free data retrieval call binding the contract method 0xe0d5478f. +// +// Solidity: function packRegisterL1ValidatorMessage((bytes32,bytes,bytes,uint64,(uint32,address[]),(uint32,address[]),uint64) validationPeriod) pure returns(bytes32, bytes) +func (_ValidatorMessages *ValidatorMessagesCallerSession) PackRegisterL1ValidatorMessage(validationPeriod ValidatorMessagesValidationPeriod) ([32]byte, []byte, error) { + return _ValidatorMessages.Contract.PackRegisterL1ValidatorMessage(&_ValidatorMessages.CallOpts, validationPeriod) +} + +// PackSubnetToL1ConversionMessage is a free data retrieval call binding the contract method 0x7f7c427a. +// +// Solidity: function packSubnetToL1ConversionMessage(bytes32 conversionID) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCaller) PackSubnetToL1ConversionMessage(opts *bind.CallOpts, conversionID [32]byte) ([]byte, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "packSubnetToL1ConversionMessage", conversionID) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// PackSubnetToL1ConversionMessage is a free data retrieval call binding the contract method 0x7f7c427a. +// +// Solidity: function packSubnetToL1ConversionMessage(bytes32 conversionID) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesSession) PackSubnetToL1ConversionMessage(conversionID [32]byte) ([]byte, error) { + return _ValidatorMessages.Contract.PackSubnetToL1ConversionMessage(&_ValidatorMessages.CallOpts, conversionID) +} + +// PackSubnetToL1ConversionMessage is a free data retrieval call binding the contract method 0x7f7c427a. +// +// Solidity: function packSubnetToL1ConversionMessage(bytes32 conversionID) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCallerSession) PackSubnetToL1ConversionMessage(conversionID [32]byte) ([]byte, error) { + return _ValidatorMessages.Contract.PackSubnetToL1ConversionMessage(&_ValidatorMessages.CallOpts, conversionID) +} + +// PackValidationUptimeMessage is a free data retrieval call binding the contract method 0xe1d68f30. +// +// Solidity: function packValidationUptimeMessage(bytes32 validationID, uint64 uptime) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCaller) PackValidationUptimeMessage(opts *bind.CallOpts, validationID [32]byte, uptime uint64) ([]byte, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "packValidationUptimeMessage", validationID, uptime) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// PackValidationUptimeMessage is a free data retrieval call binding the contract method 0xe1d68f30. +// +// Solidity: function packValidationUptimeMessage(bytes32 validationID, uint64 uptime) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesSession) PackValidationUptimeMessage(validationID [32]byte, uptime uint64) ([]byte, error) { + return _ValidatorMessages.Contract.PackValidationUptimeMessage(&_ValidatorMessages.CallOpts, validationID, uptime) +} + +// PackValidationUptimeMessage is a free data retrieval call binding the contract method 0xe1d68f30. +// +// Solidity: function packValidationUptimeMessage(bytes32 validationID, uint64 uptime) pure returns(bytes) +func (_ValidatorMessages *ValidatorMessagesCallerSession) PackValidationUptimeMessage(validationID [32]byte, uptime uint64) ([]byte, error) { + return _ValidatorMessages.Contract.PackValidationUptimeMessage(&_ValidatorMessages.CallOpts, validationID, uptime) +} + +// UnpackL1ValidatorRegistrationMessage is a free data retrieval call binding the contract method 0x021de88f. +// +// Solidity: function unpackL1ValidatorRegistrationMessage(bytes input) pure returns(bytes32, bool) +func (_ValidatorMessages *ValidatorMessagesCaller) UnpackL1ValidatorRegistrationMessage(opts *bind.CallOpts, input []byte) ([32]byte, bool, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "unpackL1ValidatorRegistrationMessage", input) + + if err != nil { + return *new([32]byte), *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + out1 := *abi.ConvertType(out[1], new(bool)).(*bool) + + return out0, out1, err + +} + +// UnpackL1ValidatorRegistrationMessage is a free data retrieval call binding the contract method 0x021de88f. +// +// Solidity: function unpackL1ValidatorRegistrationMessage(bytes input) pure returns(bytes32, bool) +func (_ValidatorMessages *ValidatorMessagesSession) UnpackL1ValidatorRegistrationMessage(input []byte) ([32]byte, bool, error) { + return _ValidatorMessages.Contract.UnpackL1ValidatorRegistrationMessage(&_ValidatorMessages.CallOpts, input) +} + +// UnpackL1ValidatorRegistrationMessage is a free data retrieval call binding the contract method 0x021de88f. +// +// Solidity: function unpackL1ValidatorRegistrationMessage(bytes input) pure returns(bytes32, bool) +func (_ValidatorMessages *ValidatorMessagesCallerSession) UnpackL1ValidatorRegistrationMessage(input []byte) ([32]byte, bool, error) { + return _ValidatorMessages.Contract.UnpackL1ValidatorRegistrationMessage(&_ValidatorMessages.CallOpts, input) +} + +// UnpackL1ValidatorWeightMessage is a free data retrieval call binding the contract method 0x50782b0f. +// +// Solidity: function unpackL1ValidatorWeightMessage(bytes input) pure returns(bytes32, uint64, uint64) +func (_ValidatorMessages *ValidatorMessagesCaller) UnpackL1ValidatorWeightMessage(opts *bind.CallOpts, input []byte) ([32]byte, uint64, uint64, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "unpackL1ValidatorWeightMessage", input) + + if err != nil { + return *new([32]byte), *new(uint64), *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + out1 := *abi.ConvertType(out[1], new(uint64)).(*uint64) + out2 := *abi.ConvertType(out[2], new(uint64)).(*uint64) + + return out0, out1, out2, err + +} + +// UnpackL1ValidatorWeightMessage is a free data retrieval call binding the contract method 0x50782b0f. +// +// Solidity: function unpackL1ValidatorWeightMessage(bytes input) pure returns(bytes32, uint64, uint64) +func (_ValidatorMessages *ValidatorMessagesSession) UnpackL1ValidatorWeightMessage(input []byte) ([32]byte, uint64, uint64, error) { + return _ValidatorMessages.Contract.UnpackL1ValidatorWeightMessage(&_ValidatorMessages.CallOpts, input) +} + +// UnpackL1ValidatorWeightMessage is a free data retrieval call binding the contract method 0x50782b0f. +// +// Solidity: function unpackL1ValidatorWeightMessage(bytes input) pure returns(bytes32, uint64, uint64) +func (_ValidatorMessages *ValidatorMessagesCallerSession) UnpackL1ValidatorWeightMessage(input []byte) ([32]byte, uint64, uint64, error) { + return _ValidatorMessages.Contract.UnpackL1ValidatorWeightMessage(&_ValidatorMessages.CallOpts, input) +} + +// UnpackRegisterL1ValidatorMessage is a free data retrieval call binding the contract method 0x9b835465. +// +// Solidity: function unpackRegisterL1ValidatorMessage(bytes input) pure returns((bytes32,bytes,bytes,uint64,(uint32,address[]),(uint32,address[]),uint64)) +func (_ValidatorMessages *ValidatorMessagesCaller) UnpackRegisterL1ValidatorMessage(opts *bind.CallOpts, input []byte) (ValidatorMessagesValidationPeriod, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "unpackRegisterL1ValidatorMessage", input) + + if err != nil { + return *new(ValidatorMessagesValidationPeriod), err + } + + out0 := *abi.ConvertType(out[0], new(ValidatorMessagesValidationPeriod)).(*ValidatorMessagesValidationPeriod) + + return out0, err + +} + +// UnpackRegisterL1ValidatorMessage is a free data retrieval call binding the contract method 0x9b835465. +// +// Solidity: function unpackRegisterL1ValidatorMessage(bytes input) pure returns((bytes32,bytes,bytes,uint64,(uint32,address[]),(uint32,address[]),uint64)) +func (_ValidatorMessages *ValidatorMessagesSession) UnpackRegisterL1ValidatorMessage(input []byte) (ValidatorMessagesValidationPeriod, error) { + return _ValidatorMessages.Contract.UnpackRegisterL1ValidatorMessage(&_ValidatorMessages.CallOpts, input) +} + +// UnpackRegisterL1ValidatorMessage is a free data retrieval call binding the contract method 0x9b835465. +// +// Solidity: function unpackRegisterL1ValidatorMessage(bytes input) pure returns((bytes32,bytes,bytes,uint64,(uint32,address[]),(uint32,address[]),uint64)) +func (_ValidatorMessages *ValidatorMessagesCallerSession) UnpackRegisterL1ValidatorMessage(input []byte) (ValidatorMessagesValidationPeriod, error) { + return _ValidatorMessages.Contract.UnpackRegisterL1ValidatorMessage(&_ValidatorMessages.CallOpts, input) +} + +// UnpackSubnetToL1ConversionMessage is a free data retrieval call binding the contract method 0x4d847884. +// +// Solidity: function unpackSubnetToL1ConversionMessage(bytes input) pure returns(bytes32) +func (_ValidatorMessages *ValidatorMessagesCaller) UnpackSubnetToL1ConversionMessage(opts *bind.CallOpts, input []byte) ([32]byte, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "unpackSubnetToL1ConversionMessage", input) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// UnpackSubnetToL1ConversionMessage is a free data retrieval call binding the contract method 0x4d847884. +// +// Solidity: function unpackSubnetToL1ConversionMessage(bytes input) pure returns(bytes32) +func (_ValidatorMessages *ValidatorMessagesSession) UnpackSubnetToL1ConversionMessage(input []byte) ([32]byte, error) { + return _ValidatorMessages.Contract.UnpackSubnetToL1ConversionMessage(&_ValidatorMessages.CallOpts, input) +} + +// UnpackSubnetToL1ConversionMessage is a free data retrieval call binding the contract method 0x4d847884. +// +// Solidity: function unpackSubnetToL1ConversionMessage(bytes input) pure returns(bytes32) +func (_ValidatorMessages *ValidatorMessagesCallerSession) UnpackSubnetToL1ConversionMessage(input []byte) ([32]byte, error) { + return _ValidatorMessages.Contract.UnpackSubnetToL1ConversionMessage(&_ValidatorMessages.CallOpts, input) +} + +// UnpackValidationUptimeMessage is a free data retrieval call binding the contract method 0x088c2463. +// +// Solidity: function unpackValidationUptimeMessage(bytes input) pure returns(bytes32, uint64) +func (_ValidatorMessages *ValidatorMessagesCaller) UnpackValidationUptimeMessage(opts *bind.CallOpts, input []byte) ([32]byte, uint64, error) { + var out []interface{} + err := _ValidatorMessages.contract.Call(opts, &out, "unpackValidationUptimeMessage", input) + + if err != nil { + return *new([32]byte), *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + out1 := *abi.ConvertType(out[1], new(uint64)).(*uint64) + + return out0, out1, err + +} + +// UnpackValidationUptimeMessage is a free data retrieval call binding the contract method 0x088c2463. +// +// Solidity: function unpackValidationUptimeMessage(bytes input) pure returns(bytes32, uint64) +func (_ValidatorMessages *ValidatorMessagesSession) UnpackValidationUptimeMessage(input []byte) ([32]byte, uint64, error) { + return _ValidatorMessages.Contract.UnpackValidationUptimeMessage(&_ValidatorMessages.CallOpts, input) +} + +// UnpackValidationUptimeMessage is a free data retrieval call binding the contract method 0x088c2463. +// +// Solidity: function unpackValidationUptimeMessage(bytes input) pure returns(bytes32, uint64) +func (_ValidatorMessages *ValidatorMessagesCallerSession) UnpackValidationUptimeMessage(input []byte) ([32]byte, uint64, error) { + return _ValidatorMessages.Contract.UnpackValidationUptimeMessage(&_ValidatorMessages.CallOpts, input) +} diff --git a/abi-bindings/go/validator-manager/PoAValidatorManagerV1/README.md b/abi-bindings/go/validator-manager/PoAValidatorManagerV1/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index 0c9462065..dc8139bef 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -69,7 +69,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits ownerKey, ) - validatorManagerProxy, proxyAdmin := network.GetValidatorManager(l1AInfo.SubnetID) + validatorManagerProxy, _ := network.GetValidatorManager(l1AInfo.SubnetID) poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) Expect(err).Should(BeNil()) @@ -149,10 +149,19 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { validatorManagerAddress, _ := utils.DeployValidatorManager(ctx, ownerKey, l1AInfo, false) opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := proxyAdmin.UpgradeAndCall(opts, validatorManagerProxy.Address, validatorManagerAddress, []byte{}) + + tx, err := validatorManagerProxy.ProxyAdmin.UpgradeAndCall(opts, validatorManagerProxy.Address, validatorManagerAddress, []byte{}) Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) + // Migrate already registered validators to the new ValidatorManager version + validatorManager, err := validatormanager.NewValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) + + opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) + Expect(err).Should(BeNil()) + validatorManager.MigrateFromV1PoA(opts, poaValidationID) + // Deploy StakingManager contract stakingManagerAddress, _ := utils.DeployAndInitializeValidatorManagerSpecialization( ctx, @@ -181,9 +190,6 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(context.Background(), l1AInfo, tx.Hash()) - validatorManager, err := validatormanager.NewValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) - Expect(err).Should(BeNil()) - // Check that previous validator is still registered validationID, err := validatorManager.RegisteredValidators(&bind.CallOpts{}, poaNodeID) Expect(err).Should(BeNil()) diff --git a/tests/network/network.go b/tests/network/network.go index 6ba9bfda2..ba909de03 100644 --- a/tests/network/network.go +++ b/tests/network/network.go @@ -207,7 +207,7 @@ func (n *LocalNetwork) ConvertSubnetPoAV1( // Reset the global binary data for better test isolation poavalidatormanager.PoAValidatorManagerBin = poavalidatormanager.PoAValidatorManagerMetaData.Bin - vdrManagerAddress, tx, poaValidatorManager, err := poavalidatormanager.DeployPoAValidatorManager( + vdrManagerAddress, tx, _, err := poavalidatormanager.DeployPoAValidatorManager( opts, l1.RPCClient, 0, // ICMInitializable.Allowed @@ -215,18 +215,6 @@ func (n *LocalNetwork) ConvertSubnetPoAV1( Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(ctx, l1, tx.Hash()) - tx, err = poaValidatorManager.Initialize( - opts, - poavalidatormanager.ValidatorManagerSettings{ - L1ID: l1.SubnetID, - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(20), - }, - utils.PrivateKeyToAddress(senderKey), - ) - Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(ctx, l1, tx.Hash()) - var vdrManagerProxyAdmin *proxyadmin.ProxyAdmin // Overwrite the manager address with the proxy address vdrManagerAddress, vdrManagerProxyAdmin = utils.DeployTransparentUpgradeableProxy( @@ -241,6 +229,20 @@ func (n *LocalNetwork) ConvertSubnetPoAV1( ProxyAdmin: vdrManagerProxyAdmin, } + poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(vdrManagerAddress, l1.RPCClient) + Expect(err).Should(BeNil()) + tx, err = poaValidatorManager.Initialize( + opts, + poavalidatormanager.ValidatorManagerSettings{ + L1ID: l1.SubnetID, + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(20), + }, + utils.PrivateKeyToAddress(senderKey), + ) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, l1, tx.Hash()) + tmpnetNodes := n.GetExtraNodes(len(weights)) sort.Slice(tmpnetNodes, func(i, j int) bool { return string(tmpnetNodes[i].NodeID.Bytes()) < string(tmpnetNodes[j].NodeID.Bytes()) From e661794cd5772f5232cbaef1ef8d90708f927a04 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 7 Mar 2025 12:07:42 -0500 Subject: [PATCH 3/5] v1 migration e2e test --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 6 +- .../PoAValidatorManagerV1/README.md | 3 + .../validator-manager/migrate_from_v1.go | 686 ++++++++++++++++++ tests/flows/validator-manager/poa_to_pos.go | 58 +- tests/network/network.go | 140 +--- .../validator_manager_suite_test.go | 25 +- tests/utils/validator_manager.go | 263 ------- 9 files changed, 730 insertions(+), 455 deletions(-) create mode 100644 tests/flows/validator-manager/migrate_from_v1.go diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 9808cb42d..6da7f2a60 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -77,7 +77,7 @@ type ValidatorMessagesValidationPeriod struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedValidationID\",\"type\":\"bytes32\"}],\"name\":\"UnexpectedValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"CompletedDelegatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"CompletedDelegatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"InitiatedDelegatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InitiatedDelegatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRemoval\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"erc20\",\"outputs\":[{\"internalType\":\"contractIERC20Mintable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractValidatorManager\",\"name\":\"manager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structStakingManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20Mintable\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delegationAmount\",\"type\":\"uint256\"}],\"name\":\"initiateDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"initiateValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613da6380380613da683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b613c598061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c8063785e9e86116100fe578063a9778a7a1161009e578063b771b3bc1161006e578063b771b3bc14610413578063cc71bbba14610421578063e4a63c4014610434578063fb8b11dd14610448575f80fd5b8063a9778a7a146102b4578063aac80c39146103da578063b2c1712e146103ed578063b5c9349814610400575f80fd5b80638ef34c98116100d95780638ef34c981461038e57806393e24598146103a15780639681d940146103b4578063a3a65e48146103c7575f80fd5b8063785e9e86146103235780637a63ad85146103545780638af5499e1461037b575f80fd5b80632aa566381161017457806360ad77841161014457806360ad7784146102e357806362065856146102f6578063732214f814610309578063739b4eff14610310575f80fd5b80632aa56638146102765780632e2194d81461028957806335455ded146102b45780634b396bcc146102d0575f80fd5b80631af1872b116101af5780631af1872b1461021c578063245dafcb1461023d57806325e1c7761461025057806327bf60cd14610263575f80fd5b806313409645146101d5578063151d30d1146101ea5780631667956414610209575b5f80fd5b6101e86101e33660046131ec565b61045b565b005b6101f2600a81565b60405160ff90911681526020015b60405180910390f35b6101e8610217366004613223565b61079b565b61022f61022a366004613472565b6107ad565b604051908152602001610200565b6101e861024b366004613551565b6107ea565b6101e861025e3660046131ec565b610aae565b6101e8610271366004613223565b610b8c565b6101e8610284366004613223565b610b98565b61029c610297366004613551565b610ba9565b6040516001600160401b039091168152602001610200565b6102bd61271081565b60405161ffff9091168152602001610200565b6101e86102de366004613568565b610bfd565b6101e86102f13660046131ec565b610c09565b61022f6103043660046135b6565b610f2b565b61022f5f81565b61022f61031e3660046135d1565b610f4b565b5f80516020613be4833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610200565b61022f7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60081565b6101e8610389366004613568565b610f77565b6101e861039c3660046135f1565b610f83565b6101e86103af366004613551565b611034565b61022f6103c236600461361f565b61112d565b61022f6103d536600461361f565b6112dd565b6101e86103e8366004613568565b611355565b6101e86103fb366004613223565b611361565b6101e861040e366004613638565b61136d565b61033c6005600160991b0181565b6101e861042f366004613568565b611451565b61022f5f80516020613be483398151915281565b6101e86104563660046135f1565b61145d565b6104636114f4565b5f61046c61152b565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156104a5576104a561366b565b60038111156104b6576104b661366b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561052f5761052f61366b565b14610559578051604051633b0d540d60e21b8152610550919060040161367f565b60405180910390fd5b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa1580156105a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105cb9190810190613716565b9050600483546040808501519051636af907fb60e11b81526001600160a01b039092169163d5f20ff6916106059160040190815260200190565b5f60405180830381865afa15801561061f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106469190810190613716565b5160058111156106585761065861366b565b1415801561067f57508160c001516001600160401b031681608001516001600160401b0316105b1561077557825460405163338587c560e21b815263ffffffff861660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af11580156106d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f791906137f5565b91509150818460400151146107305781846040015160405163fee3144560e01b8152600401610550929190918252602082015260400190565b806001600160401b03168460c001516001600160401b0316111561077257604051632e19bc2d60e11b81526001600160401b0382166004820152602401610550565b50505b61077e8561154f565b50505061079760015f80516020613c0483398151915255565b5050565b6107a78383835f611793565b50505050565b5f6107b66114f4565b6107c68989898989898989611a8c565b90506107de60015f80516020613c0483398151915255565b98975050505050505050565b5f6107f361152b565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff16600381111561082c5761082c61366b565b600381111561083d5761083d61366b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156108b6576108b661366b565b141580156108d757506003815160038111156108d4576108d461366b565b14155b156108f8578051604051633b0d540d60e21b8152610550919060040161367f565b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610943573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261096a9190810190613716565b905080606001516001600160401b03165f0361099c576040516339b894f960e21b815260048101859052602401610550565b604080830151606083015160a0840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93610a0a93906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015610a24573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a4b9190810190613818565b6040518263ffffffff1660e01b8152600401610a679190613874565b6020604051808303815f875af1158015610a83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa79190613886565b5050505050565b610ab782611c94565b610ad7576040516330efa98b60e01b815260048101839052602401610550565b5f610ae061152b565b54604051636af907fb60e11b8152600481018590526001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015610b24573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b4b9190810190613716565b5190506002816005811115610b6257610b6261366b565b14610b82578060405163170cc93360e21b8152600401610550919061389d565b6107a78383611cbd565b6107a78383835f611f63565b610ba48383835f612369565b505050565b5f80610bb361152b565b60040154610bc190846138c5565b9050801580610bd657506001600160401b0381115b15610bf75760405163222d164360e21b815260048101849052602401610550565b92915050565b610aa784848484611793565b5f610c1261152b565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115610c4b57610c4b61366b565b6003811115610c5c57610c5c61366b565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015610d0d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d349190810190613716565b9050600183516003811115610d4b57610d4b61366b565b14610d6c578251604051633b0d540d60e21b8152610550919060040161367f565b600481516005811115610d8157610d8161366b565b03610d9757610d8f8661154f565b505050505050565b8260a001516001600160401b031681608001516001600160401b03161015610e9f57835460405163338587c560e21b815263ffffffff871660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af1158015610e08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2c91906137f5565b91509150818414610e5a5760405163fee3144560e01b81526004810183905260248101859052604401610550565b8460a001516001600160401b0316816001600160401b03161015610e9c57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610550565b50505b5f868152600885016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252839188917f3886b7389bccb22cac62838dee3f400cf8b22289295283e01a2c7093f93dd5aa910160405180910390a3505050505050565b5f610f3461152b565b60040154610bf7906001600160401b0384166138e4565b5f610f546114f4565b610f5f833384612395565b9050610bf760015f80516020613c0483398151915255565b6107a784848484612369565b5f610f8c61152b565b90506001600160a01b038216610fc05760405163caa903f960e01b81526001600160a01b0383166004820152602401610550565b5f8381526007820160205260409020546001600160a01b0316331461100657335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610550565b5f928352600c01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f61103d61152b565b8054604051636af907fb60e11b8152600481018590529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015611087573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110ae9190810190613716565b51905060048160058111156110c5576110c561366b565b146110e5578060405163170cc93360e21b8152600401610550919061389d565b5f8381526007830160205260409020546001600160a01b0316331461110a5733610fe1565b5f838152600783016020526040902054610ba4906001600160a01b0316846126b0565b5f6111366114f4565b5f61113f61152b565b805460405163025a076560e61b815263ffffffff861660048201529192505f916001600160a01b0390911690639681d940906024016020604051808303815f875af1158015611190573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b49190613886565b8254604051636af907fb60e11b8152600481018390529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156111fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112259190810190613716565b905061123082611c94565b61123e575091506112c29050565b5f828152600784016020908152604080832054600c870190925290912080546001600160a01b031981169091556001600160a01b039182169116806112805750805b6004835160058111156112955761129561366b565b036112a4576112a481856126b0565b6112ba826112b58560400151610f2b565b6126da565b509193505050505b6112d860015f80516020613c0483398151915255565b919050565b5f6112e661152b565b54604051631474cbc960e31b815263ffffffff841660048201526001600160a01b039091169063a3a65e48906024016020604051808303815f875af1158015611331573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf79190613886565b610aa784848484611f63565b610ba48383835f6126fd565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806113b6575080546001600160401b03808416911610155b156113d45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113ff8484612729565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6107a7848484846126fd565b6001600160a01b03811661148f5760405163caa903f960e01b81526001600160a01b0382166004820152602401610550565b5f61149861152b565b5f8481526008820160205260409020549091506001600160a01b036101009091041633146114c65733610fe1565b5f928352600a01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f80516020613c0483398151915280546001190161152557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60090565b5f61155861152b565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156115915761159161366b565b60038111156115a2576115a261366b565b815281546001600160a01b03610100909104811660208084019190915260018401546040808501919091526002909401546001600160401b038082166060860152600160401b820481166080860152600160801b8204811660a0860152600160c01b9091041660c09093019290925283830151865484516304e0efb360e11b8152945195965090949116926309c1df669260048083019391928290030181865afa158015611652573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061167691906138fb565b82608001516116859190613916565b6001600160401b03164210156116b95760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b5f848152600884016020908152604080832080546001600160a81b031916815560018101849055600201839055600a8601909152902080546001600160a01b031981169091556001600160a01b031680611714575060208201515b5f80611721838886612743565b9150915061173a85602001516112b58760600151610f2b565b6040805183815260208101839052859189917f5ecc5b26a9265302cf871229b3d983e5ca57dbb1448966c6c58b2d3c68bc7f7e910160405180910390a350505050505050565b60015f80516020613c0483398151915255565b5f8061179d61152b565b8054604051635b73516560e11b8152600481018990529192506001600160a01b03169063b6e6a2ca906024015f604051808303815f87803b1580156117e0575f80fd5b505af11580156117f2573d5f803e3d5ffd5b50508254604051636af907fb60e11b8152600481018a90525f93506001600160a01b03909116915063d5f20ff6906024015f60405180830381865afa15801561183d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118649190810190613716565b905061186f87611c94565b61187e57600192505050611a84565b5f8781526007830160205260409020546001600160a01b031633146118a35733610fe1565b5f87815260078301602052604090205460c08201516118d291600160b01b90046001600160401b031690613916565b6001600160401b03168160e001516001600160401b031610156119195760e081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610550565b5f86156119315761192a8887611cbd565b905061194f565b505f8781526007830160205260409020600101546001600160401b03165b600583015460408301515f916001600160a01b031690634f22429f9061197490610f2b565b60c086015160e0808801516040519185901b6001600160e01b031916825260048201939093526001600160401b0391821660248201819052604482015291811660648301528516608482015260a401602060405180830381865afa1580156119de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a029190613886565b90506001600160a01b038616611a2e575f8981526007850160205260409020546001600160a01b031695505b5f898152600b8501602052604081208054839290611a4d90849061393d565b90915550505f898152600c94909401602052604090932080546001600160a01b0319166001600160a01b0387161790555050151590505b949350505050565b5f80611a9661152b565b600381015490915061ffff600160401b90910481169086161080611abf575061271061ffff8616115b15611ae357604051635f12e6c360e11b815261ffff86166004820152602401610550565b60038101546001600160401b039081169085161015611b1f576040516202a06d60e11b81526001600160401b0385166004820152602401610550565b8060010154831080611b345750806002015483115b15611b555760405163222d164360e21b815260048101849052602401610550565b5f611b5f846127f0565b90505f611b6b82610ba9565b90505f835f015f9054906101000a90046001600160a01b03166001600160a01b031663ed285ae18e8e8e8e8e886040518763ffffffff1660e01b8152600401611bb9969594939291906139b6565b6020604051808303815f875af1158015611bd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf99190613886565b5f818152600786016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600c9096019095529790932080546001600160a01b03191690961790955550939998505050505050505050565b5f80611c9e61152b565b5f938452600701602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d08573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d2f9190810190613a29565b9150915080611d5157604051636b2f19e960e01b815260040160405180910390fd5b5f611d5a61152b565b6006810154845191925014611d88578251604051636ba589a560e01b81526004810191909152602401610550565b60208301516001600160a01b031615611dc4576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610550565b60208301516001600160a01b031615611e00576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610550565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b8152600401611e3d9190613874565b6040805180830381865af4158015611e57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7b91906137f5565b91509150818814611ea95760405163fee3144560e01b81526004810183905260248101899052604401610550565b5f8881526007840160205260409020600101546001600160401b039081169082161115611f3a575f888152600784016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611f58565b505f8781526007830160205260409020600101546001600160401b03165b979650505050505050565b5f80611f6d61152b565b5f878152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115611fa657611fa661366b565b6003811115611fb757611fb761366b565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015612068573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208f9190810190613716565b90506002835160038111156120a6576120a661366b565b146120c7578251604051633b0d540d60e21b8152610550919060040161367f565b60208301516001600160a01b03163314612163575f8281526007850160205260409020546001600160a01b031633146121005733610fe1565b5f82815260078501602052604090205460c082015161212f91600160b01b90046001600160401b031690613916565b6001600160401b03164210156121635760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b6002815160058111156121785761217861366b565b03612311576003840154608084015161219a916001600160401b031690613916565b6001600160401b03164210156121ce5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b87156121e0576121de8288611cbd565b505b5f8981526008850160205260409020805460ff191660031790558354606084015160a08301516001600160a01b039092169163661096699185916122249190613acf565b6040516001600160e01b031960e085901b16815260048101929092526001600160401b0316602482015260440160408051808303815f875af115801561226c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122909190613aef565b505f8a8152600886016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556122d384888c612813565b9050828a7f5abe543af12bb7f76f6fa9daaa9d95d181c5e90566df58d3c012216b6245eeaf60405160405180910390a315159450611a849350505050565b6004815160058111156123265761232661366b565b0361234d5761233683878b612813565b506123408961154f565b6001945050505050611a84565b805160405163170cc93360e21b8152610550919060040161389d565b61237584848484611f63565b6107a757604051631036cf9160e11b815260048101859052602401610550565b5f8061239f61152b565b90505f6123ae610297856127f0565b8254604051636af907fb60e11b8152600481018990529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156123f8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261241f9190810190613716565b905061242a87611c94565b61244a576040516330efa98b60e01b815260048101889052602401610550565b60028151600581111561245f5761245f61366b565b1461248057805160405163170cc93360e21b8152610550919060040161389d565b5f828260a001516124919190613916565b905083600301600a9054906101000a90046001600160401b031682604001516124ba9190613b1b565b6001600160401b0316816001600160401b031611156124f757604051636d51fe0560e11b81526001600160401b0382166004820152602401610550565b8354604051636610966960e01b8152600481018a90526001600160401b03831660248201525f9182916001600160a01b039091169063661096699060440160408051808303815f875af1158015612550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125749190613aef565b915091505f8a836040516020016125a292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260088b019093529120805491925060019160ff1916828002179055505f8181526008880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fdf91f7709a30fda3fc5fc5dc97cb5d5b05e67e193dccaaef3cb332d23fda83d19060800160405180910390a496505050505050505b9392505050565b5f6126b961152b565b5f838152600b82016020526040812080549190559091506107a78482612a6d565b5f80516020613be483398151915254610797906001600160a01b03168383612ae3565b61270984848484611793565b6107a757604051635bff683f60e11b815260048101859052602401610550565b612731612b42565b61273a82612b8d565b61079781612c0b565b5f805f61274e61152b565b5f868152600982016020526040812080549082905591925090819080156127e2575f8781526007850160205260409020546127109061279890600160a01b900461ffff16836138e4565b6127a291906138c5565b91508184600b015f8981526020019081526020015f205f8282546127c6919061393d565b909155506127d690508282613b46565b92506127e28984612a6d565b509097909650945050505050565b5f610bf7825f80516020613be4833981519152546001600160a01b031690612c73565b5f8061281d61152b565b80546040808801519051636af907fb60e11b81529293505f926001600160a01b039092169163d5f20ff6916128589160040190815260200190565b5f60405180830381865afa158015612872573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128999190810190613716565b90505f6003825160058111156128b1576128b161366b565b14806128cf57506004825160058111156128cd576128cd61366b565b145b156128df575060e081015161291c565b6002825160058111156128f4576128f461366b565b0361290057504261291c565b815160405163170cc93360e21b8152610550919060040161389d565b86608001516001600160401b0316816001600160401b031611612944575f93505050506126a9565b600583015460608801515f916001600160a01b031690634f22429f9061296990610f2b565b60c086015160808c01516040808e01515f90815260078b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa1580156129ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0e9190613886565b90506001600160a01b038716612a2657876020015196505b5f8681526009850160209081526040808320849055600a90960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b5f5f80516020613be483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ac8575f80fd5b505af1158015612ada573d5f803e3d5ffd5b50505050505050565b6040516001600160a01b03838116602483015260448201839052610ba491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612c7f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612b8b57604051631afcd79f60e31b815260040160405180910390fd5b565b612b95612b42565b612b9d612ce0565b612c08612bad6020830183613b59565b60208301356040840135612bc760808601606087016135b6565b612bd760a0870160808801613b74565b612be760c0880160a08901613b8d565b60c0880135612bfd6101008a0160e08b01613b59565b896101000135612cf0565b50565b612c13612b42565b5f80516020613be48339815191526001600160a01b038216612c5357604051637330680360e01b81526001600160a01b0383166004820152602401610550565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6126a9833384612f19565b5f612c936001600160a01b0384168361307c565b905080515f14158015612cb7575080806020019051810190612cb59190613bad565b155b15610ba457604051635274afe760e01b81526001600160a01b0384166004820152602401610550565b612ce8612b42565b612b8b613089565b612cf8612b42565b5f612d0161152b565b905061ffff86161580612d19575061271061ffff8716115b15612d3d57604051635f12e6c360e11b815261ffff87166004820152602401610550565b87891115612d615760405163222d164360e21b8152600481018a9052602401610550565b60ff85161580612d745750600a60ff8616115b15612d975760405163170db35960e31b815260ff86166004820152602401610550565b896001600160a01b03166309c1df666040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df791906138fb565b6001600160401b0316876001600160401b03161015612e33576040516202a06d60e11b81526001600160401b0388166004820152602401610550565b835f03612e535760405163a733007160e01b815260040160405180910390fd5b81612e7457604051632f6bd1db60e01b815260048101839052602401610550565b80546001600160a01b039a8b166001600160a01b031991821617825560018201999099556002810197909755600387018054600160501b60ff9096169590950267ffffffffffffffff60501b1961ffff909716600160401b0269ffffffffffffffffffff199096166001600160401b03909816979097179490941794909416949094179091556004840155600583018054929095169190931617909255600690910155565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612f5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f839190613886565b9050612f9a6001600160a01b038616853086613091565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612fde573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130029190613886565b90508181116130685760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610550565b6130728282613b46565b9695505050505050565b60606126a983835f6130ca565b611780612b42565b6040516001600160a01b0384811660248301528381166044830152606482018390526107a79186918216906323b872dd90608401612b10565b6060814710156130ef5760405163cd78605960e01b8152306004820152602401610550565b5f80856001600160a01b0316848660405161310a9190613bc8565b5f6040518083038185875af1925050503d805f8114613144576040519150601f19603f3d011682016040523d82523d5f602084013e613149565b606091505b509150915061307286838360608261316957613164826131b0565b6126a9565b815115801561318057506001600160a01b0384163b155b156131a957604051639996b31560e01b81526001600160a01b0385166004820152602401610550565b50806126a9565b8051156131c05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b803563ffffffff811681146112d8575f80fd5b5f80604083850312156131fd575f80fd5b8235915061320d602084016131d9565b90509250929050565b8015158114612c08575f80fd5b5f805f60608486031215613235575f80fd5b83359250602084013561324781613216565b9150613255604085016131d9565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156132945761329461325e565b60405290565b60405161010081016001600160401b03811182821017156132945761329461325e565b604051601f8201601f191681016001600160401b03811182821017156132e5576132e561325e565b604052919050565b5f6001600160401b038211156133055761330561325e565b50601f01601f191660200190565b5f82601f830112613322575f80fd5b8135613335613330826132ed565b6132bd565b818152846020838601011115613349575f80fd5b816020850160208301375f918101602001919091529392505050565b6001600160401b0381168114612c08575f80fd5b80356112d881613365565b6001600160a01b0381168114612c08575f80fd5b5f604082840312156133a8575f80fd5b6133b0613272565b90506133bb826131d9565b81526020808301356001600160401b03808211156133d7575f80fd5b818501915085601f8301126133ea575f80fd5b8135818111156133fc576133fc61325e565b8060051b915061340d8483016132bd565b8181529183018401918481019088841115613426575f80fd5b938501935b83851015613450578435925061344083613384565b828252938501939085019061342b565b808688015250505050505092915050565b803561ffff811681146112d8575f80fd5b5f805f805f805f80610100898b03121561348a575f80fd5b88356001600160401b03808211156134a0575f80fd5b6134ac8c838d01613313565b995060208b01359150808211156134c1575f80fd5b6134cd8c838d01613313565b98506134db60408c01613379565b975060608b01359150808211156134f0575f80fd5b6134fc8c838d01613398565b965060808b0135915080821115613511575f80fd5b5061351e8b828c01613398565b94505061352d60a08a01613461565b925061353b60c08a01613379565b915060e089013590509295985092959890939650565b5f60208284031215613561575f80fd5b5035919050565b5f805f806080858703121561357b575f80fd5b84359350602085013561358d81613216565b925061359b604086016131d9565b915060608501356135ab81613384565b939692955090935050565b5f602082840312156135c6575f80fd5b81356126a981613365565b5f80604083850312156135e2575f80fd5b50508035926020909101359150565b5f8060408385031215613602575f80fd5b82359150602083013561361481613384565b809150509250929050565b5f6020828403121561362f575f80fd5b6126a9826131d9565b5f8082840361014081121561364b575f80fd5b6101208082121561365a575f80fd5b849350830135905061361481613384565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106136935761369361366b565b91905290565b8051600681106112d8575f80fd5b5f5b838110156136c15781810151838201526020016136a9565b50505f910152565b5f82601f8301126136d8575f80fd5b81516136e6613330826132ed565b8181528460208386010111156136fa575f80fd5b611a848260208301602087016136a7565b80516112d881613365565b5f60208284031215613726575f80fd5b81516001600160401b038082111561373c575f80fd5b908301906101008286031215613750575f80fd5b61375861329a565b61376183613699565b8152602083015182811115613774575f80fd5b613780878286016136c9565b6020830152506137926040840161370b565b60408201526137a36060840161370b565b60608201526137b46080840161370b565b60808201526137c560a0840161370b565b60a08201526137d660c0840161370b565b60c08201526137e760e0840161370b565b60e082015295945050505050565b5f8060408385031215613806575f80fd5b82519150602083015161361481613365565b5f60208284031215613828575f80fd5b81516001600160401b0381111561383d575f80fd5b611a84848285016136c9565b5f81518084526138608160208601602086016136a7565b601f01601f19169290920160200192915050565b602081525f6126a96020830184613849565b5f60208284031215613896575f80fd5b5051919050565b60208101600683106136935761369361366b565b634e487b7160e01b5f52601160045260245ffd5b5f826138df57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610bf757610bf76138b1565b5f6020828403121561390b575f80fd5b81516126a981613365565b6001600160401b03818116838216019080821115613936576139366138b1565b5092915050565b80820180821115610bf757610bf76138b1565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156139ab5784516001600160a01b03168252938301936001929092019190830190613982565b509695505050505050565b60c081525f6139c860c0830189613849565b82810360208401526139da8189613849565b90506001600160401b03808816604085015283820360608501526139fe8288613950565b91508382036080850152613a128287613950565b925080851660a08501525050979650505050505050565b5f8060408385031215613a3a575f80fd5b82516001600160401b0380821115613a50575f80fd5b9084019060608287031215613a63575f80fd5b604051606081018181108382111715613a7e57613a7e61325e565b604052825181526020830151613a9381613384565b6020820152604083015182811115613aa9575f80fd5b613ab5888286016136c9565b604083015250809450505050602083015161361481613216565b6001600160401b03828116828216039080821115613936576139366138b1565b5f8060408385031215613b00575f80fd5b8251613b0b81613365565b6020939093015192949293505050565b6001600160401b03818116838216028082169190828114613b3e57613b3e6138b1565b505092915050565b81810381811115610bf757610bf76138b1565b5f60208284031215613b69575f80fd5b81356126a981613384565b5f60208284031215613b84575f80fd5b6126a982613461565b5f60208284031215613b9d575f80fd5b813560ff811681146126a9575f80fd5b5f60208284031215613bbd575f80fd5b81516126a981613216565b5f8251613bd98184602087016136a7565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220c1e0e10594365110a88acc34e3481fac29bdf179be48683cdbc283f71c2c227664736f6c63430008190033", + Bin: "0x608060405234801561000f575f80fd5b50604051613da6380380613da683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b613c598061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c8063785e9e86116100fe578063a9778a7a1161009e578063b771b3bc1161006e578063b771b3bc14610413578063cc71bbba14610421578063e4a63c4014610434578063fb8b11dd14610448575f80fd5b8063a9778a7a146102b4578063aac80c39146103da578063b2c1712e146103ed578063b5c9349814610400575f80fd5b80638ef34c98116100d95780638ef34c981461038e57806393e24598146103a15780639681d940146103b4578063a3a65e48146103c7575f80fd5b8063785e9e86146103235780637a63ad85146103545780638af5499e1461037b575f80fd5b80632aa566381161017457806360ad77841161014457806360ad7784146102e357806362065856146102f6578063732214f814610309578063739b4eff14610310575f80fd5b80632aa56638146102765780632e2194d81461028957806335455ded146102b45780634b396bcc146102d0575f80fd5b80631af1872b116101af5780631af1872b1461021c578063245dafcb1461023d57806325e1c7761461025057806327bf60cd14610263575f80fd5b806313409645146101d5578063151d30d1146101ea5780631667956414610209575b5f80fd5b6101e86101e33660046131ec565b61045b565b005b6101f2600a81565b60405160ff90911681526020015b60405180910390f35b6101e8610217366004613223565b61079b565b61022f61022a366004613472565b6107ad565b604051908152602001610200565b6101e861024b366004613551565b6107ea565b6101e861025e3660046131ec565b610aae565b6101e8610271366004613223565b610b8c565b6101e8610284366004613223565b610b98565b61029c610297366004613551565b610ba9565b6040516001600160401b039091168152602001610200565b6102bd61271081565b60405161ffff9091168152602001610200565b6101e86102de366004613568565b610bfd565b6101e86102f13660046131ec565b610c09565b61022f6103043660046135b6565b610f2b565b61022f5f81565b61022f61031e3660046135d1565b610f4b565b5f80516020613be4833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610200565b61022f7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60081565b6101e8610389366004613568565b610f77565b6101e861039c3660046135f1565b610f83565b6101e86103af366004613551565b611034565b61022f6103c236600461361f565b61112d565b61022f6103d536600461361f565b6112dd565b6101e86103e8366004613568565b611355565b6101e86103fb366004613223565b611361565b6101e861040e366004613638565b61136d565b61033c6005600160991b0181565b6101e861042f366004613568565b611451565b61022f5f80516020613be483398151915281565b6101e86104563660046135f1565b61145d565b6104636114f4565b5f61046c61152b565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156104a5576104a561366b565b60038111156104b6576104b661366b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561052f5761052f61366b565b14610559578051604051633b0d540d60e21b8152610550919060040161367f565b60405180910390fd5b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa1580156105a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105cb9190810190613716565b9050600483546040808501519051636af907fb60e11b81526001600160a01b039092169163d5f20ff6916106059160040190815260200190565b5f60405180830381865afa15801561061f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106469190810190613716565b5160058111156106585761065861366b565b1415801561067f57508160c001516001600160401b031681608001516001600160401b0316105b1561077557825460405163338587c560e21b815263ffffffff861660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af11580156106d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f791906137f5565b91509150818460400151146107305781846040015160405163fee3144560e01b8152600401610550929190918252602082015260400190565b806001600160401b03168460c001516001600160401b0316111561077257604051632e19bc2d60e11b81526001600160401b0382166004820152602401610550565b50505b61077e8561154f565b50505061079760015f80516020613c0483398151915255565b5050565b6107a78383835f611793565b50505050565b5f6107b66114f4565b6107c68989898989898989611a8c565b90506107de60015f80516020613c0483398151915255565b98975050505050505050565b5f6107f361152b565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff16600381111561082c5761082c61366b565b600381111561083d5761083d61366b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156108b6576108b661366b565b141580156108d757506003815160038111156108d4576108d461366b565b14155b156108f8578051604051633b0d540d60e21b8152610550919060040161367f565b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610943573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261096a9190810190613716565b905080606001516001600160401b03165f0361099c576040516339b894f960e21b815260048101859052602401610550565b604080830151606083015160a0840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93610a0a93906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015610a24573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a4b9190810190613818565b6040518263ffffffff1660e01b8152600401610a679190613874565b6020604051808303815f875af1158015610a83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa79190613886565b5050505050565b610ab782611c94565b610ad7576040516330efa98b60e01b815260048101839052602401610550565b5f610ae061152b565b54604051636af907fb60e11b8152600481018590526001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015610b24573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b4b9190810190613716565b5190506002816005811115610b6257610b6261366b565b14610b82578060405163170cc93360e21b8152600401610550919061389d565b6107a78383611cbd565b6107a78383835f611f63565b610ba48383835f612369565b505050565b5f80610bb361152b565b60040154610bc190846138c5565b9050801580610bd657506001600160401b0381115b15610bf75760405163222d164360e21b815260048101849052602401610550565b92915050565b610aa784848484611793565b5f610c1261152b565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115610c4b57610c4b61366b565b6003811115610c5c57610c5c61366b565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015610d0d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d349190810190613716565b9050600183516003811115610d4b57610d4b61366b565b14610d6c578251604051633b0d540d60e21b8152610550919060040161367f565b600481516005811115610d8157610d8161366b565b03610d9757610d8f8661154f565b505050505050565b8260a001516001600160401b031681608001516001600160401b03161015610e9f57835460405163338587c560e21b815263ffffffff871660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af1158015610e08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2c91906137f5565b91509150818414610e5a5760405163fee3144560e01b81526004810183905260248101859052604401610550565b8460a001516001600160401b0316816001600160401b03161015610e9c57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610550565b50505b5f868152600885016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252839188917f3886b7389bccb22cac62838dee3f400cf8b22289295283e01a2c7093f93dd5aa910160405180910390a3505050505050565b5f610f3461152b565b60040154610bf7906001600160401b0384166138e4565b5f610f546114f4565b610f5f833384612395565b9050610bf760015f80516020613c0483398151915255565b6107a784848484612369565b5f610f8c61152b565b90506001600160a01b038216610fc05760405163caa903f960e01b81526001600160a01b0383166004820152602401610550565b5f8381526007820160205260409020546001600160a01b0316331461100657335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610550565b5f928352600c01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f61103d61152b565b8054604051636af907fb60e11b8152600481018590529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015611087573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110ae9190810190613716565b51905060048160058111156110c5576110c561366b565b146110e5578060405163170cc93360e21b8152600401610550919061389d565b5f8381526007830160205260409020546001600160a01b0316331461110a5733610fe1565b5f838152600783016020526040902054610ba4906001600160a01b0316846126b0565b5f6111366114f4565b5f61113f61152b565b805460405163025a076560e61b815263ffffffff861660048201529192505f916001600160a01b0390911690639681d940906024016020604051808303815f875af1158015611190573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b49190613886565b8254604051636af907fb60e11b8152600481018390529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156111fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112259190810190613716565b905061123082611c94565b61123e575091506112c29050565b5f828152600784016020908152604080832054600c870190925290912080546001600160a01b031981169091556001600160a01b039182169116806112805750805b6004835160058111156112955761129561366b565b036112a4576112a481856126b0565b6112ba826112b58560400151610f2b565b6126da565b509193505050505b6112d860015f80516020613c0483398151915255565b919050565b5f6112e661152b565b54604051631474cbc960e31b815263ffffffff841660048201526001600160a01b039091169063a3a65e48906024016020604051808303815f875af1158015611331573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf79190613886565b610aa784848484611f63565b610ba48383835f6126fd565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806113b6575080546001600160401b03808416911610155b156113d45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113ff8484612729565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6107a7848484846126fd565b6001600160a01b03811661148f5760405163caa903f960e01b81526001600160a01b0382166004820152602401610550565b5f61149861152b565b5f8481526008820160205260409020549091506001600160a01b036101009091041633146114c65733610fe1565b5f928352600a01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f80516020613c0483398151915280546001190161152557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60090565b5f61155861152b565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156115915761159161366b565b60038111156115a2576115a261366b565b815281546001600160a01b03610100909104811660208084019190915260018401546040808501919091526002909401546001600160401b038082166060860152600160401b820481166080860152600160801b8204811660a0860152600160c01b9091041660c09093019290925283830151865484516304e0efb360e11b8152945195965090949116926309c1df669260048083019391928290030181865afa158015611652573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061167691906138fb565b82608001516116859190613916565b6001600160401b03164210156116b95760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b5f848152600884016020908152604080832080546001600160a81b031916815560018101849055600201839055600a8601909152902080546001600160a01b031981169091556001600160a01b031680611714575060208201515b5f80611721838886612743565b9150915061173a85602001516112b58760600151610f2b565b6040805183815260208101839052859189917f5ecc5b26a9265302cf871229b3d983e5ca57dbb1448966c6c58b2d3c68bc7f7e910160405180910390a350505050505050565b60015f80516020613c0483398151915255565b5f8061179d61152b565b8054604051635b73516560e11b8152600481018990529192506001600160a01b03169063b6e6a2ca906024015f604051808303815f87803b1580156117e0575f80fd5b505af11580156117f2573d5f803e3d5ffd5b50508254604051636af907fb60e11b8152600481018a90525f93506001600160a01b03909116915063d5f20ff6906024015f60405180830381865afa15801561183d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118649190810190613716565b905061186f87611c94565b61187e57600192505050611a84565b5f8781526007830160205260409020546001600160a01b031633146118a35733610fe1565b5f87815260078301602052604090205460c08201516118d291600160b01b90046001600160401b031690613916565b6001600160401b03168160e001516001600160401b031610156119195760e081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610550565b5f86156119315761192a8887611cbd565b905061194f565b505f8781526007830160205260409020600101546001600160401b03165b600583015460408301515f916001600160a01b031690634f22429f9061197490610f2b565b60c086015160e0808801516040519185901b6001600160e01b031916825260048201939093526001600160401b0391821660248201819052604482015291811660648301528516608482015260a401602060405180830381865afa1580156119de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a029190613886565b90506001600160a01b038616611a2e575f8981526007850160205260409020546001600160a01b031695505b5f898152600b8501602052604081208054839290611a4d90849061393d565b90915550505f898152600c94909401602052604090932080546001600160a01b0319166001600160a01b0387161790555050151590505b949350505050565b5f80611a9661152b565b600381015490915061ffff600160401b90910481169086161080611abf575061271061ffff8616115b15611ae357604051635f12e6c360e11b815261ffff86166004820152602401610550565b60038101546001600160401b039081169085161015611b1f576040516202a06d60e11b81526001600160401b0385166004820152602401610550565b8060010154831080611b345750806002015483115b15611b555760405163222d164360e21b815260048101849052602401610550565b5f611b5f846127f0565b90505f611b6b82610ba9565b90505f835f015f9054906101000a90046001600160a01b03166001600160a01b031663ed285ae18e8e8e8e8e886040518763ffffffff1660e01b8152600401611bb9969594939291906139b6565b6020604051808303815f875af1158015611bd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf99190613886565b5f818152600786016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600c9096019095529790932080546001600160a01b03191690961790955550939998505050505050505050565b5f80611c9e61152b565b5f938452600701602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d08573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d2f9190810190613a29565b9150915080611d5157604051636b2f19e960e01b815260040160405180910390fd5b5f611d5a61152b565b6006810154845191925014611d88578251604051636ba589a560e01b81526004810191909152602401610550565b60208301516001600160a01b031615611dc4576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610550565b60208301516001600160a01b031615611e00576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610550565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b8152600401611e3d9190613874565b6040805180830381865af4158015611e57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7b91906137f5565b91509150818814611ea95760405163fee3144560e01b81526004810183905260248101899052604401610550565b5f8881526007840160205260409020600101546001600160401b039081169082161115611f3a575f888152600784016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611f58565b505f8781526007830160205260409020600101546001600160401b03165b979650505050505050565b5f80611f6d61152b565b5f878152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115611fa657611fa661366b565b6003811115611fb757611fb761366b565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015612068573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208f9190810190613716565b90506002835160038111156120a6576120a661366b565b146120c7578251604051633b0d540d60e21b8152610550919060040161367f565b60208301516001600160a01b03163314612163575f8281526007850160205260409020546001600160a01b031633146121005733610fe1565b5f82815260078501602052604090205460c082015161212f91600160b01b90046001600160401b031690613916565b6001600160401b03164210156121635760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b6002815160058111156121785761217861366b565b03612311576003840154608084015161219a916001600160401b031690613916565b6001600160401b03164210156121ce5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b87156121e0576121de8288611cbd565b505b5f8981526008850160205260409020805460ff191660031790558354606084015160a08301516001600160a01b039092169163661096699185916122249190613acf565b6040516001600160e01b031960e085901b16815260048101929092526001600160401b0316602482015260440160408051808303815f875af115801561226c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122909190613aef565b505f8a8152600886016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556122d384888c612813565b9050828a7f5abe543af12bb7f76f6fa9daaa9d95d181c5e90566df58d3c012216b6245eeaf60405160405180910390a315159450611a849350505050565b6004815160058111156123265761232661366b565b0361234d5761233683878b612813565b506123408961154f565b6001945050505050611a84565b805160405163170cc93360e21b8152610550919060040161389d565b61237584848484611f63565b6107a757604051631036cf9160e11b815260048101859052602401610550565b5f8061239f61152b565b90505f6123ae610297856127f0565b8254604051636af907fb60e11b8152600481018990529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156123f8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261241f9190810190613716565b905061242a87611c94565b61244a576040516330efa98b60e01b815260048101889052602401610550565b60028151600581111561245f5761245f61366b565b1461248057805160405163170cc93360e21b8152610550919060040161389d565b5f828260a001516124919190613916565b905083600301600a9054906101000a90046001600160401b031682604001516124ba9190613b1b565b6001600160401b0316816001600160401b031611156124f757604051636d51fe0560e11b81526001600160401b0382166004820152602401610550565b8354604051636610966960e01b8152600481018a90526001600160401b03831660248201525f9182916001600160a01b039091169063661096699060440160408051808303815f875af1158015612550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125749190613aef565b915091505f8a836040516020016125a292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260088b019093529120805491925060019160ff1916828002179055505f8181526008880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fdf91f7709a30fda3fc5fc5dc97cb5d5b05e67e193dccaaef3cb332d23fda83d19060800160405180910390a496505050505050505b9392505050565b5f6126b961152b565b5f838152600b82016020526040812080549190559091506107a78482612a6d565b5f80516020613be483398151915254610797906001600160a01b03168383612ae3565b61270984848484611793565b6107a757604051635bff683f60e11b815260048101859052602401610550565b612731612b42565b61273a82612b8d565b61079781612c0b565b5f805f61274e61152b565b5f868152600982016020526040812080549082905591925090819080156127e2575f8781526007850160205260409020546127109061279890600160a01b900461ffff16836138e4565b6127a291906138c5565b91508184600b015f8981526020019081526020015f205f8282546127c6919061393d565b909155506127d690508282613b46565b92506127e28984612a6d565b509097909650945050505050565b5f610bf7825f80516020613be4833981519152546001600160a01b031690612c73565b5f8061281d61152b565b80546040808801519051636af907fb60e11b81529293505f926001600160a01b039092169163d5f20ff6916128589160040190815260200190565b5f60405180830381865afa158015612872573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128999190810190613716565b90505f6003825160058111156128b1576128b161366b565b14806128cf57506004825160058111156128cd576128cd61366b565b145b156128df575060e081015161291c565b6002825160058111156128f4576128f461366b565b0361290057504261291c565b815160405163170cc93360e21b8152610550919060040161389d565b86608001516001600160401b0316816001600160401b031611612944575f93505050506126a9565b600583015460608801515f916001600160a01b031690634f22429f9061296990610f2b565b60c086015160808c01516040808e01515f90815260078b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa1580156129ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0e9190613886565b90506001600160a01b038716612a2657876020015196505b5f8681526009850160209081526040808320849055600a90960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b5f5f80516020613be483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ac8575f80fd5b505af1158015612ada573d5f803e3d5ffd5b50505050505050565b6040516001600160a01b03838116602483015260448201839052610ba491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612c7f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612b8b57604051631afcd79f60e31b815260040160405180910390fd5b565b612b95612b42565b612b9d612ce0565b612c08612bad6020830183613b59565b60208301356040840135612bc760808601606087016135b6565b612bd760a0870160808801613b74565b612be760c0880160a08901613b8d565b60c0880135612bfd6101008a0160e08b01613b59565b896101000135612cf0565b50565b612c13612b42565b5f80516020613be48339815191526001600160a01b038216612c5357604051637330680360e01b81526001600160a01b0383166004820152602401610550565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6126a9833384612f19565b5f612c936001600160a01b0384168361307c565b905080515f14158015612cb7575080806020019051810190612cb59190613bad565b155b15610ba457604051635274afe760e01b81526001600160a01b0384166004820152602401610550565b612ce8612b42565b612b8b613089565b612cf8612b42565b5f612d0161152b565b905061ffff86161580612d19575061271061ffff8716115b15612d3d57604051635f12e6c360e11b815261ffff87166004820152602401610550565b87891115612d615760405163222d164360e21b8152600481018a9052602401610550565b60ff85161580612d745750600a60ff8616115b15612d975760405163170db35960e31b815260ff86166004820152602401610550565b896001600160a01b03166309c1df666040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df791906138fb565b6001600160401b0316876001600160401b03161015612e33576040516202a06d60e11b81526001600160401b0388166004820152602401610550565b835f03612e535760405163a733007160e01b815260040160405180910390fd5b81612e7457604051632f6bd1db60e01b815260048101839052602401610550565b80546001600160a01b039a8b166001600160a01b031991821617825560018201999099556002810197909755600387018054600160501b60ff9096169590950267ffffffffffffffff60501b1961ffff909716600160401b0269ffffffffffffffffffff199096166001600160401b03909816979097179490941794909416949094179091556004840155600583018054929095169190931617909255600690910155565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612f5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f839190613886565b9050612f9a6001600160a01b038616853086613091565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612fde573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130029190613886565b90508181116130685760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610550565b6130728282613b46565b9695505050505050565b60606126a983835f6130ca565b611780612b42565b6040516001600160a01b0384811660248301528381166044830152606482018390526107a79186918216906323b872dd90608401612b10565b6060814710156130ef5760405163cd78605960e01b8152306004820152602401610550565b5f80856001600160a01b0316848660405161310a9190613bc8565b5f6040518083038185875af1925050503d805f8114613144576040519150601f19603f3d011682016040523d82523d5f602084013e613149565b606091505b509150915061307286838360608261316957613164826131b0565b6126a9565b815115801561318057506001600160a01b0384163b155b156131a957604051639996b31560e01b81526001600160a01b0385166004820152602401610550565b50806126a9565b8051156131c05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b803563ffffffff811681146112d8575f80fd5b5f80604083850312156131fd575f80fd5b8235915061320d602084016131d9565b90509250929050565b8015158114612c08575f80fd5b5f805f60608486031215613235575f80fd5b83359250602084013561324781613216565b9150613255604085016131d9565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156132945761329461325e565b60405290565b60405161010081016001600160401b03811182821017156132945761329461325e565b604051601f8201601f191681016001600160401b03811182821017156132e5576132e561325e565b604052919050565b5f6001600160401b038211156133055761330561325e565b50601f01601f191660200190565b5f82601f830112613322575f80fd5b8135613335613330826132ed565b6132bd565b818152846020838601011115613349575f80fd5b816020850160208301375f918101602001919091529392505050565b6001600160401b0381168114612c08575f80fd5b80356112d881613365565b6001600160a01b0381168114612c08575f80fd5b5f604082840312156133a8575f80fd5b6133b0613272565b90506133bb826131d9565b81526020808301356001600160401b03808211156133d7575f80fd5b818501915085601f8301126133ea575f80fd5b8135818111156133fc576133fc61325e565b8060051b915061340d8483016132bd565b8181529183018401918481019088841115613426575f80fd5b938501935b83851015613450578435925061344083613384565b828252938501939085019061342b565b808688015250505050505092915050565b803561ffff811681146112d8575f80fd5b5f805f805f805f80610100898b03121561348a575f80fd5b88356001600160401b03808211156134a0575f80fd5b6134ac8c838d01613313565b995060208b01359150808211156134c1575f80fd5b6134cd8c838d01613313565b98506134db60408c01613379565b975060608b01359150808211156134f0575f80fd5b6134fc8c838d01613398565b965060808b0135915080821115613511575f80fd5b5061351e8b828c01613398565b94505061352d60a08a01613461565b925061353b60c08a01613379565b915060e089013590509295985092959890939650565b5f60208284031215613561575f80fd5b5035919050565b5f805f806080858703121561357b575f80fd5b84359350602085013561358d81613216565b925061359b604086016131d9565b915060608501356135ab81613384565b939692955090935050565b5f602082840312156135c6575f80fd5b81356126a981613365565b5f80604083850312156135e2575f80fd5b50508035926020909101359150565b5f8060408385031215613602575f80fd5b82359150602083013561361481613384565b809150509250929050565b5f6020828403121561362f575f80fd5b6126a9826131d9565b5f8082840361014081121561364b575f80fd5b6101208082121561365a575f80fd5b849350830135905061361481613384565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106136935761369361366b565b91905290565b8051600681106112d8575f80fd5b5f5b838110156136c15781810151838201526020016136a9565b50505f910152565b5f82601f8301126136d8575f80fd5b81516136e6613330826132ed565b8181528460208386010111156136fa575f80fd5b611a848260208301602087016136a7565b80516112d881613365565b5f60208284031215613726575f80fd5b81516001600160401b038082111561373c575f80fd5b908301906101008286031215613750575f80fd5b61375861329a565b61376183613699565b8152602083015182811115613774575f80fd5b613780878286016136c9565b6020830152506137926040840161370b565b60408201526137a36060840161370b565b60608201526137b46080840161370b565b60808201526137c560a0840161370b565b60a08201526137d660c0840161370b565b60c08201526137e760e0840161370b565b60e082015295945050505050565b5f8060408385031215613806575f80fd5b82519150602083015161361481613365565b5f60208284031215613828575f80fd5b81516001600160401b0381111561383d575f80fd5b611a84848285016136c9565b5f81518084526138608160208601602086016136a7565b601f01601f19169290920160200192915050565b602081525f6126a96020830184613849565b5f60208284031215613896575f80fd5b5051919050565b60208101600683106136935761369361366b565b634e487b7160e01b5f52601160045260245ffd5b5f826138df57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610bf757610bf76138b1565b5f6020828403121561390b575f80fd5b81516126a981613365565b6001600160401b03818116838216019080821115613936576139366138b1565b5092915050565b80820180821115610bf757610bf76138b1565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156139ab5784516001600160a01b03168252938301936001929092019190830190613982565b509695505050505050565b60c081525f6139c860c0830189613849565b82810360208401526139da8189613849565b90506001600160401b03808816604085015283820360608501526139fe8288613950565b91508382036080850152613a128287613950565b925080851660a08501525050979650505050505050565b5f8060408385031215613a3a575f80fd5b82516001600160401b0380821115613a50575f80fd5b9084019060608287031215613a63575f80fd5b604051606081018181108382111715613a7e57613a7e61325e565b604052825181526020830151613a9381613384565b6020820152604083015182811115613aa9575f80fd5b613ab5888286016136c9565b604083015250809450505050602083015161361481613216565b6001600160401b03828116828216039080821115613936576139366138b1565b5f8060408385031215613b00575f80fd5b8251613b0b81613365565b6020939093015192949293505050565b6001600160401b03818116838216028082169190828114613b3e57613b3e6138b1565b505092915050565b81810381811115610bf757610bf76138b1565b5f60208284031215613b69575f80fd5b81356126a981613384565b5f60208284031215613b84575f80fd5b6126a982613461565b5f60208284031215613b9d575f80fd5b813560ff811681146126a9575f80fd5b5f60208284031215613bbd575f80fd5b81516126a981613216565b5f8251613bd98184602087016136a7565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220fbc586eb184ddacce01086a7fb27cb00508406b68925a6a5da193fc58d910d2064736f6c63430008190033", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index bc8a6cb48..5622be2b0 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -77,7 +77,7 @@ type ValidatorMessagesValidationPeriod struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedValidationID\",\"type\":\"bytes32\"}],\"name\":\"UnexpectedValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"CompletedDelegatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"CompletedDelegatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"InitiatedDelegatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InitiatedDelegatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_MINTER\",\"outputs\":[{\"internalType\":\"contractINativeMinter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRemoval\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractValidatorManager\",\"name\":\"manager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structStakingManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initiateDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"initiateValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613a4b380380613a4b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138fe8061014d5f395ff3fe6080604052600436106101ba575f3560e01c806362065856116100f2578063a3a65e4811610092578063b771b3bc11610062578063b771b3bc146104f2578063cacd97551461050c578063cc71bbba1461051f578063fb8b11dd1461053e575f80fd5b8063a3a65e4814610495578063a9778a7a1461034e578063aac80c39146104b4578063b2c1712e146104d3575f80fd5b80638af5499e116100cd5780638af5499e146104195780638ef34c981461043857806393e24598146104575780639681d94014610476575f80fd5b806362065856146103b4578063732214f8146103d35780637a63ad85146103e6575f80fd5b806327bf60cd1161015d578063329c3e1211610138578063329c3e121461031c57806335455ded1461034e5780634b396bcc1461037657806360ad778414610395575f80fd5b806327bf60cd146102a75780632aa56638146102c65780632e2194d8146102e5575f80fd5b806316679564116101985780631667956414610229578063245dafcb1461024857806325e1c77614610267578063264dc60314610286575f80fd5b80630d436317146101be57806313409645146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004612f1a565b61055d565b005b3480156101ea575f80fd5b506101dd6101f9366004612f44565b61063f565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd610243366004612f7b565b61097f565b348015610253575f80fd5b506101dd610262366004612fb6565b610991565b348015610272575f80fd5b506101dd610281366004612f44565b610c55565b6102996102943660046131e1565b610d33565b604051908152602001610220565b3480156102b2575f80fd5b506101dd6102c1366004612f7b565b610d6f565b3480156102d1575f80fd5b506101dd6102e0366004612f7b565b610d7b565b3480156102f0575f80fd5b506103046102ff366004612fb6565b610d8c565b6040516001600160401b039091168152602001610220565b348015610327575f80fd5b506103366001600160991b0181565b6040516001600160a01b039091168152602001610220565b348015610359575f80fd5b5061036361271081565b60405161ffff9091168152602001610220565b348015610381575f80fd5b506101dd6103903660046132b6565b610de0565b3480156103a0575f80fd5b506101dd6103af366004612f44565b610dec565b3480156103bf575f80fd5b506102996103ce366004613304565b61110e565b3480156103de575f80fd5b506102995f81565b3480156103f1575f80fd5b506102997fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60081565b348015610424575f80fd5b506101dd6104333660046132b6565b61112e565b348015610443575f80fd5b506101dd61045236600461331f565b61113a565b348015610462575f80fd5b506101dd610471366004612fb6565b6111eb565b348015610481575f80fd5b5061029961049036600461334d565b6112e4565b3480156104a0575f80fd5b506102996104af36600461334d565b611494565b3480156104bf575f80fd5b506101dd6104ce3660046132b6565b61150c565b3480156104de575f80fd5b506101dd6104ed366004612f7b565b611518565b3480156104fd575f80fd5b506103366005600160991b0181565b61029961051a366004612fb6565b611524565b34801561052a575f80fd5b506101dd6105393660046132b6565b611550565b348015610549575f80fd5b506101dd61055836600461331f565b61155c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806105a6575080546001600160401b03808416911610155b156105c45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556105ee836115f3565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610647611607565b5f61065061163e565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff16600381111561068957610689613366565b600381111561069a5761069a613366565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561071357610713613366565b1461073d578051604051633b0d540d60e21b8152610734919060040161337a565b60405180910390fd5b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610788573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107af9190810190613411565b9050600483546040808501519051636af907fb60e11b81526001600160a01b039092169163d5f20ff6916107e99160040190815260200190565b5f60405180830381865afa158015610803573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261082a9190810190613411565b51600581111561083c5761083c613366565b1415801561086357508160c001516001600160401b031681608001516001600160401b0316105b1561095957825460405163338587c560e21b815263ffffffff861660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af11580156108b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108db91906134f0565b91509150818460400151146109145781846040015160405163fee3144560e01b8152600401610734929190918252602082015260400190565b806001600160401b03168460c001516001600160401b0316111561095657604051632e19bc2d60e11b81526001600160401b0382166004820152602401610734565b50505b61096285611662565b50505061097b60015f805160206138a983398151915255565b5050565b61098b8383835f6118a6565b50505050565b5f61099a61163e565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156109d3576109d3613366565b60038111156109e4576109e4613366565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115610a5d57610a5d613366565b14158015610a7e5750600381516003811115610a7b57610a7b613366565b14155b15610a9f578051604051633b0d540d60e21b8152610734919060040161337a565b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610aea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b119190810190613411565b905080606001516001600160401b03165f03610b43576040516339b894f960e21b815260048101859052602401610734565b604080830151606083015160a0840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93610bb193906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015610bcb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bf29190810190613513565b6040518263ffffffff1660e01b8152600401610c0e919061356f565b6020604051808303815f875af1158015610c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4e9190613581565b5050505050565b610c5e82611b9f565b610c7e576040516330efa98b60e01b815260048101839052602401610734565b5f610c8761163e565b54604051636af907fb60e11b8152600481018590526001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015610ccb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cf29190810190613411565b5190506002816005811115610d0957610d09613366565b14610d29578060405163170cc93360e21b81526004016107349190613598565b61098b8383611bc8565b5f610d3c611607565b610d4c8888888888888834611e6b565b9050610d6460015f805160206138a983398151915255565b979650505050505050565b61098b8383835f612068565b610d878383835f61246e565b505050565b5f80610d9661163e565b60040154610da490846135c0565b9050801580610db957506001600160401b0381115b15610dda5760405163222d164360e21b815260048101849052602401610734565b92915050565b610c4e848484846118a6565b5f610df561163e565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115610e2e57610e2e613366565b6003811115610e3f57610e3f613366565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015610ef0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f179190810190613411565b9050600183516003811115610f2e57610f2e613366565b14610f4f578251604051633b0d540d60e21b8152610734919060040161337a565b600481516005811115610f6457610f64613366565b03610f7a57610f7286611662565b505050505050565b8260a001516001600160401b031681608001516001600160401b0316101561108257835460405163338587c560e21b815263ffffffff871660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af1158015610feb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100f91906134f0565b9150915081841461103d5760405163fee3144560e01b81526004810183905260248101859052604401610734565b8460a001516001600160401b0316816001600160401b0316101561107f57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610734565b50505b5f868152600885016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252839188917f3886b7389bccb22cac62838dee3f400cf8b22289295283e01a2c7093f93dd5aa910160405180910390a3505050505050565b5f61111761163e565b60040154610dda906001600160401b0384166135df565b61098b8484848461246e565b5f61114361163e565b90506001600160a01b0382166111775760405163caa903f960e01b81526001600160a01b0383166004820152602401610734565b5f8381526007820160205260409020546001600160a01b031633146111bd57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610734565b5f928352600c01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f6111f461163e565b8054604051636af907fb60e11b8152600481018590529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa15801561123e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112659190810190613411565b519050600481600581111561127c5761127c613366565b1461129c578060405163170cc93360e21b81526004016107349190613598565b5f8381526007830160205260409020546001600160a01b031633146112c15733611198565b5f838152600783016020526040902054610d87906001600160a01b03168461249a565b5f6112ed611607565b5f6112f661163e565b805460405163025a076560e61b815263ffffffff861660048201529192505f916001600160a01b0390911690639681d940906024016020604051808303815f875af1158015611347573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061136b9190613581565b8254604051636af907fb60e11b8152600481018390529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113dc9190810190613411565b90506113e782611b9f565b6113f5575091506114799050565b5f828152600784016020908152604080832054600c870190925290912080546001600160a01b031981169091556001600160a01b039182169116806114375750805b60048351600581111561144c5761144c613366565b0361145b5761145b818561249a565b6114718261146c856040015161110e565b6124c4565b509193505050505b61148f60015f805160206138a983398151915255565b919050565b5f61149d61163e565b54604051631474cbc960e31b815263ffffffff841660048201526001600160a01b039091169063a3a65e48906024016020604051808303815f875af11580156114e8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dda9190613581565b610c4e84848484612068565b610d878383835f6124d7565b5f61152d611607565b611538823334612503565b905061148f60015f805160206138a983398151915255565b61098b848484846124d7565b6001600160a01b03811661158e5760405163caa903f960e01b81526001600160a01b0382166004820152602401610734565b5f61159761163e565b5f8481526008820160205260409020549091506001600160a01b036101009091041633146115c55733611198565b5f928352600a01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6115fb61281b565b61160481612866565b50565b5f805160206138a983398151915280546001190161163857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60090565b5f61166b61163e565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156116a4576116a4613366565b60038111156116b5576116b5613366565b815281546001600160a01b03610100909104811660208084019190915260018401546040808501919091526002909401546001600160401b038082166060860152600160401b820481166080860152600160801b8204811660a0860152600160c01b9091041660c09093019290925283830151865484516304e0efb360e11b8152945195965090949116926309c1df669260048083019391928290030181865afa158015611765573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178991906135f6565b82608001516117989190613611565b6001600160401b03164210156117cc5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b5f848152600884016020908152604080832080546001600160a81b031916815560018101849055600201839055600a8601909152902080546001600160a01b031981169091556001600160a01b031680611827575060208201515b5f806118348388866128e1565b9150915061184d856020015161146c876060015161110e565b6040805183815260208101839052859189917f5ecc5b26a9265302cf871229b3d983e5ca57dbb1448966c6c58b2d3c68bc7f7e910160405180910390a350505050505050565b60015f805160206138a983398151915255565b5f806118b061163e565b8054604051635b73516560e11b8152600481018990529192506001600160a01b03169063b6e6a2ca906024015f604051808303815f87803b1580156118f3575f80fd5b505af1158015611905573d5f803e3d5ffd5b50508254604051636af907fb60e11b8152600481018a90525f93506001600160a01b03909116915063d5f20ff6906024015f60405180830381865afa158015611950573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119779190810190613411565b905061198287611b9f565b61199157600192505050611b97565b5f8781526007830160205260409020546001600160a01b031633146119b65733611198565b5f87815260078301602052604090205460c08201516119e591600160b01b90046001600160401b031690613611565b6001600160401b03168160e001516001600160401b03161015611a2c5760e081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610734565b5f8615611a4457611a3d8887611bc8565b9050611a62565b505f8781526007830160205260409020600101546001600160401b03165b600583015460408301515f916001600160a01b031690634f22429f90611a879061110e565b60c086015160e0808801516040519185901b6001600160e01b031916825260048201939093526001600160401b0391821660248201819052604482015291811660648301528516608482015260a401602060405180830381865afa158015611af1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b159190613581565b90506001600160a01b038616611b41575f8981526007850160205260409020546001600160a01b031695505b5f898152600b8501602052604081208054839290611b60908490613638565b90915550505f898152600c94909401602052604090932080546001600160a01b0319166001600160a01b0387161790555050151590505b949350505050565b5f80611ba961163e565b5f938452600701602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c13573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c3a919081019061364b565b9150915080611c5c57604051636b2f19e960e01b815260040160405180910390fd5b5f611c6561163e565b6006810154845191925014611c93578251604051636ba589a560e01b81526004810191909152602401610734565b60208301516001600160a01b031615611ccf576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610734565b60208301516001600160a01b031615611d0b576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610734565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b8152600401611d48919061356f565b6040805180830381865af4158015611d62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8691906134f0565b91509150818814611db45760405163fee3144560e01b81526004810183905260248101899052604401610734565b5f8881526007840160205260409020600101546001600160401b039081169082161115611e45575f888152600784016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2610d64565b50505f95865260070160205250506040909220600101546001600160401b031692915050565b5f80611e7561163e565b600381015490915061ffff600160401b90910481169086161080611e9e575061271061ffff8616115b15611ec257604051635f12e6c360e11b815261ffff86166004820152602401610734565b60038101546001600160401b039081169085161015611efe576040516202a06d60e11b81526001600160401b0385166004820152602401610734565b8060010154831080611f135750806002015483115b15611f345760405163222d164360e21b815260048101849052602401610734565b825f611f3f82610d8c565b90505f835f015f9054906101000a90046001600160a01b03166001600160a01b031663ed285ae18e8e8e8e8e886040518763ffffffff1660e01b8152600401611f8d96959493929190613757565b6020604051808303815f875af1158015611fa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcd9190613581565b5f818152600786016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600c9096019095529790932080546001600160a01b03191690961790955550939998505050505050505050565b5f8061207261163e565b5f878152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156120ab576120ab613366565b60038111156120bc576120bc613366565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa15801561216d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121949190810190613411565b90506002835160038111156121ab576121ab613366565b146121cc578251604051633b0d540d60e21b8152610734919060040161337a565b60208301516001600160a01b03163314612268575f8281526007850160205260409020546001600160a01b031633146122055733611198565b5f82815260078501602052604090205460c082015161223491600160b01b90046001600160401b031690613611565b6001600160401b03164210156122685760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b60028151600581111561227d5761227d613366565b03612416576003840154608084015161229f916001600160401b031690613611565b6001600160401b03164210156122d35760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b87156122e5576122e38288611bc8565b505b5f8981526008850160205260409020805460ff191660031790558354606084015160a08301516001600160a01b0390921691636610966991859161232991906137ca565b6040516001600160e01b031960e085901b16815260048101929092526001600160401b0316602482015260440160408051808303815f875af1158015612371573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061239591906137ea565b505f8a8152600886016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556123d884888c61298e565b9050828a7f5abe543af12bb7f76f6fa9daaa9d95d181c5e90566df58d3c012216b6245eeaf60405160405180910390a315159450611b979350505050565b60048151600581111561242b5761242b613366565b036124525761243b83878b61298e565b5061244589611662565b6001945050505050611b97565b805160405163170cc93360e21b81526107349190600401613598565b61247a84848484612068565b61098b57604051631036cf9160e11b815260048101859052602401610734565b5f6124a361163e565b5f838152600b820160205260408120805491905590915061098b8482612be8565b61097b6001600160a01b03831682612c46565b6124e3848484846118a6565b61098b57604051635bff683f60e11b815260048101859052602401610734565b5f8061250d61163e565b90505f61251984610d8c565b8254604051636af907fb60e11b8152600481018990529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015612563573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261258a9190810190613411565b905061259587611b9f565b6125b5576040516330efa98b60e01b815260048101889052602401610734565b6002815160058111156125ca576125ca613366565b146125eb57805160405163170cc93360e21b81526107349190600401613598565b5f828260a001516125fc9190613611565b905083600301600a9054906101000a90046001600160401b031682604001516126259190613816565b6001600160401b0316816001600160401b0316111561266257604051636d51fe0560e11b81526001600160401b0382166004820152602401610734565b8354604051636610966960e01b8152600481018a90526001600160401b03831660248201525f9182916001600160a01b039091169063661096699060440160408051808303815f875af11580156126bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126df91906137ea565b915091505f8a8360405160200161270d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260088b019093529120805491925060019160ff1916828002179055505f8181526008880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fdf91f7709a30fda3fc5fc5dc97cb5d5b05e67e193dccaaef3cb332d23fda83d19060800160405180910390a496505050505050505b9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661286457604051631afcd79f60e31b815260040160405180910390fd5b565b61286e61281b565b612876612cd9565b6116046128866020830183613841565b602083013560408401356128a06080860160608701613304565b6128b060a087016080880161385c565b6128c060c0880160a08901613875565b60c08801356128d66101008a0160e08b01613841565b896101000135612ce9565b5f805f6128ec61163e565b5f86815260098201602052604081208054908290559192509081908015612980575f8781526007850160205260409020546127109061293690600160a01b900461ffff16836135df565b61294091906135c0565b91508184600b015f8981526020019081526020015f205f8282546129649190613638565b9091555061297490508282613895565b92506129808984612be8565b509097909650945050505050565b5f8061299861163e565b80546040808801519051636af907fb60e11b81529293505f926001600160a01b039092169163d5f20ff6916129d39160040190815260200190565b5f60405180830381865afa1580156129ed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a149190810190613411565b90505f600382516005811115612a2c57612a2c613366565b1480612a4a5750600482516005811115612a4857612a48613366565b145b15612a5a575060e0810151612a97565b600282516005811115612a6f57612a6f613366565b03612a7b575042612a97565b815160405163170cc93360e21b81526107349190600401613598565b86608001516001600160401b0316816001600160401b031611612abf575f9350505050612814565b600583015460608801515f916001600160a01b031690634f22429f90612ae49061110e565b60c086015160808c01516040808e01515f90815260078b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa158015612b65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b899190613581565b90506001600160a01b038716612ba157876020015196505b5f8681526009850160209081526040808320849055600a90960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c34575f80fd5b505af1158015610f72573d5f803e3d5ffd5b80471015612c695760405163cd78605960e01b8152306004820152602401610734565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612cb2576040519150601f19603f3d011682016040523d82523d5f602084013e612cb7565b606091505b5050905080610d8757604051630a12f52160e11b815260040160405180910390fd5b612ce161281b565b612864612f12565b612cf161281b565b5f612cfa61163e565b905061ffff86161580612d12575061271061ffff8716115b15612d3657604051635f12e6c360e11b815261ffff87166004820152602401610734565b87891115612d5a5760405163222d164360e21b8152600481018a9052602401610734565b60ff85161580612d6d5750600a60ff8616115b15612d905760405163170db35960e31b815260ff86166004820152602401610734565b896001600160a01b03166309c1df666040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df091906135f6565b6001600160401b0316876001600160401b03161015612e2c576040516202a06d60e11b81526001600160401b0388166004820152602401610734565b835f03612e4c5760405163a733007160e01b815260040160405180910390fd5b81612e6d57604051632f6bd1db60e01b815260048101839052602401610734565b80546001600160a01b039a8b166001600160a01b031991821617825560018201999099556002810197909755600387018054600160501b60ff9096169590950267ffffffffffffffff60501b1961ffff909716600160401b0269ffffffffffffffffffff199096166001600160401b03909816979097179490941794909416949094179091556004840155600583018054929095169190931617909255600690910155565b61189361281b565b5f6101208284031215612f2b575f80fd5b50919050565b803563ffffffff8116811461148f575f80fd5b5f8060408385031215612f55575f80fd5b82359150612f6560208401612f31565b90509250929050565b8015158114611604575f80fd5b5f805f60608486031215612f8d575f80fd5b833592506020840135612f9f81612f6e565b9150612fad60408501612f31565b90509250925092565b5f60208284031215612fc6575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171561300357613003612fcd565b60405290565b60405161010081016001600160401b038111828210171561300357613003612fcd565b604051601f8201601f191681016001600160401b038111828210171561305457613054612fcd565b604052919050565b5f6001600160401b0382111561307457613074612fcd565b50601f01601f191660200190565b5f82601f830112613091575f80fd5b81356130a461309f8261305c565b61302c565b8181528460208386010111156130b8575f80fd5b816020850160208301375f918101602001919091529392505050565b6001600160401b0381168114611604575f80fd5b803561148f816130d4565b6001600160a01b0381168114611604575f80fd5b5f60408284031215613117575f80fd5b61311f612fe1565b905061312a82612f31565b81526020808301356001600160401b0380821115613146575f80fd5b818501915085601f830112613159575f80fd5b81358181111561316b5761316b612fcd565b8060051b915061317c84830161302c565b8181529183018401918481019088841115613195575f80fd5b938501935b838510156131bf57843592506131af836130f3565b828252938501939085019061319a565b808688015250505050505092915050565b803561ffff8116811461148f575f80fd5b5f805f805f805f60e0888a0312156131f7575f80fd5b87356001600160401b038082111561320d575f80fd5b6132198b838c01613082565b985060208a013591508082111561322e575f80fd5b61323a8b838c01613082565b975061324860408b016130e8565b965060608a013591508082111561325d575f80fd5b6132698b838c01613107565b955060808a013591508082111561327e575f80fd5b5061328b8a828b01613107565b93505061329a60a089016131d0565b91506132a860c089016130e8565b905092959891949750929550565b5f805f80608085870312156132c9575f80fd5b8435935060208501356132db81612f6e565b92506132e960408601612f31565b915060608501356132f9816130f3565b939692955090935050565b5f60208284031215613314575f80fd5b8135612814816130d4565b5f8060408385031215613330575f80fd5b823591506020830135613342816130f3565b809150509250929050565b5f6020828403121561335d575f80fd5b61281482612f31565b634e487b7160e01b5f52602160045260245ffd5b602081016004831061338e5761338e613366565b91905290565b80516006811061148f575f80fd5b5f5b838110156133bc5781810151838201526020016133a4565b50505f910152565b5f82601f8301126133d3575f80fd5b81516133e161309f8261305c565b8181528460208386010111156133f5575f80fd5b611b978260208301602087016133a2565b805161148f816130d4565b5f60208284031215613421575f80fd5b81516001600160401b0380821115613437575f80fd5b90830190610100828603121561344b575f80fd5b613453613009565b61345c83613394565b815260208301518281111561346f575f80fd5b61347b878286016133c4565b60208301525061348d60408401613406565b604082015261349e60608401613406565b60608201526134af60808401613406565b60808201526134c060a08401613406565b60a08201526134d160c08401613406565b60c08201526134e260e08401613406565b60e082015295945050505050565b5f8060408385031215613501575f80fd5b825191506020830151613342816130d4565b5f60208284031215613523575f80fd5b81516001600160401b03811115613538575f80fd5b611b97848285016133c4565b5f815180845261355b8160208601602086016133a2565b601f01601f19169290920160200192915050565b602081525f6128146020830184613544565b5f60208284031215613591575f80fd5b5051919050565b602081016006831061338e5761338e613366565b634e487b7160e01b5f52601160045260245ffd5b5f826135da57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610dda57610dda6135ac565b5f60208284031215613606575f80fd5b8151612814816130d4565b6001600160401b03818116838216019080821115613631576136316135ac565b5092915050565b80820180821115610dda57610dda6135ac565b5f806040838503121561365c575f80fd5b82516001600160401b0380821115613672575f80fd5b9084019060608287031215613685575f80fd5b6040516060810181811083821117156136a0576136a0612fcd565b6040528251815260208301516136b5816130f3565b60208201526040830151828111156136cb575f80fd5b6136d7888286016133c4565b604083015250809450505050602083015161334281612f6e565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b8083101561374c5784516001600160a01b03168252938301936001929092019190830190613723565b509695505050505050565b60c081525f61376960c0830189613544565b828103602084015261377b8189613544565b90506001600160401b038088166040850152838203606085015261379f82886136f1565b915083820360808501526137b382876136f1565b925080851660a08501525050979650505050505050565b6001600160401b03828116828216039080821115613631576136316135ac565b5f80604083850312156137fb575f80fd5b8251613806816130d4565b6020939093015192949293505050565b6001600160401b03818116838216028082169190828114613839576138396135ac565b505092915050565b5f60208284031215613851575f80fd5b8135612814816130f3565b5f6020828403121561386c575f80fd5b612814826131d0565b5f60208284031215613885575f80fd5b813560ff81168114612814575f80fd5b81810381811115610dda57610dda6135ac56fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220c66873e57048527d5150963cc971402cacb78e3aba6436ab86d5d44e4c37dff164736f6c63430008190033", + Bin: "0x608060405234801561000f575f80fd5b50604051613a4b380380613a4b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138fe8061014d5f395ff3fe6080604052600436106101ba575f3560e01c806362065856116100f2578063a3a65e4811610092578063b771b3bc11610062578063b771b3bc146104f2578063cacd97551461050c578063cc71bbba1461051f578063fb8b11dd1461053e575f80fd5b8063a3a65e4814610495578063a9778a7a1461034e578063aac80c39146104b4578063b2c1712e146104d3575f80fd5b80638af5499e116100cd5780638af5499e146104195780638ef34c981461043857806393e24598146104575780639681d94014610476575f80fd5b806362065856146103b4578063732214f8146103d35780637a63ad85146103e6575f80fd5b806327bf60cd1161015d578063329c3e1211610138578063329c3e121461031c57806335455ded1461034e5780634b396bcc1461037657806360ad778414610395575f80fd5b806327bf60cd146102a75780632aa56638146102c65780632e2194d8146102e5575f80fd5b806316679564116101985780631667956414610229578063245dafcb1461024857806325e1c77614610267578063264dc60314610286575f80fd5b80630d436317146101be57806313409645146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004612f1a565b61055d565b005b3480156101ea575f80fd5b506101dd6101f9366004612f44565b61063f565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd610243366004612f7b565b61097f565b348015610253575f80fd5b506101dd610262366004612fb6565b610991565b348015610272575f80fd5b506101dd610281366004612f44565b610c55565b6102996102943660046131e1565b610d33565b604051908152602001610220565b3480156102b2575f80fd5b506101dd6102c1366004612f7b565b610d6f565b3480156102d1575f80fd5b506101dd6102e0366004612f7b565b610d7b565b3480156102f0575f80fd5b506103046102ff366004612fb6565b610d8c565b6040516001600160401b039091168152602001610220565b348015610327575f80fd5b506103366001600160991b0181565b6040516001600160a01b039091168152602001610220565b348015610359575f80fd5b5061036361271081565b60405161ffff9091168152602001610220565b348015610381575f80fd5b506101dd6103903660046132b6565b610de0565b3480156103a0575f80fd5b506101dd6103af366004612f44565b610dec565b3480156103bf575f80fd5b506102996103ce366004613304565b61110e565b3480156103de575f80fd5b506102995f81565b3480156103f1575f80fd5b506102997fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60081565b348015610424575f80fd5b506101dd6104333660046132b6565b61112e565b348015610443575f80fd5b506101dd61045236600461331f565b61113a565b348015610462575f80fd5b506101dd610471366004612fb6565b6111eb565b348015610481575f80fd5b5061029961049036600461334d565b6112e4565b3480156104a0575f80fd5b506102996104af36600461334d565b611494565b3480156104bf575f80fd5b506101dd6104ce3660046132b6565b61150c565b3480156104de575f80fd5b506101dd6104ed366004612f7b565b611518565b3480156104fd575f80fd5b506103366005600160991b0181565b61029961051a366004612fb6565b611524565b34801561052a575f80fd5b506101dd6105393660046132b6565b611550565b348015610549575f80fd5b506101dd61055836600461331f565b61155c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806105a6575080546001600160401b03808416911610155b156105c45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556105ee836115f3565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610647611607565b5f61065061163e565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff16600381111561068957610689613366565b600381111561069a5761069a613366565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561071357610713613366565b1461073d578051604051633b0d540d60e21b8152610734919060040161337a565b60405180910390fd5b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610788573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107af9190810190613411565b9050600483546040808501519051636af907fb60e11b81526001600160a01b039092169163d5f20ff6916107e99160040190815260200190565b5f60405180830381865afa158015610803573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261082a9190810190613411565b51600581111561083c5761083c613366565b1415801561086357508160c001516001600160401b031681608001516001600160401b0316105b1561095957825460405163338587c560e21b815263ffffffff861660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af11580156108b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108db91906134f0565b91509150818460400151146109145781846040015160405163fee3144560e01b8152600401610734929190918252602082015260400190565b806001600160401b03168460c001516001600160401b0316111561095657604051632e19bc2d60e11b81526001600160401b0382166004820152602401610734565b50505b61096285611662565b50505061097b60015f805160206138a983398151915255565b5050565b61098b8383835f6118a6565b50505050565b5f61099a61163e565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156109d3576109d3613366565b60038111156109e4576109e4613366565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115610a5d57610a5d613366565b14158015610a7e5750600381516003811115610a7b57610a7b613366565b14155b15610a9f578051604051633b0d540d60e21b8152610734919060040161337a565b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610aea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b119190810190613411565b905080606001516001600160401b03165f03610b43576040516339b894f960e21b815260048101859052602401610734565b604080830151606083015160a0840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93610bb193906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015610bcb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bf29190810190613513565b6040518263ffffffff1660e01b8152600401610c0e919061356f565b6020604051808303815f875af1158015610c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4e9190613581565b5050505050565b610c5e82611b9f565b610c7e576040516330efa98b60e01b815260048101839052602401610734565b5f610c8761163e565b54604051636af907fb60e11b8152600481018590526001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015610ccb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cf29190810190613411565b5190506002816005811115610d0957610d09613366565b14610d29578060405163170cc93360e21b81526004016107349190613598565b61098b8383611bc8565b5f610d3c611607565b610d4c8888888888888834611e6b565b9050610d6460015f805160206138a983398151915255565b979650505050505050565b61098b8383835f612068565b610d878383835f61246e565b505050565b5f80610d9661163e565b60040154610da490846135c0565b9050801580610db957506001600160401b0381115b15610dda5760405163222d164360e21b815260048101849052602401610734565b92915050565b610c4e848484846118a6565b5f610df561163e565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115610e2e57610e2e613366565b6003811115610e3f57610e3f613366565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015610ef0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f179190810190613411565b9050600183516003811115610f2e57610f2e613366565b14610f4f578251604051633b0d540d60e21b8152610734919060040161337a565b600481516005811115610f6457610f64613366565b03610f7a57610f7286611662565b505050505050565b8260a001516001600160401b031681608001516001600160401b0316101561108257835460405163338587c560e21b815263ffffffff871660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af1158015610feb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100f91906134f0565b9150915081841461103d5760405163fee3144560e01b81526004810183905260248101859052604401610734565b8460a001516001600160401b0316816001600160401b0316101561107f57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610734565b50505b5f868152600885016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252839188917f3886b7389bccb22cac62838dee3f400cf8b22289295283e01a2c7093f93dd5aa910160405180910390a3505050505050565b5f61111761163e565b60040154610dda906001600160401b0384166135df565b61098b8484848461246e565b5f61114361163e565b90506001600160a01b0382166111775760405163caa903f960e01b81526001600160a01b0383166004820152602401610734565b5f8381526007820160205260409020546001600160a01b031633146111bd57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610734565b5f928352600c01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f6111f461163e565b8054604051636af907fb60e11b8152600481018590529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa15801561123e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112659190810190613411565b519050600481600581111561127c5761127c613366565b1461129c578060405163170cc93360e21b81526004016107349190613598565b5f8381526007830160205260409020546001600160a01b031633146112c15733611198565b5f838152600783016020526040902054610d87906001600160a01b03168461249a565b5f6112ed611607565b5f6112f661163e565b805460405163025a076560e61b815263ffffffff861660048201529192505f916001600160a01b0390911690639681d940906024016020604051808303815f875af1158015611347573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061136b9190613581565b8254604051636af907fb60e11b8152600481018390529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113dc9190810190613411565b90506113e782611b9f565b6113f5575091506114799050565b5f828152600784016020908152604080832054600c870190925290912080546001600160a01b031981169091556001600160a01b039182169116806114375750805b60048351600581111561144c5761144c613366565b0361145b5761145b818561249a565b6114718261146c856040015161110e565b6124c4565b509193505050505b61148f60015f805160206138a983398151915255565b919050565b5f61149d61163e565b54604051631474cbc960e31b815263ffffffff841660048201526001600160a01b039091169063a3a65e48906024016020604051808303815f875af11580156114e8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dda9190613581565b610c4e84848484612068565b610d878383835f6124d7565b5f61152d611607565b611538823334612503565b905061148f60015f805160206138a983398151915255565b61098b848484846124d7565b6001600160a01b03811661158e5760405163caa903f960e01b81526001600160a01b0382166004820152602401610734565b5f61159761163e565b5f8481526008820160205260409020549091506001600160a01b036101009091041633146115c55733611198565b5f928352600a01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6115fb61281b565b61160481612866565b50565b5f805160206138a983398151915280546001190161163857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60090565b5f61166b61163e565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156116a4576116a4613366565b60038111156116b5576116b5613366565b815281546001600160a01b03610100909104811660208084019190915260018401546040808501919091526002909401546001600160401b038082166060860152600160401b820481166080860152600160801b8204811660a0860152600160c01b9091041660c09093019290925283830151865484516304e0efb360e11b8152945195965090949116926309c1df669260048083019391928290030181865afa158015611765573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178991906135f6565b82608001516117989190613611565b6001600160401b03164210156117cc5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b5f848152600884016020908152604080832080546001600160a81b031916815560018101849055600201839055600a8601909152902080546001600160a01b031981169091556001600160a01b031680611827575060208201515b5f806118348388866128e1565b9150915061184d856020015161146c876060015161110e565b6040805183815260208101839052859189917f5ecc5b26a9265302cf871229b3d983e5ca57dbb1448966c6c58b2d3c68bc7f7e910160405180910390a350505050505050565b60015f805160206138a983398151915255565b5f806118b061163e565b8054604051635b73516560e11b8152600481018990529192506001600160a01b03169063b6e6a2ca906024015f604051808303815f87803b1580156118f3575f80fd5b505af1158015611905573d5f803e3d5ffd5b50508254604051636af907fb60e11b8152600481018a90525f93506001600160a01b03909116915063d5f20ff6906024015f60405180830381865afa158015611950573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119779190810190613411565b905061198287611b9f565b61199157600192505050611b97565b5f8781526007830160205260409020546001600160a01b031633146119b65733611198565b5f87815260078301602052604090205460c08201516119e591600160b01b90046001600160401b031690613611565b6001600160401b03168160e001516001600160401b03161015611a2c5760e081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610734565b5f8615611a4457611a3d8887611bc8565b9050611a62565b505f8781526007830160205260409020600101546001600160401b03165b600583015460408301515f916001600160a01b031690634f22429f90611a879061110e565b60c086015160e0808801516040519185901b6001600160e01b031916825260048201939093526001600160401b0391821660248201819052604482015291811660648301528516608482015260a401602060405180830381865afa158015611af1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b159190613581565b90506001600160a01b038616611b41575f8981526007850160205260409020546001600160a01b031695505b5f898152600b8501602052604081208054839290611b60908490613638565b90915550505f898152600c94909401602052604090932080546001600160a01b0319166001600160a01b0387161790555050151590505b949350505050565b5f80611ba961163e565b5f938452600701602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c13573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c3a919081019061364b565b9150915080611c5c57604051636b2f19e960e01b815260040160405180910390fd5b5f611c6561163e565b6006810154845191925014611c93578251604051636ba589a560e01b81526004810191909152602401610734565b60208301516001600160a01b031615611ccf576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610734565b60208301516001600160a01b031615611d0b576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610734565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b8152600401611d48919061356f565b6040805180830381865af4158015611d62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8691906134f0565b91509150818814611db45760405163fee3144560e01b81526004810183905260248101899052604401610734565b5f8881526007840160205260409020600101546001600160401b039081169082161115611e45575f888152600784016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2610d64565b50505f95865260070160205250506040909220600101546001600160401b031692915050565b5f80611e7561163e565b600381015490915061ffff600160401b90910481169086161080611e9e575061271061ffff8616115b15611ec257604051635f12e6c360e11b815261ffff86166004820152602401610734565b60038101546001600160401b039081169085161015611efe576040516202a06d60e11b81526001600160401b0385166004820152602401610734565b8060010154831080611f135750806002015483115b15611f345760405163222d164360e21b815260048101849052602401610734565b825f611f3f82610d8c565b90505f835f015f9054906101000a90046001600160a01b03166001600160a01b031663ed285ae18e8e8e8e8e886040518763ffffffff1660e01b8152600401611f8d96959493929190613757565b6020604051808303815f875af1158015611fa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcd9190613581565b5f818152600786016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600c9096019095529790932080546001600160a01b03191690961790955550939998505050505050505050565b5f8061207261163e565b5f878152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156120ab576120ab613366565b60038111156120bc576120bc613366565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa15801561216d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121949190810190613411565b90506002835160038111156121ab576121ab613366565b146121cc578251604051633b0d540d60e21b8152610734919060040161337a565b60208301516001600160a01b03163314612268575f8281526007850160205260409020546001600160a01b031633146122055733611198565b5f82815260078501602052604090205460c082015161223491600160b01b90046001600160401b031690613611565b6001600160401b03164210156122685760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b60028151600581111561227d5761227d613366565b03612416576003840154608084015161229f916001600160401b031690613611565b6001600160401b03164210156122d35760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b87156122e5576122e38288611bc8565b505b5f8981526008850160205260409020805460ff191660031790558354606084015160a08301516001600160a01b0390921691636610966991859161232991906137ca565b6040516001600160e01b031960e085901b16815260048101929092526001600160401b0316602482015260440160408051808303815f875af1158015612371573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061239591906137ea565b505f8a8152600886016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556123d884888c61298e565b9050828a7f5abe543af12bb7f76f6fa9daaa9d95d181c5e90566df58d3c012216b6245eeaf60405160405180910390a315159450611b979350505050565b60048151600581111561242b5761242b613366565b036124525761243b83878b61298e565b5061244589611662565b6001945050505050611b97565b805160405163170cc93360e21b81526107349190600401613598565b61247a84848484612068565b61098b57604051631036cf9160e11b815260048101859052602401610734565b5f6124a361163e565b5f838152600b820160205260408120805491905590915061098b8482612be8565b61097b6001600160a01b03831682612c46565b6124e3848484846118a6565b61098b57604051635bff683f60e11b815260048101859052602401610734565b5f8061250d61163e565b90505f61251984610d8c565b8254604051636af907fb60e11b8152600481018990529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015612563573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261258a9190810190613411565b905061259587611b9f565b6125b5576040516330efa98b60e01b815260048101889052602401610734565b6002815160058111156125ca576125ca613366565b146125eb57805160405163170cc93360e21b81526107349190600401613598565b5f828260a001516125fc9190613611565b905083600301600a9054906101000a90046001600160401b031682604001516126259190613816565b6001600160401b0316816001600160401b0316111561266257604051636d51fe0560e11b81526001600160401b0382166004820152602401610734565b8354604051636610966960e01b8152600481018a90526001600160401b03831660248201525f9182916001600160a01b039091169063661096699060440160408051808303815f875af11580156126bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126df91906137ea565b915091505f8a8360405160200161270d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260088b019093529120805491925060019160ff1916828002179055505f8181526008880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fdf91f7709a30fda3fc5fc5dc97cb5d5b05e67e193dccaaef3cb332d23fda83d19060800160405180910390a496505050505050505b9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661286457604051631afcd79f60e31b815260040160405180910390fd5b565b61286e61281b565b612876612cd9565b6116046128866020830183613841565b602083013560408401356128a06080860160608701613304565b6128b060a087016080880161385c565b6128c060c0880160a08901613875565b60c08801356128d66101008a0160e08b01613841565b896101000135612ce9565b5f805f6128ec61163e565b5f86815260098201602052604081208054908290559192509081908015612980575f8781526007850160205260409020546127109061293690600160a01b900461ffff16836135df565b61294091906135c0565b91508184600b015f8981526020019081526020015f205f8282546129649190613638565b9091555061297490508282613895565b92506129808984612be8565b509097909650945050505050565b5f8061299861163e565b80546040808801519051636af907fb60e11b81529293505f926001600160a01b039092169163d5f20ff6916129d39160040190815260200190565b5f60405180830381865afa1580156129ed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a149190810190613411565b90505f600382516005811115612a2c57612a2c613366565b1480612a4a5750600482516005811115612a4857612a48613366565b145b15612a5a575060e0810151612a97565b600282516005811115612a6f57612a6f613366565b03612a7b575042612a97565b815160405163170cc93360e21b81526107349190600401613598565b86608001516001600160401b0316816001600160401b031611612abf575f9350505050612814565b600583015460608801515f916001600160a01b031690634f22429f90612ae49061110e565b60c086015160808c01516040808e01515f90815260078b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa158015612b65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b899190613581565b90506001600160a01b038716612ba157876020015196505b5f8681526009850160209081526040808320849055600a90960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c34575f80fd5b505af1158015610f72573d5f803e3d5ffd5b80471015612c695760405163cd78605960e01b8152306004820152602401610734565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612cb2576040519150601f19603f3d011682016040523d82523d5f602084013e612cb7565b606091505b5050905080610d8757604051630a12f52160e11b815260040160405180910390fd5b612ce161281b565b612864612f12565b612cf161281b565b5f612cfa61163e565b905061ffff86161580612d12575061271061ffff8716115b15612d3657604051635f12e6c360e11b815261ffff87166004820152602401610734565b87891115612d5a5760405163222d164360e21b8152600481018a9052602401610734565b60ff85161580612d6d5750600a60ff8616115b15612d905760405163170db35960e31b815260ff86166004820152602401610734565b896001600160a01b03166309c1df666040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df091906135f6565b6001600160401b0316876001600160401b03161015612e2c576040516202a06d60e11b81526001600160401b0388166004820152602401610734565b835f03612e4c5760405163a733007160e01b815260040160405180910390fd5b81612e6d57604051632f6bd1db60e01b815260048101839052602401610734565b80546001600160a01b039a8b166001600160a01b031991821617825560018201999099556002810197909755600387018054600160501b60ff9096169590950267ffffffffffffffff60501b1961ffff909716600160401b0269ffffffffffffffffffff199096166001600160401b03909816979097179490941794909416949094179091556004840155600583018054929095169190931617909255600690910155565b61189361281b565b5f6101208284031215612f2b575f80fd5b50919050565b803563ffffffff8116811461148f575f80fd5b5f8060408385031215612f55575f80fd5b82359150612f6560208401612f31565b90509250929050565b8015158114611604575f80fd5b5f805f60608486031215612f8d575f80fd5b833592506020840135612f9f81612f6e565b9150612fad60408501612f31565b90509250925092565b5f60208284031215612fc6575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171561300357613003612fcd565b60405290565b60405161010081016001600160401b038111828210171561300357613003612fcd565b604051601f8201601f191681016001600160401b038111828210171561305457613054612fcd565b604052919050565b5f6001600160401b0382111561307457613074612fcd565b50601f01601f191660200190565b5f82601f830112613091575f80fd5b81356130a461309f8261305c565b61302c565b8181528460208386010111156130b8575f80fd5b816020850160208301375f918101602001919091529392505050565b6001600160401b0381168114611604575f80fd5b803561148f816130d4565b6001600160a01b0381168114611604575f80fd5b5f60408284031215613117575f80fd5b61311f612fe1565b905061312a82612f31565b81526020808301356001600160401b0380821115613146575f80fd5b818501915085601f830112613159575f80fd5b81358181111561316b5761316b612fcd565b8060051b915061317c84830161302c565b8181529183018401918481019088841115613195575f80fd5b938501935b838510156131bf57843592506131af836130f3565b828252938501939085019061319a565b808688015250505050505092915050565b803561ffff8116811461148f575f80fd5b5f805f805f805f60e0888a0312156131f7575f80fd5b87356001600160401b038082111561320d575f80fd5b6132198b838c01613082565b985060208a013591508082111561322e575f80fd5b61323a8b838c01613082565b975061324860408b016130e8565b965060608a013591508082111561325d575f80fd5b6132698b838c01613107565b955060808a013591508082111561327e575f80fd5b5061328b8a828b01613107565b93505061329a60a089016131d0565b91506132a860c089016130e8565b905092959891949750929550565b5f805f80608085870312156132c9575f80fd5b8435935060208501356132db81612f6e565b92506132e960408601612f31565b915060608501356132f9816130f3565b939692955090935050565b5f60208284031215613314575f80fd5b8135612814816130d4565b5f8060408385031215613330575f80fd5b823591506020830135613342816130f3565b809150509250929050565b5f6020828403121561335d575f80fd5b61281482612f31565b634e487b7160e01b5f52602160045260245ffd5b602081016004831061338e5761338e613366565b91905290565b80516006811061148f575f80fd5b5f5b838110156133bc5781810151838201526020016133a4565b50505f910152565b5f82601f8301126133d3575f80fd5b81516133e161309f8261305c565b8181528460208386010111156133f5575f80fd5b611b978260208301602087016133a2565b805161148f816130d4565b5f60208284031215613421575f80fd5b81516001600160401b0380821115613437575f80fd5b90830190610100828603121561344b575f80fd5b613453613009565b61345c83613394565b815260208301518281111561346f575f80fd5b61347b878286016133c4565b60208301525061348d60408401613406565b604082015261349e60608401613406565b60608201526134af60808401613406565b60808201526134c060a08401613406565b60a08201526134d160c08401613406565b60c08201526134e260e08401613406565b60e082015295945050505050565b5f8060408385031215613501575f80fd5b825191506020830151613342816130d4565b5f60208284031215613523575f80fd5b81516001600160401b03811115613538575f80fd5b611b97848285016133c4565b5f815180845261355b8160208601602086016133a2565b601f01601f19169290920160200192915050565b602081525f6128146020830184613544565b5f60208284031215613591575f80fd5b5051919050565b602081016006831061338e5761338e613366565b634e487b7160e01b5f52601160045260245ffd5b5f826135da57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610dda57610dda6135ac565b5f60208284031215613606575f80fd5b8151612814816130d4565b6001600160401b03818116838216019080821115613631576136316135ac565b5092915050565b80820180821115610dda57610dda6135ac565b5f806040838503121561365c575f80fd5b82516001600160401b0380821115613672575f80fd5b9084019060608287031215613685575f80fd5b6040516060810181811083821117156136a0576136a0612fcd565b6040528251815260208301516136b5816130f3565b60208201526040830151828111156136cb575f80fd5b6136d7888286016133c4565b604083015250809450505050602083015161334281612f6e565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b8083101561374c5784516001600160a01b03168252938301936001929092019190830190613723565b509695505050505050565b60c081525f61376960c0830189613544565b828103602084015261377b8189613544565b90506001600160401b038088166040850152838203606085015261379f82886136f1565b915083820360808501526137b382876136f1565b925080851660a08501525050979650505050505050565b6001600160401b03828116828216039080821115613631576136316135ac565b5f80604083850312156137fb575f80fd5b8251613806816130d4565b6020939093015192949293505050565b6001600160401b03818116838216028082169190828114613839576138396135ac565b505092915050565b5f60208284031215613851575f80fd5b8135612814816130f3565b5f6020828403121561386c575f80fd5b612814826131d0565b5f60208284031215613885575f80fd5b813560ff81168114612814575f80fd5b81810381811115610dda57610dda6135ac56fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212202d2cf36a26cacfe5cbe9495c4996f134a94c2b64bc3ebb3eb3f5d7355fa6cc5564736f6c63430008190033", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/PoAValidatorManagerV1/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManagerV1/PoAValidatorManager.go index e2616ba15..4813b3f44 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManagerV1/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManagerV1/PoAValidatorManager.go @@ -1,5 +1,7 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. +/* ABI bindings for v1 PoAValidatorManager, generated at tag validator-manager-v1.0.0, commit 046ca6d83c07c4cffecf61c06f4156b8b08725cc + * + * FOR TESTING PURPOSES ONLY - DO NOT USE IN PRODUCTION + */ package poavalidatormanager diff --git a/abi-bindings/go/validator-manager/PoAValidatorManagerV1/README.md b/abi-bindings/go/validator-manager/PoAValidatorManagerV1/README.md index e69de29bb..a0cffaa21 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManagerV1/README.md +++ b/abi-bindings/go/validator-manager/PoAValidatorManagerV1/README.md @@ -0,0 +1,3 @@ +# V1 PoAValidatorManager Bindings + +These ABI bindings are only used to test V1 [migration](../../../../contracts/validator-manager/MigratingFromV1.md), and should not be used in production. \ No newline at end of file diff --git a/tests/flows/validator-manager/migrate_from_v1.go b/tests/flows/validator-manager/migrate_from_v1.go new file mode 100644 index 000000000..353e6d273 --- /dev/null +++ b/tests/flows/validator-manager/migrate_from_v1.go @@ -0,0 +1,686 @@ +package staking + +import ( + "context" + "crypto/ecdsa" + "log" + goLog "log" + "math/big" + "sort" + "time" + + "github.com/ava-labs/avalanchego/config" + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/formatting/address" + "github.com/ava-labs/avalanchego/utils/logging" + "github.com/ava-labs/avalanchego/utils/units" + "github.com/ava-labs/avalanchego/vms/platformvm" + "github.com/ava-labs/avalanchego/vms/platformvm/txs" + warpMessage "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" + pwallet "github.com/ava-labs/avalanchego/wallet/chain/p/wallet" + ownableupgradeable "github.com/ava-labs/icm-contracts/abi-bindings/go/OwnableUpgradeable" + proxyadmin "github.com/ava-labs/icm-contracts/abi-bindings/go/ProxyAdmin" + nativetokenstakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/PoAValidatorManagerV1" + validatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ValidatorManager" + istakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/interfaces/IStakingManager" + "github.com/ava-labs/icm-contracts/tests/interfaces" + "github.com/ava-labs/icm-contracts/tests/network" + localnetwork "github.com/ava-labs/icm-contracts/tests/network" + "github.com/ava-labs/icm-contracts/tests/utils" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + + . "github.com/onsi/gomega" +) + +/* + * Register a PoA validator manager on a L1 with a proxy. The steps are as follows: + * - Generate random address to be the owner address + * - Fund native assets to the owner address + * - Deploy the V1 PoAValidatorManager contract + * - Deploy a TransparentUpgradeableProxy contract that points to the PoAValidatorManager + * - Call initialize on the V1 PoAValidatorManager through the proxy + * - Initialize and complete PoA validator registration + * + * Migrates the V1 PoAValidatorManager to a V2 ValidatorManager. The steps are as follows: + * - Deploy the ValidatorManager contract + * - Upgrade the TransparentUpgradeableProxy to point to the ValidatorManager + * - Call initialize on the ValidatorManager through the proxy + * - Migrate the registered validator to the V2 contract + * - Check that previous validator is still active + * - Attempt to delist previous PoA validator with wrong owner and check that it fails + * - Delist the previous PoA validator properly + * - Initialize and complete a new validator registration + * - Delist the new validator + */ +func MigrateFromV1PoA(network *localnetwork.LocalNetwork) { + cChainInfo := network.GetPrimaryNetworkInfo() + l1AInfo, _ := network.GetTwoL1s() + _, fundedKey := network.GetFundedAccountInfo() + pChainInfo := utils.GetPChainInfo(cChainInfo) + + // Generate random address to be the owner address + ownerKey, err := crypto.GenerateKey() + Expect(err).Should(BeNil()) + ownerAddress := crypto.PubkeyToAddress(ownerKey.PublicKey) + + // Transfer native assets to the owner account + ctx := context.Background() + fundAmount := big.NewInt(1e18) // 10avax + fundAmount.Mul(fundAmount, big.NewInt(10)) + utils.SendNativeTransfer( + ctx, + l1AInfo, + fundedKey, + ownerAddress, + fundAmount, + ) + + // Deploy PoAValidatorManager + validatorManagerProxy, nodes, initialValidationIDs := convertSubnetPoAV1( + network, + ctx, + l1AInfo, + []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits + ownerKey, + ) + + poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager( + validatorManagerProxy.Address, + l1AInfo.RPCClient, + ) + Expect(err).Should(BeNil()) + + signatureAggregator := utils.NewSignatureAggregator( + cChainInfo.NodeURIs[0], + []ids.ID{ + l1AInfo.SubnetID, + }, + ) + defer signatureAggregator.Shutdown() + + // + // Delist one initial validator + // + initializeAndCompleteEndInitialPoAValidationV1( + ctx, + signatureAggregator, + ownerKey, + fundedKey, + l1AInfo, + pChainInfo, + poaValidatorManager, + validatorManagerProxy.Address, + initialValidationIDs[0], + 0, + nodes[0].Weight, + network.GetPChainWallet(), + network.GetNetworkID(), + ) + + // Try to call with invalid owner + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1AInfo.EVMChainID) + Expect(err).Should(BeNil()) + + _, err = poaValidatorManager.InitializeValidatorRegistration( + opts, + poavalidatormanager.ValidatorRegistrationInput{ + NodeID: nodes[0].NodeID[:], + BlsPublicKey: nodes[0].NodePoP.PublicKey[:], + RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), + RemainingBalanceOwner: poavalidatormanager.PChainOwner{}, + DisableOwner: poavalidatormanager.PChainOwner{}, + }, + nodes[0].Weight, + ) + Expect(err).ShouldNot(BeNil()) + + // + // Re-register the validator as a SoV validator + // + expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) + poaValidationID := initializeAndCompletePoAValidatorRegistrationV1( + ctx, + signatureAggregator, + ownerKey, + fundedKey, + l1AInfo, + pChainInfo, + poaValidatorManager, + validatorManagerProxy.Address, + expiry, + nodes[0], + network.GetPChainWallet(), + network.GetNetworkID(), + ) + + poaValidator, err := poaValidatorManager.GetValidator(&bind.CallOpts{}, poaValidationID) + Expect(err).Should(BeNil()) + poaNodeID := poaValidator.NodeID + + /* + ****************** + * Migrate PoAValidatorManager to StakingManager + ****************** + */ + // Deploy ValidatorManager contract + validatorManagerAddress, _ := utils.DeployValidatorManager(ctx, ownerKey, l1AInfo, false) + opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) + Expect(err).Should(BeNil()) + + tx, err := validatorManagerProxy.ProxyAdmin.UpgradeAndCall( + opts, + validatorManagerProxy.Address, + validatorManagerAddress, + []byte{}, + ) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) + + // Migrate already registered validators to the new ValidatorManager version + validatorManager, err := validatormanager.NewValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) + + opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) + Expect(err).Should(BeNil()) + validatorManager.MigrateFromV1(opts, poaValidationID, 0) + + // Deploy StakingManager contract + stakingManagerAddress, _ := utils.DeployAndInitializeValidatorManagerSpecialization( + ctx, + ownerKey, + l1AInfo, + validatorManagerProxy.Address, + utils.NativeTokenStakingManager, + false, + ) + + utils.AddNativeMinterAdmin(ctx, l1AInfo, fundedKey, stakingManagerAddress) + + nativeStakingManager, err := nativetokenstakingmanager.NewNativeTokenStakingManager( + stakingManagerAddress, + l1AInfo.RPCClient, + ) + Expect(err).Should(BeNil()) + + // Transfer ownership from PoA -> the new staking manager + ownable, err := ownableupgradeable.NewOwnableUpgradeable(validatorManagerProxy.Address, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) + + opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) + Expect(err).Should(BeNil()) + tx, err = ownable.TransferOwnership(opts, stakingManagerAddress) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(context.Background(), l1AInfo, tx.Hash()) + + // Check that previous validator is still registered + validationID, err := validatorManager.RegisteredValidators(&bind.CallOpts{}, poaNodeID) + Expect(err).Should(BeNil()) + Expect(validationID[:]).Should(Equal(poaValidationID[:])) + + // Check the subnetID was migrated + subnetID, err := validatorManager.SubnetID(&bind.CallOpts{}) + Expect(err).Should(BeNil()) + Expect(subnetID[:]).Should(Equal(l1AInfo.SubnetID[:])) + + // + // Remove the PoA validator and re-register as a PoS validator + // + posStakingManager, err := istakingmanager.NewIStakingManager(stakingManagerAddress, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) + utils.InitiateAndCompleteEndPoSValidation( + ctx, + signatureAggregator, + ownerKey, + l1AInfo, + pChainInfo, + posStakingManager, + stakingManagerAddress, + validatorManagerProxy.Address, + poaValidationID, + expiry, + nodes[0], + 1, + false, + time.Time{}, + network.GetPChainWallet(), + network.GetNetworkID(), + ) + + expiry2 := uint64(time.Now().Add(24 * time.Hour).Unix()) + posValidationID := utils.InitiateAndCompleteNativeValidatorRegistration( + ctx, + signatureAggregator, + fundedKey, + l1AInfo, + pChainInfo, + nativeStakingManager, + stakingManagerAddress, + validatorManagerProxy.Address, + expiry2, + nodes[0], + network.GetPChainWallet(), + network.GetNetworkID(), + ) + validatorStartTime := time.Now() + + // Delist the PoS validator + utils.InitiateAndCompleteEndPoSValidation( + ctx, + signatureAggregator, + fundedKey, + l1AInfo, + pChainInfo, + posStakingManager, + stakingManagerAddress, + validatorManagerProxy.Address, + posValidationID, + expiry2, + nodes[0], + 1, + true, + validatorStartTime, + network.GetPChainWallet(), + network.GetNetworkID(), + ) +} + +func convertSubnetPoAV1( + n *localnetwork.LocalNetwork, + ctx context.Context, + l1 interfaces.L1TestInfo, + weights []uint64, + senderKey *ecdsa.PrivateKey, +) (proxy network.ProxyAddress, + nodes []utils.Node, + validationIDs []ids.ID, +) { + goLog.Println("Converting l1", l1.SubnetID) + cChainInfo := n.GetPrimaryNetworkInfo() + pClient := platformvm.NewClient(cChainInfo.NodeURIs[0]) + currentValidators, err := pClient.GetCurrentValidators(ctx, l1.SubnetID, nil) + Expect(err).Should(BeNil()) + + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) + Expect(err).Should(BeNil()) + + // Reset the global binary data for better test isolation + poavalidatormanager.PoAValidatorManagerBin = poavalidatormanager.PoAValidatorManagerMetaData.Bin + + vdrManagerAddress, tx, _, err := poavalidatormanager.DeployPoAValidatorManager( + opts, + l1.RPCClient, + 0, // ICMInitializable.Allowed + ) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, l1, tx.Hash()) + + var vdrManagerProxyAdmin *proxyadmin.ProxyAdmin + // Overwrite the manager address with the proxy address + vdrManagerAddress, vdrManagerProxyAdmin = utils.DeployTransparentUpgradeableProxy( + ctx, + l1, + senderKey, + vdrManagerAddress, + ) + + proxy = network.ProxyAddress{ + Address: vdrManagerAddress, + ProxyAdmin: vdrManagerProxyAdmin, + } + + poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(vdrManagerAddress, l1.RPCClient) + Expect(err).Should(BeNil()) + tx, err = poaValidatorManager.Initialize( + opts, + poavalidatormanager.ValidatorManagerSettings{ + L1ID: l1.SubnetID, + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(20), + }, + utils.PrivateKeyToAddress(senderKey), + ) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, l1, tx.Hash()) + + tmpnetNodes := n.GetExtraNodes(len(weights)) + sort.Slice(tmpnetNodes, func(i, j int) bool { + return string(tmpnetNodes[i].NodeID.Bytes()) < string(tmpnetNodes[j].NodeID.Bytes()) + }) + + // Construct the converted l1 info + destAddr, err := address.ParseToID(utils.DefaultPChainAddress) + Expect(err).Should(BeNil()) + vdrs := make([]*txs.ConvertSubnetToL1Validator, len(tmpnetNodes)) + for i, node := range tmpnetNodes { + signer, err := node.GetProofOfPossession() + Expect(err).Should(BeNil()) + nodes = append(nodes, utils.Node{ + NodeID: node.NodeID, + NodePoP: signer, + Weight: weights[i], + }) + vdrs[i] = &txs.ConvertSubnetToL1Validator{ + NodeID: node.NodeID.Bytes(), + Weight: weights[i], + Balance: units.Avax * 100, + Signer: *signer, + RemainingBalanceOwner: warpMessage.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + DeactivationOwner: warpMessage.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + } + } + pChainWallet := n.GetPChainWallet() + _, err = pChainWallet.IssueConvertSubnetToL1Tx( + l1.SubnetID, + l1.BlockchainID, + vdrManagerAddress[:], + vdrs, + ) + Expect(err).Should(BeNil()) + + l1 = n.AddSubnetValidators(tmpnetNodes, l1, true) + + utils.PChainProposerVMWorkaround(pChainWallet) + utils.AdvanceProposerVM(ctx, l1, senderKey, 5) + + aggregator := n.GetSignatureAggregator() + defer aggregator.Shutdown() + validationIDs = initializeValidatorSetV1( + ctx, + senderKey, + l1, + utils.GetPChainInfo(cChainInfo), + vdrManagerAddress, + n.GetNetworkID(), + aggregator, + nodes, + ) + + // Remove the bootstrap nodes as l1 validators + for _, vdr := range currentValidators { + _, err := pChainWallet.IssueRemoveSubnetValidatorTx(vdr.NodeID, l1.SubnetID) + Expect(err).Should(BeNil()) + for _, node := range n.Network.Nodes { + if node.NodeID == vdr.NodeID { + port := network.GetTmpnetNodePort(node) + node.Flags[config.HTTPPortKey] = port + goLog.Println("Restarting bootstrap node", node.NodeID) + n.Network.RestartNode(ctx, logging.NoLog{}, node) + } + } + } + utils.PChainProposerVMWorkaround(pChainWallet) + utils.AdvanceProposerVM(ctx, l1, senderKey, 5) + + return +} + +func initializeValidatorSetV1( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, + validatorManagerAddress common.Address, + networkID uint32, + signatureAggregator *utils.SignatureAggregator, + nodes []utils.Node, +) []ids.ID { + log.Println("Initializing validator set", "l1", l1Info.SubnetID) + initialValidators := make([]warpMessage.SubnetToL1ConversionValidatorData, len(nodes)) + initialValidatorsABI := make([]poavalidatormanager.InitialValidator, len(nodes)) + for i, node := range nodes { + initialValidators[i] = warpMessage.SubnetToL1ConversionValidatorData{ + NodeID: node.NodeID.Bytes(), + BLSPublicKey: node.NodePoP.PublicKey, + Weight: nodes[i].Weight, + } + initialValidatorsABI[i] = poavalidatormanager.InitialValidator{ + NodeID: node.NodeID.Bytes(), + BlsPublicKey: node.NodePoP.PublicKey[:], + Weight: nodes[i].Weight, + } + } + + l1ConversionData := warpMessage.SubnetToL1ConversionData{ + SubnetID: l1Info.SubnetID, + ManagerChainID: l1Info.BlockchainID, + ManagerAddress: validatorManagerAddress[:], + Validators: initialValidators, + } + l1ConversionDataABI := poavalidatormanager.ConversionData{ + L1ID: l1Info.SubnetID, + ValidatorManagerBlockchainID: l1Info.BlockchainID, + ValidatorManagerAddress: validatorManagerAddress, + InitialValidators: initialValidatorsABI, + } + l1ConversionID, err := warpMessage.SubnetToL1ConversionID(l1ConversionData) + Expect(err).Should(BeNil()) + l1ConversionSignedMessage := utils.ConstructL1ConversionMessage( + l1ConversionID, + l1Info, + pChainInfo, + networkID, + signatureAggregator, + ) + + // Deliver the Warp message to the L1 + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("initializeValidatorSet", l1ConversionDataABI, uint32(0)) + Expect(err).Should(BeNil()) + receipt := utils.CallWarpReceiver( + ctx, + callData, + senderKey, + l1Info, + validatorManagerAddress, + l1ConversionSignedMessage.Bytes(), + ) + + manager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerAddress, l1Info.RPCClient) + Expect(err).Should(BeNil()) + initialValidatorCreatedEvent, err := utils.GetEventFromLogs( + receipt.Logs, + manager.ParseInitialValidatorCreated, + ) + Expect(err).Should(BeNil()) + var validationIDs []ids.ID + for i := range nodes { + validationIDs = append(validationIDs, l1Info.SubnetID.Append(uint32(i))) + } + + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(nodes[0].Weight)) + + emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) + Expect(emittedValidationID).Should(Equal(validationIDs[0])) + + return validationIDs +} + +func initializeAndCompleteEndInitialPoAValidationV1( + ctx context.Context, + signatureAggregator *utils.SignatureAggregator, + ownerKey *ecdsa.PrivateKey, + fundedKey *ecdsa.PrivateKey, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, + validatorManager *poavalidatormanager.PoAValidatorManager, + validatorManagerAddress common.Address, + validationID ids.ID, + index uint32, + weight uint64, + pchainWallet pwallet.Wallet, + networkID uint32, +) { + log.Println("Initializing initial validator removal") + utils.WaitMinStakeDuration(ctx, l1Info, fundedKey) + opts, err := bind.NewKeyedTransactorWithChainID(ownerKey, l1Info.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := validatorManager.InitializeEndValidation( + opts, + validationID, + ) + Expect(err).Should(BeNil()) + receipt := utils.WaitForTransactionSuccess(ctx, l1Info, tx.Hash()) + + validatorRemovalEvent, err := utils.GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.Weight).Should(Equal(weight)) + + // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + unsignedMessage := utils.ExtractWarpMessageFromLog(ctx, receipt, l1Info) + signedWarpMessage, err := signatureAggregator.CreateSignedMessage( + unsignedMessage, + nil, + l1Info.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + + // Deliver the Warp message to the P-Chain + pchainWallet.IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) + utils.PChainProposerVMWorkaround(pchainWallet) + utils.AdvanceProposerVM(ctx, l1Info, fundedKey, 5) + + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing initial validator removal") + registrationSignedMessage := utils.ConstructL1ValidatorRegistrationMessageForInitialValidator( + validationID, + index, + false, + l1Info, + pChainInfo, + networkID, + signatureAggregator, + ) + + // Deliver the Warp message to the L1 + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeEndValidation", uint32(0)) + Expect(err).Should(BeNil()) + receipt = utils.CallWarpReceiver( + ctx, + callData, + ownerKey, + l1Info, + validatorManagerAddress, + registrationSignedMessage.Bytes(), + ) + + // Check that the validator is has been delisted from the staking contract + validationEndedEvent, err := utils.GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) +} + +func initializeAndCompletePoAValidatorRegistrationV1( + ctx context.Context, + signatureAggregator *utils.SignatureAggregator, + ownerKey *ecdsa.PrivateKey, + fundedKey *ecdsa.PrivateKey, + l1Info interfaces.L1TestInfo, + pChainInfo interfaces.L1TestInfo, + validatorManager *poavalidatormanager.PoAValidatorManager, + validatorManagerAddress common.Address, + expiry uint64, + node utils.Node, + pchainWallet pwallet.Wallet, + networkID uint32, +) ids.ID { + // Initiate validator registration + // receipt, validationID := InitializePoAValidatorRegistration( + // ctx, + // ownerKey, + // l1Info, + // node, + // expiry, + // validatorManager, + // ) + + opts, err := bind.NewKeyedTransactorWithChainID(ownerKey, l1Info.EVMChainID) + Expect(err).Should(BeNil()) + + tx, err := validatorManager.InitializeValidatorRegistration( + opts, + poavalidatormanager.ValidatorRegistrationInput{ + NodeID: node.NodeID[:], + RegistrationExpiry: expiry, + BlsPublicKey: node.NodePoP.PublicKey[:], + }, + node.Weight, + ) + Expect(err).Should(BeNil()) + receipt := utils.WaitForTransactionSuccess(ctx, l1Info, tx.Hash()) + registrationInitiatedEvent, err := utils.GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodCreated, + ) + Expect(err).Should(BeNil()) + validationID := ids.ID(registrationInitiatedEvent.ValidationID) + + // Gather subnet-evm Warp signatures for the RegisterL1ValidatorMessage & relay to the P-Chain + signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) + + _, err = pchainWallet.IssueRegisterL1ValidatorTx( + 100*units.Avax, + node.NodePoP.ProofOfPossession, + signedWarpMessage.Bytes(), + ) + Expect(err).Should(BeNil()) + utils.PChainProposerVMWorkaround(pchainWallet) + utils.AdvanceProposerVM(ctx, l1Info, fundedKey, 5) + + // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing validator registration") + registrationSignedMessage := utils.ConstructL1ValidatorRegistrationMessage( + validationID, + expiry, + node, + true, + l1Info, + pChainInfo, + networkID, + signatureAggregator, + ) + + // Deliver the Warp message to the L1 + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) + Expect(err).Should(BeNil()) + receipt = utils.CallWarpReceiver( + ctx, + callData, + ownerKey, + l1Info, + validatorManagerAddress, + registrationSignedMessage.Bytes(), + ) + + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + + return validationID +} diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index dc8139bef..c3dbea607 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -9,7 +9,6 @@ import ( "github.com/ava-labs/avalanchego/utils/units" ownableupgradeable "github.com/ava-labs/icm-contracts/abi-bindings/go/OwnableUpgradeable" nativetokenstakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/NativeTokenStakingManager" - poavalidatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/PoAValidatorManagerV1" validatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ValidatorManager" istakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/interfaces/IStakingManager" localnetwork "github.com/ava-labs/icm-contracts/tests/network" @@ -62,15 +61,17 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { fundAmount, ) - // Deploy PoAValidatorManager - nodes, initialValidationIDs := network.ConvertSubnetPoAV1( + // Deploy ValidatorManager as PoA + nodes, initialValidationIDs := network.ConvertSubnet( ctx, l1AInfo, + utils.PoAValidatorManager, []uint64{units.Schmeckle, 1000 * units.Schmeckle}, // Choose weights to avoid validator churn limits ownerKey, + true, ) validatorManagerProxy, _ := network.GetValidatorManager(l1AInfo.SubnetID) - poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) + validatorManager, err := validatormanager.NewValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) Expect(err).Should(BeNil()) signatureAggregator := utils.NewSignatureAggregator( @@ -84,14 +85,13 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { // // Delist one initial validator // - utils.InitializeAndCompleteEndInitialPoAValidationV1( + utils.InitiateAndCompleteEndInitialPoAValidation( ctx, signatureAggregator, ownerKey, - fundedKey, l1AInfo, pChainInfo, - poaValidatorManager, + validatorManager, validatorManagerProxy.Address, initialValidationIDs[0], 0, @@ -104,15 +104,13 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) - _, err = poaValidatorManager.InitializeValidatorRegistration( + _, err = validatorManager.InitiateValidatorRegistration( opts, - poavalidatormanager.ValidatorRegistrationInput{ - NodeID: nodes[0].NodeID[:], - BlsPublicKey: nodes[0].NodePoP.PublicKey[:], - RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), - RemainingBalanceOwner: poavalidatormanager.PChainOwner{}, - DisableOwner: poavalidatormanager.PChainOwner{}, - }, + nodes[0].NodeID[:], + nodes[0].NodePoP.PublicKey[:], + uint64(time.Now().Add(24*time.Hour).Unix()), + validatormanager.PChainOwner{}, + validatormanager.PChainOwner{}, nodes[0].Weight, ) Expect(err).ShouldNot(BeNil()) @@ -121,14 +119,13 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { // Re-register the validator as a SoV validator // expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) - poaValidationID := utils.InitializeAndCompletePoAValidatorRegistrationV1( + poaValidationID := utils.InitiateAndCompletePoAValidatorRegistration( ctx, signatureAggregator, ownerKey, - fundedKey, l1AInfo, pChainInfo, - poaValidatorManager, + validatorManager, validatorManagerProxy.Address, expiry, nodes[0], @@ -136,7 +133,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { network.GetNetworkID(), ) - poaValidator, err := poaValidatorManager.GetValidator(&bind.CallOpts{}, poaValidationID) + poaValidator, err := validatorManager.GetValidator(&bind.CallOpts{}, poaValidationID) Expect(err).Should(BeNil()) poaNodeID := poaValidator.NodeID @@ -145,22 +142,6 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { * Migrate PoAValidatorManager to StakingManager ****************** */ - // Deploy ValidatorManager contract - validatorManagerAddress, _ := utils.DeployValidatorManager(ctx, ownerKey, l1AInfo, false) - opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) - Expect(err).Should(BeNil()) - - tx, err := validatorManagerProxy.ProxyAdmin.UpgradeAndCall(opts, validatorManagerProxy.Address, validatorManagerAddress, []byte{}) - Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) - - // Migrate already registered validators to the new ValidatorManager version - validatorManager, err := validatormanager.NewValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) - Expect(err).Should(BeNil()) - - opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) - Expect(err).Should(BeNil()) - validatorManager.MigrateFromV1PoA(opts, poaValidationID) // Deploy StakingManager contract stakingManagerAddress, _ := utils.DeployAndInitializeValidatorManagerSpecialization( @@ -186,7 +167,7 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err = ownable.TransferOwnership(opts, stakingManagerAddress) + tx, err := ownable.TransferOwnership(opts, stakingManagerAddress) Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(context.Background(), l1AInfo, tx.Hash()) @@ -195,11 +176,6 @@ func PoAMigrationToPoS(network *localnetwork.LocalNetwork) { Expect(err).Should(BeNil()) Expect(validationID[:]).Should(Equal(poaValidationID[:])) - // Check the subnetID was migrated - subnetID, err := validatorManager.SubnetID(&bind.CallOpts{}) - Expect(err).Should(BeNil()) - Expect(subnetID[:]).Should(Equal(l1AInfo.SubnetID[:])) - // // Remove the PoA validator and re-register as a PoS validator // diff --git a/tests/network/network.go b/tests/network/network.go index ba909de03..4aeaf70bc 100644 --- a/tests/network/network.go +++ b/tests/network/network.go @@ -29,7 +29,6 @@ import ( "github.com/ava-labs/avalanchego/wallet/subnet/primary" ownableupgradeable "github.com/ava-labs/icm-contracts/abi-bindings/go/OwnableUpgradeable" proxyadmin "github.com/ava-labs/icm-contracts/abi-bindings/go/ProxyAdmin" - poavalidatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/PoAValidatorManagerV1" validatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ValidatorManager" "github.com/ava-labs/icm-contracts/tests/interfaces" "github.com/ava-labs/icm-contracts/tests/utils" @@ -189,139 +188,6 @@ func NewLocalNetwork( return localNetwork } -func (n *LocalNetwork) ConvertSubnetPoAV1( - ctx context.Context, - l1 interfaces.L1TestInfo, - weights []uint64, - senderKey *ecdsa.PrivateKey, -) ([]utils.Node, []ids.ID) { - goLog.Println("Converting l1", l1.SubnetID) - cChainInfo := n.GetPrimaryNetworkInfo() - pClient := platformvm.NewClient(cChainInfo.NodeURIs[0]) - currentValidators, err := pClient.GetCurrentValidators(ctx, l1.SubnetID, nil) - Expect(err).Should(BeNil()) - - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, l1.EVMChainID) - Expect(err).Should(BeNil()) - - // Reset the global binary data for better test isolation - poavalidatormanager.PoAValidatorManagerBin = poavalidatormanager.PoAValidatorManagerMetaData.Bin - - vdrManagerAddress, tx, _, err := poavalidatormanager.DeployPoAValidatorManager( - opts, - l1.RPCClient, - 0, // ICMInitializable.Allowed - ) - Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(ctx, l1, tx.Hash()) - - var vdrManagerProxyAdmin *proxyadmin.ProxyAdmin - // Overwrite the manager address with the proxy address - vdrManagerAddress, vdrManagerProxyAdmin = utils.DeployTransparentUpgradeableProxy( - ctx, - l1, - senderKey, - vdrManagerAddress, - ) - - n.validatorManagers[l1.SubnetID] = ProxyAddress{ - Address: vdrManagerAddress, - ProxyAdmin: vdrManagerProxyAdmin, - } - - poaValidatorManager, err := poavalidatormanager.NewPoAValidatorManager(vdrManagerAddress, l1.RPCClient) - Expect(err).Should(BeNil()) - tx, err = poaValidatorManager.Initialize( - opts, - poavalidatormanager.ValidatorManagerSettings{ - L1ID: l1.SubnetID, - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(20), - }, - utils.PrivateKeyToAddress(senderKey), - ) - Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(ctx, l1, tx.Hash()) - - tmpnetNodes := n.GetExtraNodes(len(weights)) - sort.Slice(tmpnetNodes, func(i, j int) bool { - return string(tmpnetNodes[i].NodeID.Bytes()) < string(tmpnetNodes[j].NodeID.Bytes()) - }) - - var nodes []utils.Node - // Construct the converted l1 info - destAddr, err := address.ParseToID(utils.DefaultPChainAddress) - Expect(err).Should(BeNil()) - vdrs := make([]*txs.ConvertSubnetToL1Validator, len(tmpnetNodes)) - for i, node := range tmpnetNodes { - signer, err := node.GetProofOfPossession() - Expect(err).Should(BeNil()) - nodes = append(nodes, utils.Node{ - NodeID: node.NodeID, - NodePoP: signer, - Weight: weights[i], - }) - vdrs[i] = &txs.ConvertSubnetToL1Validator{ - NodeID: node.NodeID.Bytes(), - Weight: weights[i], - Balance: units.Avax * 100, - Signer: *signer, - RemainingBalanceOwner: warpMessage.PChainOwner{ - Threshold: 1, - Addresses: []ids.ShortID{destAddr}, - }, - DeactivationOwner: warpMessage.PChainOwner{ - Threshold: 1, - Addresses: []ids.ShortID{destAddr}, - }, - } - } - pChainWallet := n.GetPChainWallet() - _, err = pChainWallet.IssueConvertSubnetToL1Tx( - l1.SubnetID, - l1.BlockchainID, - vdrManagerAddress[:], - vdrs, - ) - Expect(err).Should(BeNil()) - - l1 = n.AddSubnetValidators(tmpnetNodes, l1, true) - - utils.PChainProposerVMWorkaround(pChainWallet) - utils.AdvanceProposerVM(ctx, l1, senderKey, 5) - - aggregator := n.GetSignatureAggregator() - defer aggregator.Shutdown() - validationIDs := utils.InitializeValidatorSetV1( - ctx, - senderKey, - l1, - utils.GetPChainInfo(cChainInfo), - vdrManagerAddress, - n.GetNetworkID(), - aggregator, - nodes, - ) - - // Remove the bootstrap nodes as l1 validators - for _, vdr := range currentValidators { - _, err := pChainWallet.IssueRemoveSubnetValidatorTx(vdr.NodeID, l1.SubnetID) - Expect(err).Should(BeNil()) - for _, node := range n.Network.Nodes { - if node.NodeID == vdr.NodeID { - port := getTmpnetNodePort(node) - node.Flags[config.HTTPPortKey] = port - goLog.Println("Restarting bootstrap node", node.NodeID) - n.Network.RestartNode(ctx, n.logger, node) - } - } - } - utils.PChainProposerVMWorkaround(pChainWallet) - utils.AdvanceProposerVM(ctx, l1, senderKey, 5) - - return nodes, validationIDs -} - func (n *LocalNetwork) ConvertSubnet( ctx context.Context, l1 interfaces.L1TestInfo, @@ -453,7 +319,7 @@ func (n *LocalNetwork) ConvertSubnet( Expect(err).Should(BeNil()) for _, node := range n.Network.Nodes { if node.NodeID == vdr.NodeID { - port := getTmpnetNodePort(node) + port := GetTmpnetNodePort(node) node.Flags[config.HTTPPortKey] = port goLog.Println("Restarting bootstrap node", node.NodeID) n.Network.RestartNode(ctx, n.logger, node) @@ -690,7 +556,7 @@ func (n *LocalNetwork) SetChainConfigs(chainConfigs map[string]string) { // unusable // TODO: remove once tmpnet supports static port option across restarts for _, tmpnetNode := range n.Network.Nodes { - port := getTmpnetNodePort(tmpnetNode) + port := GetTmpnetNodePort(tmpnetNode) tmpnetNode.Flags[config.HTTPPortKey] = port } @@ -738,7 +604,7 @@ func (n *LocalNetwork) GetTwoL1s() ( } // TODO: once tmpnet supports static port option across restarts, remove this function -func getTmpnetNodePort(node *tmpnet.Node) string { +func GetTmpnetNodePort(node *tmpnet.Node) string { hostPort := strings.TrimPrefix(node.URI, "http://") Expect(hostPort).ShouldNot(BeEmpty()) _, port, err := net.SplitHostPort(hostPort) diff --git a/tests/suites/validator-manager/validator_manager_suite_test.go b/tests/suites/validator-manager/validator_manager_suite_test.go index 1090cfe53..d9719b068 100644 --- a/tests/suites/validator-manager/validator_manager_suite_test.go +++ b/tests/suites/validator-manager/validator_manager_suite_test.go @@ -67,19 +67,24 @@ var _ = ginkgo.AfterEach(func() { var _ = ginkgo.Describe("[Validator manager integration tests]", func() { // Validator Manager tests - // ginkgo.It("Native token staking manager", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManagerFlows.NativeTokenStakingManager(LocalNetworkInstance) - // }) - // ginkgo.It("ERC20 token staking manager", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManagerFlows.ERC20TokenStakingManager(LocalNetworkInstance) - // }) + ginkgo.It("Native token staking manager", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.NativeTokenStakingManager(LocalNetworkInstance) + }) + ginkgo.It("ERC20 token staking manager", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.ERC20TokenStakingManager(LocalNetworkInstance) + }) ginkgo.It("PoA migration to PoS", ginkgo.Label(validatorManagerLabel), func() { validatorManagerFlows.PoAMigrationToPoS(LocalNetworkInstance) }) + ginkgo.It("Migrate from V1 PoA to V2", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.MigrateFromV1PoA(LocalNetworkInstance) + }) }) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 0b6328936..6a7d1a2f1 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -25,7 +25,6 @@ import ( erc20tokenstakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ERC20TokenStakingManager" examplerewardcalculator "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ExampleRewardCalculator" nativetokenstakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/NativeTokenStakingManager" - poavalidatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/PoAValidatorManagerV1" validatormanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/ValidatorManager" istakingmanager "github.com/ava-labs/icm-contracts/abi-bindings/go/validator-manager/interfaces/IStakingManager" "github.com/ava-labs/icm-contracts/tests/interfaces" @@ -267,88 +266,6 @@ func DeployExampleRewardCalculator( // Validator Set Initialization utils // -func InitializeValidatorSetV1( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - l1Info interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, - validatorManagerAddress common.Address, - networkID uint32, - signatureAggregator *SignatureAggregator, - nodes []Node, -) []ids.ID { - log.Println("Initializing validator set", "l1", l1Info.SubnetID) - initialValidators := make([]warpMessage.SubnetToL1ConversionValidatorData, len(nodes)) - initialValidatorsABI := make([]poavalidatormanager.InitialValidator, len(nodes)) - for i, node := range nodes { - initialValidators[i] = warpMessage.SubnetToL1ConversionValidatorData{ - NodeID: node.NodeID.Bytes(), - BLSPublicKey: node.NodePoP.PublicKey, - Weight: nodes[i].Weight, - } - initialValidatorsABI[i] = poavalidatormanager.InitialValidator{ - NodeID: node.NodeID.Bytes(), - BlsPublicKey: node.NodePoP.PublicKey[:], - Weight: nodes[i].Weight, - } - } - - l1ConversionData := warpMessage.SubnetToL1ConversionData{ - SubnetID: l1Info.SubnetID, - ManagerChainID: l1Info.BlockchainID, - ManagerAddress: validatorManagerAddress[:], - Validators: initialValidators, - } - l1ConversionDataABI := poavalidatormanager.ConversionData{ - L1ID: l1Info.SubnetID, - ValidatorManagerBlockchainID: l1Info.BlockchainID, - ValidatorManagerAddress: validatorManagerAddress, - InitialValidators: initialValidatorsABI, - } - l1ConversionID, err := warpMessage.SubnetToL1ConversionID(l1ConversionData) - Expect(err).Should(BeNil()) - l1ConversionSignedMessage := ConstructL1ConversionMessage( - l1ConversionID, - l1Info, - pChainInfo, - networkID, - signatureAggregator, - ) - - // Deliver the Warp message to the L1 - abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("initializeValidatorSet", l1ConversionDataABI, uint32(0)) - Expect(err).Should(BeNil()) - receipt := CallWarpReceiver( - ctx, - callData, - senderKey, - l1Info, - validatorManagerAddress, - l1ConversionSignedMessage.Bytes(), - ) - - manager, err := poavalidatormanager.NewPoAValidatorManager(validatorManagerAddress, l1Info.RPCClient) - Expect(err).Should(BeNil()) - initialValidatorCreatedEvent, err := GetEventFromLogs( - receipt.Logs, - manager.ParseInitialValidatorCreated, - ) - Expect(err).Should(BeNil()) - var validationIDs []ids.ID - for i := range nodes { - validationIDs = append(validationIDs, l1Info.SubnetID.Append(uint32(i))) - } - - Expect(initialValidatorCreatedEvent.Weight).Should(Equal(nodes[0].Weight)) - - emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) - Expect(emittedValidationID).Should(Equal(validationIDs[0])) - - return validationIDs -} - func InitializeValidatorSet( ctx context.Context, senderKey *ecdsa.PrivateKey, @@ -782,186 +699,6 @@ func InitiateAndCompleteERC20ValidatorRegistration( return validationID } -func InitializeAndCompleteEndInitialPoAValidationV1( - ctx context.Context, - signatureAggregator *SignatureAggregator, - ownerKey *ecdsa.PrivateKey, - fundedKey *ecdsa.PrivateKey, - l1Info interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, - validatorManager *poavalidatormanager.PoAValidatorManager, - validatorManagerAddress common.Address, - validationID ids.ID, - index uint32, - weight uint64, - pchainWallet pwallet.Wallet, - networkID uint32, -) { - log.Println("Initializing initial validator removal") - WaitMinStakeDuration(ctx, l1Info, fundedKey) - opts, err := bind.NewKeyedTransactorWithChainID(ownerKey, l1Info.EVMChainID) - Expect(err).Should(BeNil()) - tx, err := validatorManager.InitializeEndValidation( - opts, - validationID, - ) - Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, l1Info, tx.Hash()) - - validatorRemovalEvent, err := GetEventFromLogs( - receipt.Logs, - validatorManager.ParseValidatorRemovalInitialized, - ) - Expect(err).Should(BeNil()) - Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight).Should(Equal(weight)) - - // Gather subnet-evm Warp signatures for the SetL1ValidatorWeightMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, l1Info) - signedWarpMessage, err := signatureAggregator.CreateSignedMessage( - unsignedMessage, - nil, - l1Info.SubnetID, - 67, - ) - Expect(err).Should(BeNil()) - - // Deliver the Warp message to the P-Chain - pchainWallet.IssueSetL1ValidatorWeightTx(signedWarpMessage.Bytes()) - PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - - // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain - log.Println("Completing initial validator removal") - registrationSignedMessage := ConstructL1ValidatorRegistrationMessageForInitialValidator( - validationID, - index, - false, - l1Info, - pChainInfo, - networkID, - signatureAggregator, - ) - - // Deliver the Warp message to the L1 - abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndValidation", uint32(0)) - Expect(err).Should(BeNil()) - receipt = CallWarpReceiver( - ctx, - callData, - ownerKey, - l1Info, - validatorManagerAddress, - registrationSignedMessage.Bytes(), - ) - - // Check that the validator is has been delisted from the staking contract - validationEndedEvent, err := GetEventFromLogs( - receipt.Logs, - validatorManager.ParseValidationPeriodEnded, - ) - Expect(err).Should(BeNil()) - Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) -} - -func InitializeAndCompletePoAValidatorRegistrationV1( - ctx context.Context, - signatureAggregator *SignatureAggregator, - ownerKey *ecdsa.PrivateKey, - fundedKey *ecdsa.PrivateKey, - l1Info interfaces.L1TestInfo, - pChainInfo interfaces.L1TestInfo, - validatorManager *poavalidatormanager.PoAValidatorManager, - validatorManagerAddress common.Address, - expiry uint64, - node Node, - pchainWallet pwallet.Wallet, - networkID uint32, -) ids.ID { - // Initiate validator registration - // receipt, validationID := InitializePoAValidatorRegistration( - // ctx, - // ownerKey, - // l1Info, - // node, - // expiry, - // validatorManager, - // ) - - opts, err := bind.NewKeyedTransactorWithChainID(ownerKey, l1Info.EVMChainID) - Expect(err).Should(BeNil()) - - tx, err := validatorManager.InitializeValidatorRegistration( - opts, - poavalidatormanager.ValidatorRegistrationInput{ - NodeID: node.NodeID[:], - RegistrationExpiry: expiry, - BlsPublicKey: node.NodePoP.PublicKey[:], - }, - node.Weight, - ) - Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(ctx, l1Info, tx.Hash()) - registrationInitiatedEvent, err := GetEventFromLogs( - receipt.Logs, - validatorManager.ParseValidationPeriodCreated, - ) - Expect(err).Should(BeNil()) - validationID := ids.ID(registrationInitiatedEvent.ValidationID) - - // Gather subnet-evm Warp signatures for the RegisterL1ValidatorMessage & relay to the P-Chain - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, l1Info, pChainInfo, nil, signatureAggregator) - - _, err = pchainWallet.IssueRegisterL1ValidatorTx( - 100*units.Avax, - node.NodePoP.ProofOfPossession, - signedWarpMessage.Bytes(), - ) - Expect(err).Should(BeNil()) - PChainProposerVMWorkaround(pchainWallet) - AdvanceProposerVM(ctx, l1Info, fundedKey, 5) - - // Construct a L1ValidatorRegistrationMessage Warp message from the P-Chain - log.Println("Completing validator registration") - registrationSignedMessage := ConstructL1ValidatorRegistrationMessage( - validationID, - expiry, - node, - true, - l1Info, - pChainInfo, - networkID, - signatureAggregator, - ) - - // Deliver the Warp message to the L1 - abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) - Expect(err).Should(BeNil()) - receipt = CallWarpReceiver( - ctx, - callData, - ownerKey, - l1Info, - validatorManagerAddress, - registrationSignedMessage.Bytes(), - ) - - // Check that the validator is registered in the staking contract - registrationEvent, err := GetEventFromLogs( - receipt.Logs, - validatorManager.ParseValidationPeriodRegistered, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - - return validationID -} - func InitiateAndCompletePoAValidatorRegistration( ctx context.Context, signatureAggregator *SignatureAggregator, From 28c7427cfd124880fc3baccb716d8f328e47c1f5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 7 Mar 2025 12:16:45 -0500 Subject: [PATCH 4/5] update bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6da7f2a60..9808cb42d 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -77,7 +77,7 @@ type ValidatorMessagesValidationPeriod struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedValidationID\",\"type\":\"bytes32\"}],\"name\":\"UnexpectedValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"CompletedDelegatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"CompletedDelegatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"InitiatedDelegatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InitiatedDelegatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRemoval\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"erc20\",\"outputs\":[{\"internalType\":\"contractIERC20Mintable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractValidatorManager\",\"name\":\"manager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structStakingManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"},{\"internalType\":\"contractIERC20Mintable\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"delegationAmount\",\"type\":\"uint256\"}],\"name\":\"initiateDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"initiateValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613da6380380613da683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b613c598061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c8063785e9e86116100fe578063a9778a7a1161009e578063b771b3bc1161006e578063b771b3bc14610413578063cc71bbba14610421578063e4a63c4014610434578063fb8b11dd14610448575f80fd5b8063a9778a7a146102b4578063aac80c39146103da578063b2c1712e146103ed578063b5c9349814610400575f80fd5b80638ef34c98116100d95780638ef34c981461038e57806393e24598146103a15780639681d940146103b4578063a3a65e48146103c7575f80fd5b8063785e9e86146103235780637a63ad85146103545780638af5499e1461037b575f80fd5b80632aa566381161017457806360ad77841161014457806360ad7784146102e357806362065856146102f6578063732214f814610309578063739b4eff14610310575f80fd5b80632aa56638146102765780632e2194d81461028957806335455ded146102b45780634b396bcc146102d0575f80fd5b80631af1872b116101af5780631af1872b1461021c578063245dafcb1461023d57806325e1c7761461025057806327bf60cd14610263575f80fd5b806313409645146101d5578063151d30d1146101ea5780631667956414610209575b5f80fd5b6101e86101e33660046131ec565b61045b565b005b6101f2600a81565b60405160ff90911681526020015b60405180910390f35b6101e8610217366004613223565b61079b565b61022f61022a366004613472565b6107ad565b604051908152602001610200565b6101e861024b366004613551565b6107ea565b6101e861025e3660046131ec565b610aae565b6101e8610271366004613223565b610b8c565b6101e8610284366004613223565b610b98565b61029c610297366004613551565b610ba9565b6040516001600160401b039091168152602001610200565b6102bd61271081565b60405161ffff9091168152602001610200565b6101e86102de366004613568565b610bfd565b6101e86102f13660046131ec565b610c09565b61022f6103043660046135b6565b610f2b565b61022f5f81565b61022f61031e3660046135d1565b610f4b565b5f80516020613be4833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610200565b61022f7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60081565b6101e8610389366004613568565b610f77565b6101e861039c3660046135f1565b610f83565b6101e86103af366004613551565b611034565b61022f6103c236600461361f565b61112d565b61022f6103d536600461361f565b6112dd565b6101e86103e8366004613568565b611355565b6101e86103fb366004613223565b611361565b6101e861040e366004613638565b61136d565b61033c6005600160991b0181565b6101e861042f366004613568565b611451565b61022f5f80516020613be483398151915281565b6101e86104563660046135f1565b61145d565b6104636114f4565b5f61046c61152b565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156104a5576104a561366b565b60038111156104b6576104b661366b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561052f5761052f61366b565b14610559578051604051633b0d540d60e21b8152610550919060040161367f565b60405180910390fd5b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa1580156105a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105cb9190810190613716565b9050600483546040808501519051636af907fb60e11b81526001600160a01b039092169163d5f20ff6916106059160040190815260200190565b5f60405180830381865afa15801561061f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106469190810190613716565b5160058111156106585761065861366b565b1415801561067f57508160c001516001600160401b031681608001516001600160401b0316105b1561077557825460405163338587c560e21b815263ffffffff861660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af11580156106d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f791906137f5565b91509150818460400151146107305781846040015160405163fee3144560e01b8152600401610550929190918252602082015260400190565b806001600160401b03168460c001516001600160401b0316111561077257604051632e19bc2d60e11b81526001600160401b0382166004820152602401610550565b50505b61077e8561154f565b50505061079760015f80516020613c0483398151915255565b5050565b6107a78383835f611793565b50505050565b5f6107b66114f4565b6107c68989898989898989611a8c565b90506107de60015f80516020613c0483398151915255565b98975050505050505050565b5f6107f361152b565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff16600381111561082c5761082c61366b565b600381111561083d5761083d61366b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156108b6576108b661366b565b141580156108d757506003815160038111156108d4576108d461366b565b14155b156108f8578051604051633b0d540d60e21b8152610550919060040161367f565b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610943573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261096a9190810190613716565b905080606001516001600160401b03165f0361099c576040516339b894f960e21b815260048101859052602401610550565b604080830151606083015160a0840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93610a0a93906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015610a24573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a4b9190810190613818565b6040518263ffffffff1660e01b8152600401610a679190613874565b6020604051808303815f875af1158015610a83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa79190613886565b5050505050565b610ab782611c94565b610ad7576040516330efa98b60e01b815260048101839052602401610550565b5f610ae061152b565b54604051636af907fb60e11b8152600481018590526001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015610b24573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b4b9190810190613716565b5190506002816005811115610b6257610b6261366b565b14610b82578060405163170cc93360e21b8152600401610550919061389d565b6107a78383611cbd565b6107a78383835f611f63565b610ba48383835f612369565b505050565b5f80610bb361152b565b60040154610bc190846138c5565b9050801580610bd657506001600160401b0381115b15610bf75760405163222d164360e21b815260048101849052602401610550565b92915050565b610aa784848484611793565b5f610c1261152b565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115610c4b57610c4b61366b565b6003811115610c5c57610c5c61366b565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015610d0d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d349190810190613716565b9050600183516003811115610d4b57610d4b61366b565b14610d6c578251604051633b0d540d60e21b8152610550919060040161367f565b600481516005811115610d8157610d8161366b565b03610d9757610d8f8661154f565b505050505050565b8260a001516001600160401b031681608001516001600160401b03161015610e9f57835460405163338587c560e21b815263ffffffff871660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af1158015610e08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2c91906137f5565b91509150818414610e5a5760405163fee3144560e01b81526004810183905260248101859052604401610550565b8460a001516001600160401b0316816001600160401b03161015610e9c57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610550565b50505b5f868152600885016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252839188917f3886b7389bccb22cac62838dee3f400cf8b22289295283e01a2c7093f93dd5aa910160405180910390a3505050505050565b5f610f3461152b565b60040154610bf7906001600160401b0384166138e4565b5f610f546114f4565b610f5f833384612395565b9050610bf760015f80516020613c0483398151915255565b6107a784848484612369565b5f610f8c61152b565b90506001600160a01b038216610fc05760405163caa903f960e01b81526001600160a01b0383166004820152602401610550565b5f8381526007820160205260409020546001600160a01b0316331461100657335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610550565b5f928352600c01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f61103d61152b565b8054604051636af907fb60e11b8152600481018590529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015611087573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110ae9190810190613716565b51905060048160058111156110c5576110c561366b565b146110e5578060405163170cc93360e21b8152600401610550919061389d565b5f8381526007830160205260409020546001600160a01b0316331461110a5733610fe1565b5f838152600783016020526040902054610ba4906001600160a01b0316846126b0565b5f6111366114f4565b5f61113f61152b565b805460405163025a076560e61b815263ffffffff861660048201529192505f916001600160a01b0390911690639681d940906024016020604051808303815f875af1158015611190573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b49190613886565b8254604051636af907fb60e11b8152600481018390529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156111fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112259190810190613716565b905061123082611c94565b61123e575091506112c29050565b5f828152600784016020908152604080832054600c870190925290912080546001600160a01b031981169091556001600160a01b039182169116806112805750805b6004835160058111156112955761129561366b565b036112a4576112a481856126b0565b6112ba826112b58560400151610f2b565b6126da565b509193505050505b6112d860015f80516020613c0483398151915255565b919050565b5f6112e661152b565b54604051631474cbc960e31b815263ffffffff841660048201526001600160a01b039091169063a3a65e48906024016020604051808303815f875af1158015611331573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf79190613886565b610aa784848484611f63565b610ba48383835f6126fd565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806113b6575080546001600160401b03808416911610155b156113d45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113ff8484612729565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6107a7848484846126fd565b6001600160a01b03811661148f5760405163caa903f960e01b81526001600160a01b0382166004820152602401610550565b5f61149861152b565b5f8481526008820160205260409020549091506001600160a01b036101009091041633146114c65733610fe1565b5f928352600a01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f80516020613c0483398151915280546001190161152557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60090565b5f61155861152b565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156115915761159161366b565b60038111156115a2576115a261366b565b815281546001600160a01b03610100909104811660208084019190915260018401546040808501919091526002909401546001600160401b038082166060860152600160401b820481166080860152600160801b8204811660a0860152600160c01b9091041660c09093019290925283830151865484516304e0efb360e11b8152945195965090949116926309c1df669260048083019391928290030181865afa158015611652573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061167691906138fb565b82608001516116859190613916565b6001600160401b03164210156116b95760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b5f848152600884016020908152604080832080546001600160a81b031916815560018101849055600201839055600a8601909152902080546001600160a01b031981169091556001600160a01b031680611714575060208201515b5f80611721838886612743565b9150915061173a85602001516112b58760600151610f2b565b6040805183815260208101839052859189917f5ecc5b26a9265302cf871229b3d983e5ca57dbb1448966c6c58b2d3c68bc7f7e910160405180910390a350505050505050565b60015f80516020613c0483398151915255565b5f8061179d61152b565b8054604051635b73516560e11b8152600481018990529192506001600160a01b03169063b6e6a2ca906024015f604051808303815f87803b1580156117e0575f80fd5b505af11580156117f2573d5f803e3d5ffd5b50508254604051636af907fb60e11b8152600481018a90525f93506001600160a01b03909116915063d5f20ff6906024015f60405180830381865afa15801561183d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118649190810190613716565b905061186f87611c94565b61187e57600192505050611a84565b5f8781526007830160205260409020546001600160a01b031633146118a35733610fe1565b5f87815260078301602052604090205460c08201516118d291600160b01b90046001600160401b031690613916565b6001600160401b03168160e001516001600160401b031610156119195760e081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610550565b5f86156119315761192a8887611cbd565b905061194f565b505f8781526007830160205260409020600101546001600160401b03165b600583015460408301515f916001600160a01b031690634f22429f9061197490610f2b565b60c086015160e0808801516040519185901b6001600160e01b031916825260048201939093526001600160401b0391821660248201819052604482015291811660648301528516608482015260a401602060405180830381865afa1580156119de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a029190613886565b90506001600160a01b038616611a2e575f8981526007850160205260409020546001600160a01b031695505b5f898152600b8501602052604081208054839290611a4d90849061393d565b90915550505f898152600c94909401602052604090932080546001600160a01b0319166001600160a01b0387161790555050151590505b949350505050565b5f80611a9661152b565b600381015490915061ffff600160401b90910481169086161080611abf575061271061ffff8616115b15611ae357604051635f12e6c360e11b815261ffff86166004820152602401610550565b60038101546001600160401b039081169085161015611b1f576040516202a06d60e11b81526001600160401b0385166004820152602401610550565b8060010154831080611b345750806002015483115b15611b555760405163222d164360e21b815260048101849052602401610550565b5f611b5f846127f0565b90505f611b6b82610ba9565b90505f835f015f9054906101000a90046001600160a01b03166001600160a01b031663ed285ae18e8e8e8e8e886040518763ffffffff1660e01b8152600401611bb9969594939291906139b6565b6020604051808303815f875af1158015611bd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf99190613886565b5f818152600786016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600c9096019095529790932080546001600160a01b03191690961790955550939998505050505050505050565b5f80611c9e61152b565b5f938452600701602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d08573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d2f9190810190613a29565b9150915080611d5157604051636b2f19e960e01b815260040160405180910390fd5b5f611d5a61152b565b6006810154845191925014611d88578251604051636ba589a560e01b81526004810191909152602401610550565b60208301516001600160a01b031615611dc4576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610550565b60208301516001600160a01b031615611e00576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610550565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b8152600401611e3d9190613874565b6040805180830381865af4158015611e57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7b91906137f5565b91509150818814611ea95760405163fee3144560e01b81526004810183905260248101899052604401610550565b5f8881526007840160205260409020600101546001600160401b039081169082161115611f3a575f888152600784016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611f58565b505f8781526007830160205260409020600101546001600160401b03165b979650505050505050565b5f80611f6d61152b565b5f878152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115611fa657611fa661366b565b6003811115611fb757611fb761366b565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015612068573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208f9190810190613716565b90506002835160038111156120a6576120a661366b565b146120c7578251604051633b0d540d60e21b8152610550919060040161367f565b60208301516001600160a01b03163314612163575f8281526007850160205260409020546001600160a01b031633146121005733610fe1565b5f82815260078501602052604090205460c082015161212f91600160b01b90046001600160401b031690613916565b6001600160401b03164210156121635760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b6002815160058111156121785761217861366b565b03612311576003840154608084015161219a916001600160401b031690613916565b6001600160401b03164210156121ce5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b87156121e0576121de8288611cbd565b505b5f8981526008850160205260409020805460ff191660031790558354606084015160a08301516001600160a01b039092169163661096699185916122249190613acf565b6040516001600160e01b031960e085901b16815260048101929092526001600160401b0316602482015260440160408051808303815f875af115801561226c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122909190613aef565b505f8a8152600886016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556122d384888c612813565b9050828a7f5abe543af12bb7f76f6fa9daaa9d95d181c5e90566df58d3c012216b6245eeaf60405160405180910390a315159450611a849350505050565b6004815160058111156123265761232661366b565b0361234d5761233683878b612813565b506123408961154f565b6001945050505050611a84565b805160405163170cc93360e21b8152610550919060040161389d565b61237584848484611f63565b6107a757604051631036cf9160e11b815260048101859052602401610550565b5f8061239f61152b565b90505f6123ae610297856127f0565b8254604051636af907fb60e11b8152600481018990529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156123f8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261241f9190810190613716565b905061242a87611c94565b61244a576040516330efa98b60e01b815260048101889052602401610550565b60028151600581111561245f5761245f61366b565b1461248057805160405163170cc93360e21b8152610550919060040161389d565b5f828260a001516124919190613916565b905083600301600a9054906101000a90046001600160401b031682604001516124ba9190613b1b565b6001600160401b0316816001600160401b031611156124f757604051636d51fe0560e11b81526001600160401b0382166004820152602401610550565b8354604051636610966960e01b8152600481018a90526001600160401b03831660248201525f9182916001600160a01b039091169063661096699060440160408051808303815f875af1158015612550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125749190613aef565b915091505f8a836040516020016125a292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260088b019093529120805491925060019160ff1916828002179055505f8181526008880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fdf91f7709a30fda3fc5fc5dc97cb5d5b05e67e193dccaaef3cb332d23fda83d19060800160405180910390a496505050505050505b9392505050565b5f6126b961152b565b5f838152600b82016020526040812080549190559091506107a78482612a6d565b5f80516020613be483398151915254610797906001600160a01b03168383612ae3565b61270984848484611793565b6107a757604051635bff683f60e11b815260048101859052602401610550565b612731612b42565b61273a82612b8d565b61079781612c0b565b5f805f61274e61152b565b5f868152600982016020526040812080549082905591925090819080156127e2575f8781526007850160205260409020546127109061279890600160a01b900461ffff16836138e4565b6127a291906138c5565b91508184600b015f8981526020019081526020015f205f8282546127c6919061393d565b909155506127d690508282613b46565b92506127e28984612a6d565b509097909650945050505050565b5f610bf7825f80516020613be4833981519152546001600160a01b031690612c73565b5f8061281d61152b565b80546040808801519051636af907fb60e11b81529293505f926001600160a01b039092169163d5f20ff6916128589160040190815260200190565b5f60405180830381865afa158015612872573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128999190810190613716565b90505f6003825160058111156128b1576128b161366b565b14806128cf57506004825160058111156128cd576128cd61366b565b145b156128df575060e081015161291c565b6002825160058111156128f4576128f461366b565b0361290057504261291c565b815160405163170cc93360e21b8152610550919060040161389d565b86608001516001600160401b0316816001600160401b031611612944575f93505050506126a9565b600583015460608801515f916001600160a01b031690634f22429f9061296990610f2b565b60c086015160808c01516040808e01515f90815260078b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa1580156129ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0e9190613886565b90506001600160a01b038716612a2657876020015196505b5f8681526009850160209081526040808320849055600a90960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b5f5f80516020613be483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ac8575f80fd5b505af1158015612ada573d5f803e3d5ffd5b50505050505050565b6040516001600160a01b03838116602483015260448201839052610ba491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612c7f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612b8b57604051631afcd79f60e31b815260040160405180910390fd5b565b612b95612b42565b612b9d612ce0565b612c08612bad6020830183613b59565b60208301356040840135612bc760808601606087016135b6565b612bd760a0870160808801613b74565b612be760c0880160a08901613b8d565b60c0880135612bfd6101008a0160e08b01613b59565b896101000135612cf0565b50565b612c13612b42565b5f80516020613be48339815191526001600160a01b038216612c5357604051637330680360e01b81526001600160a01b0383166004820152602401610550565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6126a9833384612f19565b5f612c936001600160a01b0384168361307c565b905080515f14158015612cb7575080806020019051810190612cb59190613bad565b155b15610ba457604051635274afe760e01b81526001600160a01b0384166004820152602401610550565b612ce8612b42565b612b8b613089565b612cf8612b42565b5f612d0161152b565b905061ffff86161580612d19575061271061ffff8716115b15612d3d57604051635f12e6c360e11b815261ffff87166004820152602401610550565b87891115612d615760405163222d164360e21b8152600481018a9052602401610550565b60ff85161580612d745750600a60ff8616115b15612d975760405163170db35960e31b815260ff86166004820152602401610550565b896001600160a01b03166309c1df666040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df791906138fb565b6001600160401b0316876001600160401b03161015612e33576040516202a06d60e11b81526001600160401b0388166004820152602401610550565b835f03612e535760405163a733007160e01b815260040160405180910390fd5b81612e7457604051632f6bd1db60e01b815260048101839052602401610550565b80546001600160a01b039a8b166001600160a01b031991821617825560018201999099556002810197909755600387018054600160501b60ff9096169590950267ffffffffffffffff60501b1961ffff909716600160401b0269ffffffffffffffffffff199096166001600160401b03909816979097179490941794909416949094179091556004840155600583018054929095169190931617909255600690910155565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612f5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f839190613886565b9050612f9a6001600160a01b038616853086613091565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612fde573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130029190613886565b90508181116130685760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610550565b6130728282613b46565b9695505050505050565b60606126a983835f6130ca565b611780612b42565b6040516001600160a01b0384811660248301528381166044830152606482018390526107a79186918216906323b872dd90608401612b10565b6060814710156130ef5760405163cd78605960e01b8152306004820152602401610550565b5f80856001600160a01b0316848660405161310a9190613bc8565b5f6040518083038185875af1925050503d805f8114613144576040519150601f19603f3d011682016040523d82523d5f602084013e613149565b606091505b509150915061307286838360608261316957613164826131b0565b6126a9565b815115801561318057506001600160a01b0384163b155b156131a957604051639996b31560e01b81526001600160a01b0385166004820152602401610550565b50806126a9565b8051156131c05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b803563ffffffff811681146112d8575f80fd5b5f80604083850312156131fd575f80fd5b8235915061320d602084016131d9565b90509250929050565b8015158114612c08575f80fd5b5f805f60608486031215613235575f80fd5b83359250602084013561324781613216565b9150613255604085016131d9565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156132945761329461325e565b60405290565b60405161010081016001600160401b03811182821017156132945761329461325e565b604051601f8201601f191681016001600160401b03811182821017156132e5576132e561325e565b604052919050565b5f6001600160401b038211156133055761330561325e565b50601f01601f191660200190565b5f82601f830112613322575f80fd5b8135613335613330826132ed565b6132bd565b818152846020838601011115613349575f80fd5b816020850160208301375f918101602001919091529392505050565b6001600160401b0381168114612c08575f80fd5b80356112d881613365565b6001600160a01b0381168114612c08575f80fd5b5f604082840312156133a8575f80fd5b6133b0613272565b90506133bb826131d9565b81526020808301356001600160401b03808211156133d7575f80fd5b818501915085601f8301126133ea575f80fd5b8135818111156133fc576133fc61325e565b8060051b915061340d8483016132bd565b8181529183018401918481019088841115613426575f80fd5b938501935b83851015613450578435925061344083613384565b828252938501939085019061342b565b808688015250505050505092915050565b803561ffff811681146112d8575f80fd5b5f805f805f805f80610100898b03121561348a575f80fd5b88356001600160401b03808211156134a0575f80fd5b6134ac8c838d01613313565b995060208b01359150808211156134c1575f80fd5b6134cd8c838d01613313565b98506134db60408c01613379565b975060608b01359150808211156134f0575f80fd5b6134fc8c838d01613398565b965060808b0135915080821115613511575f80fd5b5061351e8b828c01613398565b94505061352d60a08a01613461565b925061353b60c08a01613379565b915060e089013590509295985092959890939650565b5f60208284031215613561575f80fd5b5035919050565b5f805f806080858703121561357b575f80fd5b84359350602085013561358d81613216565b925061359b604086016131d9565b915060608501356135ab81613384565b939692955090935050565b5f602082840312156135c6575f80fd5b81356126a981613365565b5f80604083850312156135e2575f80fd5b50508035926020909101359150565b5f8060408385031215613602575f80fd5b82359150602083013561361481613384565b809150509250929050565b5f6020828403121561362f575f80fd5b6126a9826131d9565b5f8082840361014081121561364b575f80fd5b6101208082121561365a575f80fd5b849350830135905061361481613384565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106136935761369361366b565b91905290565b8051600681106112d8575f80fd5b5f5b838110156136c15781810151838201526020016136a9565b50505f910152565b5f82601f8301126136d8575f80fd5b81516136e6613330826132ed565b8181528460208386010111156136fa575f80fd5b611a848260208301602087016136a7565b80516112d881613365565b5f60208284031215613726575f80fd5b81516001600160401b038082111561373c575f80fd5b908301906101008286031215613750575f80fd5b61375861329a565b61376183613699565b8152602083015182811115613774575f80fd5b613780878286016136c9565b6020830152506137926040840161370b565b60408201526137a36060840161370b565b60608201526137b46080840161370b565b60808201526137c560a0840161370b565b60a08201526137d660c0840161370b565b60c08201526137e760e0840161370b565b60e082015295945050505050565b5f8060408385031215613806575f80fd5b82519150602083015161361481613365565b5f60208284031215613828575f80fd5b81516001600160401b0381111561383d575f80fd5b611a84848285016136c9565b5f81518084526138608160208601602086016136a7565b601f01601f19169290920160200192915050565b602081525f6126a96020830184613849565b5f60208284031215613896575f80fd5b5051919050565b60208101600683106136935761369361366b565b634e487b7160e01b5f52601160045260245ffd5b5f826138df57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610bf757610bf76138b1565b5f6020828403121561390b575f80fd5b81516126a981613365565b6001600160401b03818116838216019080821115613936576139366138b1565b5092915050565b80820180821115610bf757610bf76138b1565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156139ab5784516001600160a01b03168252938301936001929092019190830190613982565b509695505050505050565b60c081525f6139c860c0830189613849565b82810360208401526139da8189613849565b90506001600160401b03808816604085015283820360608501526139fe8288613950565b91508382036080850152613a128287613950565b925080851660a08501525050979650505050505050565b5f8060408385031215613a3a575f80fd5b82516001600160401b0380821115613a50575f80fd5b9084019060608287031215613a63575f80fd5b604051606081018181108382111715613a7e57613a7e61325e565b604052825181526020830151613a9381613384565b6020820152604083015182811115613aa9575f80fd5b613ab5888286016136c9565b604083015250809450505050602083015161361481613216565b6001600160401b03828116828216039080821115613936576139366138b1565b5f8060408385031215613b00575f80fd5b8251613b0b81613365565b6020939093015192949293505050565b6001600160401b03818116838216028082169190828114613b3e57613b3e6138b1565b505092915050565b81810381811115610bf757610bf76138b1565b5f60208284031215613b69575f80fd5b81356126a981613384565b5f60208284031215613b84575f80fd5b6126a982613461565b5f60208284031215613b9d575f80fd5b813560ff811681146126a9575f80fd5b5f60208284031215613bbd575f80fd5b81516126a981613216565b5f8251613bd98184602087016136a7565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220fbc586eb184ddacce01086a7fb27cb00508406b68925a6a5da193fc58d910d2064736f6c63430008190033", + Bin: "0x608060405234801561000f575f80fd5b50604051613da6380380613da683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b613c598061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c8063785e9e86116100fe578063a9778a7a1161009e578063b771b3bc1161006e578063b771b3bc14610413578063cc71bbba14610421578063e4a63c4014610434578063fb8b11dd14610448575f80fd5b8063a9778a7a146102b4578063aac80c39146103da578063b2c1712e146103ed578063b5c9349814610400575f80fd5b80638ef34c98116100d95780638ef34c981461038e57806393e24598146103a15780639681d940146103b4578063a3a65e48146103c7575f80fd5b8063785e9e86146103235780637a63ad85146103545780638af5499e1461037b575f80fd5b80632aa566381161017457806360ad77841161014457806360ad7784146102e357806362065856146102f6578063732214f814610309578063739b4eff14610310575f80fd5b80632aa56638146102765780632e2194d81461028957806335455ded146102b45780634b396bcc146102d0575f80fd5b80631af1872b116101af5780631af1872b1461021c578063245dafcb1461023d57806325e1c7761461025057806327bf60cd14610263575f80fd5b806313409645146101d5578063151d30d1146101ea5780631667956414610209575b5f80fd5b6101e86101e33660046131ec565b61045b565b005b6101f2600a81565b60405160ff90911681526020015b60405180910390f35b6101e8610217366004613223565b61079b565b61022f61022a366004613472565b6107ad565b604051908152602001610200565b6101e861024b366004613551565b6107ea565b6101e861025e3660046131ec565b610aae565b6101e8610271366004613223565b610b8c565b6101e8610284366004613223565b610b98565b61029c610297366004613551565b610ba9565b6040516001600160401b039091168152602001610200565b6102bd61271081565b60405161ffff9091168152602001610200565b6101e86102de366004613568565b610bfd565b6101e86102f13660046131ec565b610c09565b61022f6103043660046135b6565b610f2b565b61022f5f81565b61022f61031e3660046135d1565b610f4b565b5f80516020613be4833981519152546001600160a01b03165b6040516001600160a01b039091168152602001610200565b61022f7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60081565b6101e8610389366004613568565b610f77565b6101e861039c3660046135f1565b610f83565b6101e86103af366004613551565b611034565b61022f6103c236600461361f565b61112d565b61022f6103d536600461361f565b6112dd565b6101e86103e8366004613568565b611355565b6101e86103fb366004613223565b611361565b6101e861040e366004613638565b61136d565b61033c6005600160991b0181565b6101e861042f366004613568565b611451565b61022f5f80516020613be483398151915281565b6101e86104563660046135f1565b61145d565b6104636114f4565b5f61046c61152b565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156104a5576104a561366b565b60038111156104b6576104b661366b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561052f5761052f61366b565b14610559578051604051633b0d540d60e21b8152610550919060040161367f565b60405180910390fd5b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa1580156105a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105cb9190810190613716565b9050600483546040808501519051636af907fb60e11b81526001600160a01b039092169163d5f20ff6916106059160040190815260200190565b5f60405180830381865afa15801561061f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106469190810190613716565b5160058111156106585761065861366b565b1415801561067f57508160c001516001600160401b031681608001516001600160401b0316105b1561077557825460405163338587c560e21b815263ffffffff861660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af11580156106d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f791906137f5565b91509150818460400151146107305781846040015160405163fee3144560e01b8152600401610550929190918252602082015260400190565b806001600160401b03168460c001516001600160401b0316111561077257604051632e19bc2d60e11b81526001600160401b0382166004820152602401610550565b50505b61077e8561154f565b50505061079760015f80516020613c0483398151915255565b5050565b6107a78383835f611793565b50505050565b5f6107b66114f4565b6107c68989898989898989611a8c565b90506107de60015f80516020613c0483398151915255565b98975050505050505050565b5f6107f361152b565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff16600381111561082c5761082c61366b565b600381111561083d5761083d61366b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156108b6576108b661366b565b141580156108d757506003815160038111156108d4576108d461366b565b14155b156108f8578051604051633b0d540d60e21b8152610550919060040161367f565b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610943573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261096a9190810190613716565b905080606001516001600160401b03165f0361099c576040516339b894f960e21b815260048101859052602401610550565b604080830151606083015160a0840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93610a0a93906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015610a24573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a4b9190810190613818565b6040518263ffffffff1660e01b8152600401610a679190613874565b6020604051808303815f875af1158015610a83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa79190613886565b5050505050565b610ab782611c94565b610ad7576040516330efa98b60e01b815260048101839052602401610550565b5f610ae061152b565b54604051636af907fb60e11b8152600481018590526001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015610b24573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b4b9190810190613716565b5190506002816005811115610b6257610b6261366b565b14610b82578060405163170cc93360e21b8152600401610550919061389d565b6107a78383611cbd565b6107a78383835f611f63565b610ba48383835f612369565b505050565b5f80610bb361152b565b60040154610bc190846138c5565b9050801580610bd657506001600160401b0381115b15610bf75760405163222d164360e21b815260048101849052602401610550565b92915050565b610aa784848484611793565b5f610c1261152b565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115610c4b57610c4b61366b565b6003811115610c5c57610c5c61366b565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015610d0d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d349190810190613716565b9050600183516003811115610d4b57610d4b61366b565b14610d6c578251604051633b0d540d60e21b8152610550919060040161367f565b600481516005811115610d8157610d8161366b565b03610d9757610d8f8661154f565b505050505050565b8260a001516001600160401b031681608001516001600160401b03161015610e9f57835460405163338587c560e21b815263ffffffff871660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af1158015610e08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2c91906137f5565b91509150818414610e5a5760405163fee3144560e01b81526004810183905260248101859052604401610550565b8460a001516001600160401b0316816001600160401b03161015610e9c57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610550565b50505b5f868152600885016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252839188917f3886b7389bccb22cac62838dee3f400cf8b22289295283e01a2c7093f93dd5aa910160405180910390a3505050505050565b5f610f3461152b565b60040154610bf7906001600160401b0384166138e4565b5f610f546114f4565b610f5f833384612395565b9050610bf760015f80516020613c0483398151915255565b6107a784848484612369565b5f610f8c61152b565b90506001600160a01b038216610fc05760405163caa903f960e01b81526001600160a01b0383166004820152602401610550565b5f8381526007820160205260409020546001600160a01b0316331461100657335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610550565b5f928352600c01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f61103d61152b565b8054604051636af907fb60e11b8152600481018590529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015611087573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110ae9190810190613716565b51905060048160058111156110c5576110c561366b565b146110e5578060405163170cc93360e21b8152600401610550919061389d565b5f8381526007830160205260409020546001600160a01b0316331461110a5733610fe1565b5f838152600783016020526040902054610ba4906001600160a01b0316846126b0565b5f6111366114f4565b5f61113f61152b565b805460405163025a076560e61b815263ffffffff861660048201529192505f916001600160a01b0390911690639681d940906024016020604051808303815f875af1158015611190573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b49190613886565b8254604051636af907fb60e11b8152600481018390529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156111fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112259190810190613716565b905061123082611c94565b61123e575091506112c29050565b5f828152600784016020908152604080832054600c870190925290912080546001600160a01b031981169091556001600160a01b039182169116806112805750805b6004835160058111156112955761129561366b565b036112a4576112a481856126b0565b6112ba826112b58560400151610f2b565b6126da565b509193505050505b6112d860015f80516020613c0483398151915255565b919050565b5f6112e661152b565b54604051631474cbc960e31b815263ffffffff841660048201526001600160a01b039091169063a3a65e48906024016020604051808303815f875af1158015611331573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf79190613886565b610aa784848484611f63565b610ba48383835f6126fd565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806113b6575080546001600160401b03808416911610155b156113d45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113ff8484612729565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6107a7848484846126fd565b6001600160a01b03811661148f5760405163caa903f960e01b81526001600160a01b0382166004820152602401610550565b5f61149861152b565b5f8481526008820160205260409020549091506001600160a01b036101009091041633146114c65733610fe1565b5f928352600a01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f80516020613c0483398151915280546001190161152557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60090565b5f61155861152b565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156115915761159161366b565b60038111156115a2576115a261366b565b815281546001600160a01b03610100909104811660208084019190915260018401546040808501919091526002909401546001600160401b038082166060860152600160401b820481166080860152600160801b8204811660a0860152600160c01b9091041660c09093019290925283830151865484516304e0efb360e11b8152945195965090949116926309c1df669260048083019391928290030181865afa158015611652573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061167691906138fb565b82608001516116859190613916565b6001600160401b03164210156116b95760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b5f848152600884016020908152604080832080546001600160a81b031916815560018101849055600201839055600a8601909152902080546001600160a01b031981169091556001600160a01b031680611714575060208201515b5f80611721838886612743565b9150915061173a85602001516112b58760600151610f2b565b6040805183815260208101839052859189917f5ecc5b26a9265302cf871229b3d983e5ca57dbb1448966c6c58b2d3c68bc7f7e910160405180910390a350505050505050565b60015f80516020613c0483398151915255565b5f8061179d61152b565b8054604051635b73516560e11b8152600481018990529192506001600160a01b03169063b6e6a2ca906024015f604051808303815f87803b1580156117e0575f80fd5b505af11580156117f2573d5f803e3d5ffd5b50508254604051636af907fb60e11b8152600481018a90525f93506001600160a01b03909116915063d5f20ff6906024015f60405180830381865afa15801561183d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118649190810190613716565b905061186f87611c94565b61187e57600192505050611a84565b5f8781526007830160205260409020546001600160a01b031633146118a35733610fe1565b5f87815260078301602052604090205460c08201516118d291600160b01b90046001600160401b031690613916565b6001600160401b03168160e001516001600160401b031610156119195760e081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610550565b5f86156119315761192a8887611cbd565b905061194f565b505f8781526007830160205260409020600101546001600160401b03165b600583015460408301515f916001600160a01b031690634f22429f9061197490610f2b565b60c086015160e0808801516040519185901b6001600160e01b031916825260048201939093526001600160401b0391821660248201819052604482015291811660648301528516608482015260a401602060405180830381865afa1580156119de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a029190613886565b90506001600160a01b038616611a2e575f8981526007850160205260409020546001600160a01b031695505b5f898152600b8501602052604081208054839290611a4d90849061393d565b90915550505f898152600c94909401602052604090932080546001600160a01b0319166001600160a01b0387161790555050151590505b949350505050565b5f80611a9661152b565b600381015490915061ffff600160401b90910481169086161080611abf575061271061ffff8616115b15611ae357604051635f12e6c360e11b815261ffff86166004820152602401610550565b60038101546001600160401b039081169085161015611b1f576040516202a06d60e11b81526001600160401b0385166004820152602401610550565b8060010154831080611b345750806002015483115b15611b555760405163222d164360e21b815260048101849052602401610550565b5f611b5f846127f0565b90505f611b6b82610ba9565b90505f835f015f9054906101000a90046001600160a01b03166001600160a01b031663ed285ae18e8e8e8e8e886040518763ffffffff1660e01b8152600401611bb9969594939291906139b6565b6020604051808303815f875af1158015611bd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf99190613886565b5f818152600786016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600c9096019095529790932080546001600160a01b03191690961790955550939998505050505050505050565b5f80611c9e61152b565b5f938452600701602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d08573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d2f9190810190613a29565b9150915080611d5157604051636b2f19e960e01b815260040160405180910390fd5b5f611d5a61152b565b6006810154845191925014611d88578251604051636ba589a560e01b81526004810191909152602401610550565b60208301516001600160a01b031615611dc4576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610550565b60208301516001600160a01b031615611e00576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610550565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b8152600401611e3d9190613874565b6040805180830381865af4158015611e57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7b91906137f5565b91509150818814611ea95760405163fee3144560e01b81526004810183905260248101899052604401610550565b5f8881526007840160205260409020600101546001600160401b039081169082161115611f3a575f888152600784016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611f58565b505f8781526007830160205260409020600101546001600160401b03165b979650505050505050565b5f80611f6d61152b565b5f878152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115611fa657611fa661366b565b6003811115611fb757611fb761366b565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015612068573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208f9190810190613716565b90506002835160038111156120a6576120a661366b565b146120c7578251604051633b0d540d60e21b8152610550919060040161367f565b60208301516001600160a01b03163314612163575f8281526007850160205260409020546001600160a01b031633146121005733610fe1565b5f82815260078501602052604090205460c082015161212f91600160b01b90046001600160401b031690613916565b6001600160401b03164210156121635760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b6002815160058111156121785761217861366b565b03612311576003840154608084015161219a916001600160401b031690613916565b6001600160401b03164210156121ce5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610550565b87156121e0576121de8288611cbd565b505b5f8981526008850160205260409020805460ff191660031790558354606084015160a08301516001600160a01b039092169163661096699185916122249190613acf565b6040516001600160e01b031960e085901b16815260048101929092526001600160401b0316602482015260440160408051808303815f875af115801561226c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122909190613aef565b505f8a8152600886016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556122d384888c612813565b9050828a7f5abe543af12bb7f76f6fa9daaa9d95d181c5e90566df58d3c012216b6245eeaf60405160405180910390a315159450611a849350505050565b6004815160058111156123265761232661366b565b0361234d5761233683878b612813565b506123408961154f565b6001945050505050611a84565b805160405163170cc93360e21b8152610550919060040161389d565b61237584848484611f63565b6107a757604051631036cf9160e11b815260048101859052602401610550565b5f8061239f61152b565b90505f6123ae610297856127f0565b8254604051636af907fb60e11b8152600481018990529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156123f8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261241f9190810190613716565b905061242a87611c94565b61244a576040516330efa98b60e01b815260048101889052602401610550565b60028151600581111561245f5761245f61366b565b1461248057805160405163170cc93360e21b8152610550919060040161389d565b5f828260a001516124919190613916565b905083600301600a9054906101000a90046001600160401b031682604001516124ba9190613b1b565b6001600160401b0316816001600160401b031611156124f757604051636d51fe0560e11b81526001600160401b0382166004820152602401610550565b8354604051636610966960e01b8152600481018a90526001600160401b03831660248201525f9182916001600160a01b039091169063661096699060440160408051808303815f875af1158015612550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125749190613aef565b915091505f8a836040516020016125a292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260088b019093529120805491925060019160ff1916828002179055505f8181526008880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fdf91f7709a30fda3fc5fc5dc97cb5d5b05e67e193dccaaef3cb332d23fda83d19060800160405180910390a496505050505050505b9392505050565b5f6126b961152b565b5f838152600b82016020526040812080549190559091506107a78482612a6d565b5f80516020613be483398151915254610797906001600160a01b03168383612ae3565b61270984848484611793565b6107a757604051635bff683f60e11b815260048101859052602401610550565b612731612b42565b61273a82612b8d565b61079781612c0b565b5f805f61274e61152b565b5f868152600982016020526040812080549082905591925090819080156127e2575f8781526007850160205260409020546127109061279890600160a01b900461ffff16836138e4565b6127a291906138c5565b91508184600b015f8981526020019081526020015f205f8282546127c6919061393d565b909155506127d690508282613b46565b92506127e28984612a6d565b509097909650945050505050565b5f610bf7825f80516020613be4833981519152546001600160a01b031690612c73565b5f8061281d61152b565b80546040808801519051636af907fb60e11b81529293505f926001600160a01b039092169163d5f20ff6916128589160040190815260200190565b5f60405180830381865afa158015612872573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128999190810190613716565b90505f6003825160058111156128b1576128b161366b565b14806128cf57506004825160058111156128cd576128cd61366b565b145b156128df575060e081015161291c565b6002825160058111156128f4576128f461366b565b0361290057504261291c565b815160405163170cc93360e21b8152610550919060040161389d565b86608001516001600160401b0316816001600160401b031611612944575f93505050506126a9565b600583015460608801515f916001600160a01b031690634f22429f9061296990610f2b565b60c086015160808c01516040808e01515f90815260078b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa1580156129ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0e9190613886565b90506001600160a01b038716612a2657876020015196505b5f8681526009850160209081526040808320849055600a90960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b5f5f80516020613be483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ac8575f80fd5b505af1158015612ada573d5f803e3d5ffd5b50505050505050565b6040516001600160a01b03838116602483015260448201839052610ba491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612c7f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612b8b57604051631afcd79f60e31b815260040160405180910390fd5b565b612b95612b42565b612b9d612ce0565b612c08612bad6020830183613b59565b60208301356040840135612bc760808601606087016135b6565b612bd760a0870160808801613b74565b612be760c0880160a08901613b8d565b60c0880135612bfd6101008a0160e08b01613b59565b896101000135612cf0565b50565b612c13612b42565b5f80516020613be48339815191526001600160a01b038216612c5357604051637330680360e01b81526001600160a01b0383166004820152602401610550565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6126a9833384612f19565b5f612c936001600160a01b0384168361307c565b905080515f14158015612cb7575080806020019051810190612cb59190613bad565b155b15610ba457604051635274afe760e01b81526001600160a01b0384166004820152602401610550565b612ce8612b42565b612b8b613089565b612cf8612b42565b5f612d0161152b565b905061ffff86161580612d19575061271061ffff8716115b15612d3d57604051635f12e6c360e11b815261ffff87166004820152602401610550565b87891115612d615760405163222d164360e21b8152600481018a9052602401610550565b60ff85161580612d745750600a60ff8616115b15612d975760405163170db35960e31b815260ff86166004820152602401610550565b896001600160a01b03166309c1df666040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df791906138fb565b6001600160401b0316876001600160401b03161015612e33576040516202a06d60e11b81526001600160401b0388166004820152602401610550565b835f03612e535760405163a733007160e01b815260040160405180910390fd5b81612e7457604051632f6bd1db60e01b815260048101839052602401610550565b80546001600160a01b039a8b166001600160a01b031991821617825560018201999099556002810197909755600387018054600160501b60ff9096169590950267ffffffffffffffff60501b1961ffff909716600160401b0269ffffffffffffffffffff199096166001600160401b03909816979097179490941794909416949094179091556004840155600583018054929095169190931617909255600690910155565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa158015612f5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f839190613886565b9050612f9a6001600160a01b038616853086613091565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612fde573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130029190613886565b90508181116130685760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610550565b6130728282613b46565b9695505050505050565b60606126a983835f6130ca565b611780612b42565b6040516001600160a01b0384811660248301528381166044830152606482018390526107a79186918216906323b872dd90608401612b10565b6060814710156130ef5760405163cd78605960e01b8152306004820152602401610550565b5f80856001600160a01b0316848660405161310a9190613bc8565b5f6040518083038185875af1925050503d805f8114613144576040519150601f19603f3d011682016040523d82523d5f602084013e613149565b606091505b509150915061307286838360608261316957613164826131b0565b6126a9565b815115801561318057506001600160a01b0384163b155b156131a957604051639996b31560e01b81526001600160a01b0385166004820152602401610550565b50806126a9565b8051156131c05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b803563ffffffff811681146112d8575f80fd5b5f80604083850312156131fd575f80fd5b8235915061320d602084016131d9565b90509250929050565b8015158114612c08575f80fd5b5f805f60608486031215613235575f80fd5b83359250602084013561324781613216565b9150613255604085016131d9565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156132945761329461325e565b60405290565b60405161010081016001600160401b03811182821017156132945761329461325e565b604051601f8201601f191681016001600160401b03811182821017156132e5576132e561325e565b604052919050565b5f6001600160401b038211156133055761330561325e565b50601f01601f191660200190565b5f82601f830112613322575f80fd5b8135613335613330826132ed565b6132bd565b818152846020838601011115613349575f80fd5b816020850160208301375f918101602001919091529392505050565b6001600160401b0381168114612c08575f80fd5b80356112d881613365565b6001600160a01b0381168114612c08575f80fd5b5f604082840312156133a8575f80fd5b6133b0613272565b90506133bb826131d9565b81526020808301356001600160401b03808211156133d7575f80fd5b818501915085601f8301126133ea575f80fd5b8135818111156133fc576133fc61325e565b8060051b915061340d8483016132bd565b8181529183018401918481019088841115613426575f80fd5b938501935b83851015613450578435925061344083613384565b828252938501939085019061342b565b808688015250505050505092915050565b803561ffff811681146112d8575f80fd5b5f805f805f805f80610100898b03121561348a575f80fd5b88356001600160401b03808211156134a0575f80fd5b6134ac8c838d01613313565b995060208b01359150808211156134c1575f80fd5b6134cd8c838d01613313565b98506134db60408c01613379565b975060608b01359150808211156134f0575f80fd5b6134fc8c838d01613398565b965060808b0135915080821115613511575f80fd5b5061351e8b828c01613398565b94505061352d60a08a01613461565b925061353b60c08a01613379565b915060e089013590509295985092959890939650565b5f60208284031215613561575f80fd5b5035919050565b5f805f806080858703121561357b575f80fd5b84359350602085013561358d81613216565b925061359b604086016131d9565b915060608501356135ab81613384565b939692955090935050565b5f602082840312156135c6575f80fd5b81356126a981613365565b5f80604083850312156135e2575f80fd5b50508035926020909101359150565b5f8060408385031215613602575f80fd5b82359150602083013561361481613384565b809150509250929050565b5f6020828403121561362f575f80fd5b6126a9826131d9565b5f8082840361014081121561364b575f80fd5b6101208082121561365a575f80fd5b849350830135905061361481613384565b634e487b7160e01b5f52602160045260245ffd5b60208101600483106136935761369361366b565b91905290565b8051600681106112d8575f80fd5b5f5b838110156136c15781810151838201526020016136a9565b50505f910152565b5f82601f8301126136d8575f80fd5b81516136e6613330826132ed565b8181528460208386010111156136fa575f80fd5b611a848260208301602087016136a7565b80516112d881613365565b5f60208284031215613726575f80fd5b81516001600160401b038082111561373c575f80fd5b908301906101008286031215613750575f80fd5b61375861329a565b61376183613699565b8152602083015182811115613774575f80fd5b613780878286016136c9565b6020830152506137926040840161370b565b60408201526137a36060840161370b565b60608201526137b46080840161370b565b60808201526137c560a0840161370b565b60a08201526137d660c0840161370b565b60c08201526137e760e0840161370b565b60e082015295945050505050565b5f8060408385031215613806575f80fd5b82519150602083015161361481613365565b5f60208284031215613828575f80fd5b81516001600160401b0381111561383d575f80fd5b611a84848285016136c9565b5f81518084526138608160208601602086016136a7565b601f01601f19169290920160200192915050565b602081525f6126a96020830184613849565b5f60208284031215613896575f80fd5b5051919050565b60208101600683106136935761369361366b565b634e487b7160e01b5f52601160045260245ffd5b5f826138df57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610bf757610bf76138b1565b5f6020828403121561390b575f80fd5b81516126a981613365565b6001600160401b03818116838216019080821115613936576139366138b1565b5092915050565b80820180821115610bf757610bf76138b1565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b808310156139ab5784516001600160a01b03168252938301936001929092019190830190613982565b509695505050505050565b60c081525f6139c860c0830189613849565b82810360208401526139da8189613849565b90506001600160401b03808816604085015283820360608501526139fe8288613950565b91508382036080850152613a128287613950565b925080851660a08501525050979650505050505050565b5f8060408385031215613a3a575f80fd5b82516001600160401b0380821115613a50575f80fd5b9084019060608287031215613a63575f80fd5b604051606081018181108382111715613a7e57613a7e61325e565b604052825181526020830151613a9381613384565b6020820152604083015182811115613aa9575f80fd5b613ab5888286016136c9565b604083015250809450505050602083015161361481613216565b6001600160401b03828116828216039080821115613936576139366138b1565b5f8060408385031215613b00575f80fd5b8251613b0b81613365565b6020939093015192949293505050565b6001600160401b03818116838216028082169190828114613b3e57613b3e6138b1565b505092915050565b81810381811115610bf757610bf76138b1565b5f60208284031215613b69575f80fd5b81356126a981613384565b5f60208284031215613b84575f80fd5b6126a982613461565b5f60208284031215613b9d575f80fd5b813560ff811681146126a9575f80fd5b5f60208284031215613bbd575f80fd5b81516126a981613216565b5f8251613bd98184602087016136a7565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220c1e0e10594365110a88acc34e3481fac29bdf179be48683cdbc283f71c2c227664736f6c63430008190033", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 5622be2b0..bc8a6cb48 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -77,7 +77,7 @@ type ValidatorMessagesValidationPeriod struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"enumICMInitializable\",\"name\":\"init\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"DelegatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"}],\"name\":\"InvalidDelegationFee\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"InvalidDelegationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumDelegatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidDelegatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"InvalidMinStakeDuration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"InvalidRewardRecipient\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidStakeAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"}],\"name\":\"InvalidStakeMultiplier\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidUptimeBlockchainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumValidatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"name\":\"InvalidValidatorStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWarpMessage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"senderAddress\",\"type\":\"address\"}],\"name\":\"InvalidWarpOriginSenderAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"sourceChainID\",\"type\":\"bytes32\"}],\"name\":\"InvalidWarpSourceChainID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newValidatorWeight\",\"type\":\"uint64\"}],\"name\":\"MaxWeightExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"MinStakeDurationNotPassed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expectedValidationID\",\"type\":\"bytes32\"}],\"name\":\"UnexpectedValidationID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorIneligibleForRewards\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"ValidatorNotPoS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroWeightToValueFactor\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"}],\"name\":\"CompletedDelegatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rewards\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"CompletedDelegatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatorAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"validatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"delegatorWeight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"setWeightMessageID\",\"type\":\"bytes32\"}],\"name\":\"InitiatedDelegatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"InitiatedDelegatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"uptime\",\"type\":\"uint64\"}],\"name\":\"UptimeUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BIPS_CONVERSION_FACTOR\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_MINTER\",\"outputs\":[{\"internalType\":\"contractINativeMinter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STAKING_MANAGER_STORAGE_LOCATION\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WARP_MESSENGER\",\"outputs\":[{\"internalType\":\"contractIWarpMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeDelegatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"changeValidatorRewardRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"claimDelegationFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRegistration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorRemoval\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"forceInitiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"forceInitiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractValidatorManager\",\"name\":\"manager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"minimumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximumStakeAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"minimumStakeDuration\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"minimumDelegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint8\",\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"weightToValueFactor\",\"type\":\"uint256\"},{\"internalType\":\"contractIRewardCalculator\",\"name\":\"rewardCalculator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"uptimeBlockchainID\",\"type\":\"bytes32\"}],\"internalType\":\"structStakingManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initiateDelegatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initiateDelegatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"remainingBalanceOwner\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"threshold\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"internalType\":\"structPChainOwner\",\"name\":\"disableOwner\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"delegationFeeBips\",\"type\":\"uint16\"},{\"internalType\":\"uint64\",\"name\":\"minStakeDuration\",\"type\":\"uint64\"}],\"name\":\"initiateValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"includeUptimeProof\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"rewardRecipient\",\"type\":\"address\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"delegationID\",\"type\":\"bytes32\"}],\"name\":\"resendUpdateDelegator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"submitUptimeProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"valueToWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"weightToValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613a4b380380613a4b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138fe8061014d5f395ff3fe6080604052600436106101ba575f3560e01c806362065856116100f2578063a3a65e4811610092578063b771b3bc11610062578063b771b3bc146104f2578063cacd97551461050c578063cc71bbba1461051f578063fb8b11dd1461053e575f80fd5b8063a3a65e4814610495578063a9778a7a1461034e578063aac80c39146104b4578063b2c1712e146104d3575f80fd5b80638af5499e116100cd5780638af5499e146104195780638ef34c981461043857806393e24598146104575780639681d94014610476575f80fd5b806362065856146103b4578063732214f8146103d35780637a63ad85146103e6575f80fd5b806327bf60cd1161015d578063329c3e1211610138578063329c3e121461031c57806335455ded1461034e5780634b396bcc1461037657806360ad778414610395575f80fd5b806327bf60cd146102a75780632aa56638146102c65780632e2194d8146102e5575f80fd5b806316679564116101985780631667956414610229578063245dafcb1461024857806325e1c77614610267578063264dc60314610286575f80fd5b80630d436317146101be57806313409645146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004612f1a565b61055d565b005b3480156101ea575f80fd5b506101dd6101f9366004612f44565b61063f565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd610243366004612f7b565b61097f565b348015610253575f80fd5b506101dd610262366004612fb6565b610991565b348015610272575f80fd5b506101dd610281366004612f44565b610c55565b6102996102943660046131e1565b610d33565b604051908152602001610220565b3480156102b2575f80fd5b506101dd6102c1366004612f7b565b610d6f565b3480156102d1575f80fd5b506101dd6102e0366004612f7b565b610d7b565b3480156102f0575f80fd5b506103046102ff366004612fb6565b610d8c565b6040516001600160401b039091168152602001610220565b348015610327575f80fd5b506103366001600160991b0181565b6040516001600160a01b039091168152602001610220565b348015610359575f80fd5b5061036361271081565b60405161ffff9091168152602001610220565b348015610381575f80fd5b506101dd6103903660046132b6565b610de0565b3480156103a0575f80fd5b506101dd6103af366004612f44565b610dec565b3480156103bf575f80fd5b506102996103ce366004613304565b61110e565b3480156103de575f80fd5b506102995f81565b3480156103f1575f80fd5b506102997fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60081565b348015610424575f80fd5b506101dd6104333660046132b6565b61112e565b348015610443575f80fd5b506101dd61045236600461331f565b61113a565b348015610462575f80fd5b506101dd610471366004612fb6565b6111eb565b348015610481575f80fd5b5061029961049036600461334d565b6112e4565b3480156104a0575f80fd5b506102996104af36600461334d565b611494565b3480156104bf575f80fd5b506101dd6104ce3660046132b6565b61150c565b3480156104de575f80fd5b506101dd6104ed366004612f7b565b611518565b3480156104fd575f80fd5b506103366005600160991b0181565b61029961051a366004612fb6565b611524565b34801561052a575f80fd5b506101dd6105393660046132b6565b611550565b348015610549575f80fd5b506101dd61055836600461331f565b61155c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806105a6575080546001600160401b03808416911610155b156105c45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556105ee836115f3565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610647611607565b5f61065061163e565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff16600381111561068957610689613366565b600381111561069a5761069a613366565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561071357610713613366565b1461073d578051604051633b0d540d60e21b8152610734919060040161337a565b60405180910390fd5b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610788573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107af9190810190613411565b9050600483546040808501519051636af907fb60e11b81526001600160a01b039092169163d5f20ff6916107e99160040190815260200190565b5f60405180830381865afa158015610803573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261082a9190810190613411565b51600581111561083c5761083c613366565b1415801561086357508160c001516001600160401b031681608001516001600160401b0316105b1561095957825460405163338587c560e21b815263ffffffff861660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af11580156108b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108db91906134f0565b91509150818460400151146109145781846040015160405163fee3144560e01b8152600401610734929190918252602082015260400190565b806001600160401b03168460c001516001600160401b0316111561095657604051632e19bc2d60e11b81526001600160401b0382166004820152602401610734565b50505b61096285611662565b50505061097b60015f805160206138a983398151915255565b5050565b61098b8383835f6118a6565b50505050565b5f61099a61163e565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156109d3576109d3613366565b60038111156109e4576109e4613366565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115610a5d57610a5d613366565b14158015610a7e5750600381516003811115610a7b57610a7b613366565b14155b15610a9f578051604051633b0d540d60e21b8152610734919060040161337a565b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610aea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b119190810190613411565b905080606001516001600160401b03165f03610b43576040516339b894f960e21b815260048101859052602401610734565b604080830151606083015160a0840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93610bb193906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015610bcb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bf29190810190613513565b6040518263ffffffff1660e01b8152600401610c0e919061356f565b6020604051808303815f875af1158015610c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4e9190613581565b5050505050565b610c5e82611b9f565b610c7e576040516330efa98b60e01b815260048101839052602401610734565b5f610c8761163e565b54604051636af907fb60e11b8152600481018590526001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015610ccb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cf29190810190613411565b5190506002816005811115610d0957610d09613366565b14610d29578060405163170cc93360e21b81526004016107349190613598565b61098b8383611bc8565b5f610d3c611607565b610d4c8888888888888834611e6b565b9050610d6460015f805160206138a983398151915255565b979650505050505050565b61098b8383835f612068565b610d878383835f61246e565b505050565b5f80610d9661163e565b60040154610da490846135c0565b9050801580610db957506001600160401b0381115b15610dda5760405163222d164360e21b815260048101849052602401610734565b92915050565b610c4e848484846118a6565b5f610df561163e565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115610e2e57610e2e613366565b6003811115610e3f57610e3f613366565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015610ef0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f179190810190613411565b9050600183516003811115610f2e57610f2e613366565b14610f4f578251604051633b0d540d60e21b8152610734919060040161337a565b600481516005811115610f6457610f64613366565b03610f7a57610f7286611662565b505050505050565b8260a001516001600160401b031681608001516001600160401b0316101561108257835460405163338587c560e21b815263ffffffff871660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af1158015610feb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100f91906134f0565b9150915081841461103d5760405163fee3144560e01b81526004810183905260248101859052604401610734565b8460a001516001600160401b0316816001600160401b0316101561107f57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610734565b50505b5f868152600885016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252839188917f3886b7389bccb22cac62838dee3f400cf8b22289295283e01a2c7093f93dd5aa910160405180910390a3505050505050565b5f61111761163e565b60040154610dda906001600160401b0384166135df565b61098b8484848461246e565b5f61114361163e565b90506001600160a01b0382166111775760405163caa903f960e01b81526001600160a01b0383166004820152602401610734565b5f8381526007820160205260409020546001600160a01b031633146111bd57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610734565b5f928352600c01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f6111f461163e565b8054604051636af907fb60e11b8152600481018590529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa15801561123e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112659190810190613411565b519050600481600581111561127c5761127c613366565b1461129c578060405163170cc93360e21b81526004016107349190613598565b5f8381526007830160205260409020546001600160a01b031633146112c15733611198565b5f838152600783016020526040902054610d87906001600160a01b03168461249a565b5f6112ed611607565b5f6112f661163e565b805460405163025a076560e61b815263ffffffff861660048201529192505f916001600160a01b0390911690639681d940906024016020604051808303815f875af1158015611347573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061136b9190613581565b8254604051636af907fb60e11b8152600481018390529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113dc9190810190613411565b90506113e782611b9f565b6113f5575091506114799050565b5f828152600784016020908152604080832054600c870190925290912080546001600160a01b031981169091556001600160a01b039182169116806114375750805b60048351600581111561144c5761144c613366565b0361145b5761145b818561249a565b6114718261146c856040015161110e565b6124c4565b509193505050505b61148f60015f805160206138a983398151915255565b919050565b5f61149d61163e565b54604051631474cbc960e31b815263ffffffff841660048201526001600160a01b039091169063a3a65e48906024016020604051808303815f875af11580156114e8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dda9190613581565b610c4e84848484612068565b610d878383835f6124d7565b5f61152d611607565b611538823334612503565b905061148f60015f805160206138a983398151915255565b61098b848484846124d7565b6001600160a01b03811661158e5760405163caa903f960e01b81526001600160a01b0382166004820152602401610734565b5f61159761163e565b5f8481526008820160205260409020549091506001600160a01b036101009091041633146115c55733611198565b5f928352600a01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6115fb61281b565b61160481612866565b50565b5f805160206138a983398151915280546001190161163857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60090565b5f61166b61163e565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156116a4576116a4613366565b60038111156116b5576116b5613366565b815281546001600160a01b03610100909104811660208084019190915260018401546040808501919091526002909401546001600160401b038082166060860152600160401b820481166080860152600160801b8204811660a0860152600160c01b9091041660c09093019290925283830151865484516304e0efb360e11b8152945195965090949116926309c1df669260048083019391928290030181865afa158015611765573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178991906135f6565b82608001516117989190613611565b6001600160401b03164210156117cc5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b5f848152600884016020908152604080832080546001600160a81b031916815560018101849055600201839055600a8601909152902080546001600160a01b031981169091556001600160a01b031680611827575060208201515b5f806118348388866128e1565b9150915061184d856020015161146c876060015161110e565b6040805183815260208101839052859189917f5ecc5b26a9265302cf871229b3d983e5ca57dbb1448966c6c58b2d3c68bc7f7e910160405180910390a350505050505050565b60015f805160206138a983398151915255565b5f806118b061163e565b8054604051635b73516560e11b8152600481018990529192506001600160a01b03169063b6e6a2ca906024015f604051808303815f87803b1580156118f3575f80fd5b505af1158015611905573d5f803e3d5ffd5b50508254604051636af907fb60e11b8152600481018a90525f93506001600160a01b03909116915063d5f20ff6906024015f60405180830381865afa158015611950573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119779190810190613411565b905061198287611b9f565b61199157600192505050611b97565b5f8781526007830160205260409020546001600160a01b031633146119b65733611198565b5f87815260078301602052604090205460c08201516119e591600160b01b90046001600160401b031690613611565b6001600160401b03168160e001516001600160401b03161015611a2c5760e081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610734565b5f8615611a4457611a3d8887611bc8565b9050611a62565b505f8781526007830160205260409020600101546001600160401b03165b600583015460408301515f916001600160a01b031690634f22429f90611a879061110e565b60c086015160e0808801516040519185901b6001600160e01b031916825260048201939093526001600160401b0391821660248201819052604482015291811660648301528516608482015260a401602060405180830381865afa158015611af1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b159190613581565b90506001600160a01b038616611b41575f8981526007850160205260409020546001600160a01b031695505b5f898152600b8501602052604081208054839290611b60908490613638565b90915550505f898152600c94909401602052604090932080546001600160a01b0319166001600160a01b0387161790555050151590505b949350505050565b5f80611ba961163e565b5f938452600701602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c13573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c3a919081019061364b565b9150915080611c5c57604051636b2f19e960e01b815260040160405180910390fd5b5f611c6561163e565b6006810154845191925014611c93578251604051636ba589a560e01b81526004810191909152602401610734565b60208301516001600160a01b031615611ccf576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610734565b60208301516001600160a01b031615611d0b576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610734565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b8152600401611d48919061356f565b6040805180830381865af4158015611d62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8691906134f0565b91509150818814611db45760405163fee3144560e01b81526004810183905260248101899052604401610734565b5f8881526007840160205260409020600101546001600160401b039081169082161115611e45575f888152600784016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2610d64565b50505f95865260070160205250506040909220600101546001600160401b031692915050565b5f80611e7561163e565b600381015490915061ffff600160401b90910481169086161080611e9e575061271061ffff8616115b15611ec257604051635f12e6c360e11b815261ffff86166004820152602401610734565b60038101546001600160401b039081169085161015611efe576040516202a06d60e11b81526001600160401b0385166004820152602401610734565b8060010154831080611f135750806002015483115b15611f345760405163222d164360e21b815260048101849052602401610734565b825f611f3f82610d8c565b90505f835f015f9054906101000a90046001600160a01b03166001600160a01b031663ed285ae18e8e8e8e8e886040518763ffffffff1660e01b8152600401611f8d96959493929190613757565b6020604051808303815f875af1158015611fa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcd9190613581565b5f818152600786016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600c9096019095529790932080546001600160a01b03191690961790955550939998505050505050505050565b5f8061207261163e565b5f878152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156120ab576120ab613366565b60038111156120bc576120bc613366565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa15801561216d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121949190810190613411565b90506002835160038111156121ab576121ab613366565b146121cc578251604051633b0d540d60e21b8152610734919060040161337a565b60208301516001600160a01b03163314612268575f8281526007850160205260409020546001600160a01b031633146122055733611198565b5f82815260078501602052604090205460c082015161223491600160b01b90046001600160401b031690613611565b6001600160401b03164210156122685760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b60028151600581111561227d5761227d613366565b03612416576003840154608084015161229f916001600160401b031690613611565b6001600160401b03164210156122d35760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b87156122e5576122e38288611bc8565b505b5f8981526008850160205260409020805460ff191660031790558354606084015160a08301516001600160a01b0390921691636610966991859161232991906137ca565b6040516001600160e01b031960e085901b16815260048101929092526001600160401b0316602482015260440160408051808303815f875af1158015612371573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061239591906137ea565b505f8a8152600886016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556123d884888c61298e565b9050828a7f5abe543af12bb7f76f6fa9daaa9d95d181c5e90566df58d3c012216b6245eeaf60405160405180910390a315159450611b979350505050565b60048151600581111561242b5761242b613366565b036124525761243b83878b61298e565b5061244589611662565b6001945050505050611b97565b805160405163170cc93360e21b81526107349190600401613598565b61247a84848484612068565b61098b57604051631036cf9160e11b815260048101859052602401610734565b5f6124a361163e565b5f838152600b820160205260408120805491905590915061098b8482612be8565b61097b6001600160a01b03831682612c46565b6124e3848484846118a6565b61098b57604051635bff683f60e11b815260048101859052602401610734565b5f8061250d61163e565b90505f61251984610d8c565b8254604051636af907fb60e11b8152600481018990529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015612563573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261258a9190810190613411565b905061259587611b9f565b6125b5576040516330efa98b60e01b815260048101889052602401610734565b6002815160058111156125ca576125ca613366565b146125eb57805160405163170cc93360e21b81526107349190600401613598565b5f828260a001516125fc9190613611565b905083600301600a9054906101000a90046001600160401b031682604001516126259190613816565b6001600160401b0316816001600160401b0316111561266257604051636d51fe0560e11b81526001600160401b0382166004820152602401610734565b8354604051636610966960e01b8152600481018a90526001600160401b03831660248201525f9182916001600160a01b039091169063661096699060440160408051808303815f875af11580156126bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126df91906137ea565b915091505f8a8360405160200161270d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260088b019093529120805491925060019160ff1916828002179055505f8181526008880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fdf91f7709a30fda3fc5fc5dc97cb5d5b05e67e193dccaaef3cb332d23fda83d19060800160405180910390a496505050505050505b9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661286457604051631afcd79f60e31b815260040160405180910390fd5b565b61286e61281b565b612876612cd9565b6116046128866020830183613841565b602083013560408401356128a06080860160608701613304565b6128b060a087016080880161385c565b6128c060c0880160a08901613875565b60c08801356128d66101008a0160e08b01613841565b896101000135612ce9565b5f805f6128ec61163e565b5f86815260098201602052604081208054908290559192509081908015612980575f8781526007850160205260409020546127109061293690600160a01b900461ffff16836135df565b61294091906135c0565b91508184600b015f8981526020019081526020015f205f8282546129649190613638565b9091555061297490508282613895565b92506129808984612be8565b509097909650945050505050565b5f8061299861163e565b80546040808801519051636af907fb60e11b81529293505f926001600160a01b039092169163d5f20ff6916129d39160040190815260200190565b5f60405180830381865afa1580156129ed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a149190810190613411565b90505f600382516005811115612a2c57612a2c613366565b1480612a4a5750600482516005811115612a4857612a48613366565b145b15612a5a575060e0810151612a97565b600282516005811115612a6f57612a6f613366565b03612a7b575042612a97565b815160405163170cc93360e21b81526107349190600401613598565b86608001516001600160401b0316816001600160401b031611612abf575f9350505050612814565b600583015460608801515f916001600160a01b031690634f22429f90612ae49061110e565b60c086015160808c01516040808e01515f90815260078b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa158015612b65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b899190613581565b90506001600160a01b038716612ba157876020015196505b5f8681526009850160209081526040808320849055600a90960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c34575f80fd5b505af1158015610f72573d5f803e3d5ffd5b80471015612c695760405163cd78605960e01b8152306004820152602401610734565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612cb2576040519150601f19603f3d011682016040523d82523d5f602084013e612cb7565b606091505b5050905080610d8757604051630a12f52160e11b815260040160405180910390fd5b612ce161281b565b612864612f12565b612cf161281b565b5f612cfa61163e565b905061ffff86161580612d12575061271061ffff8716115b15612d3657604051635f12e6c360e11b815261ffff87166004820152602401610734565b87891115612d5a5760405163222d164360e21b8152600481018a9052602401610734565b60ff85161580612d6d5750600a60ff8616115b15612d905760405163170db35960e31b815260ff86166004820152602401610734565b896001600160a01b03166309c1df666040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df091906135f6565b6001600160401b0316876001600160401b03161015612e2c576040516202a06d60e11b81526001600160401b0388166004820152602401610734565b835f03612e4c5760405163a733007160e01b815260040160405180910390fd5b81612e6d57604051632f6bd1db60e01b815260048101839052602401610734565b80546001600160a01b039a8b166001600160a01b031991821617825560018201999099556002810197909755600387018054600160501b60ff9096169590950267ffffffffffffffff60501b1961ffff909716600160401b0269ffffffffffffffffffff199096166001600160401b03909816979097179490941794909416949094179091556004840155600583018054929095169190931617909255600690910155565b61189361281b565b5f6101208284031215612f2b575f80fd5b50919050565b803563ffffffff8116811461148f575f80fd5b5f8060408385031215612f55575f80fd5b82359150612f6560208401612f31565b90509250929050565b8015158114611604575f80fd5b5f805f60608486031215612f8d575f80fd5b833592506020840135612f9f81612f6e565b9150612fad60408501612f31565b90509250925092565b5f60208284031215612fc6575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171561300357613003612fcd565b60405290565b60405161010081016001600160401b038111828210171561300357613003612fcd565b604051601f8201601f191681016001600160401b038111828210171561305457613054612fcd565b604052919050565b5f6001600160401b0382111561307457613074612fcd565b50601f01601f191660200190565b5f82601f830112613091575f80fd5b81356130a461309f8261305c565b61302c565b8181528460208386010111156130b8575f80fd5b816020850160208301375f918101602001919091529392505050565b6001600160401b0381168114611604575f80fd5b803561148f816130d4565b6001600160a01b0381168114611604575f80fd5b5f60408284031215613117575f80fd5b61311f612fe1565b905061312a82612f31565b81526020808301356001600160401b0380821115613146575f80fd5b818501915085601f830112613159575f80fd5b81358181111561316b5761316b612fcd565b8060051b915061317c84830161302c565b8181529183018401918481019088841115613195575f80fd5b938501935b838510156131bf57843592506131af836130f3565b828252938501939085019061319a565b808688015250505050505092915050565b803561ffff8116811461148f575f80fd5b5f805f805f805f60e0888a0312156131f7575f80fd5b87356001600160401b038082111561320d575f80fd5b6132198b838c01613082565b985060208a013591508082111561322e575f80fd5b61323a8b838c01613082565b975061324860408b016130e8565b965060608a013591508082111561325d575f80fd5b6132698b838c01613107565b955060808a013591508082111561327e575f80fd5b5061328b8a828b01613107565b93505061329a60a089016131d0565b91506132a860c089016130e8565b905092959891949750929550565b5f805f80608085870312156132c9575f80fd5b8435935060208501356132db81612f6e565b92506132e960408601612f31565b915060608501356132f9816130f3565b939692955090935050565b5f60208284031215613314575f80fd5b8135612814816130d4565b5f8060408385031215613330575f80fd5b823591506020830135613342816130f3565b809150509250929050565b5f6020828403121561335d575f80fd5b61281482612f31565b634e487b7160e01b5f52602160045260245ffd5b602081016004831061338e5761338e613366565b91905290565b80516006811061148f575f80fd5b5f5b838110156133bc5781810151838201526020016133a4565b50505f910152565b5f82601f8301126133d3575f80fd5b81516133e161309f8261305c565b8181528460208386010111156133f5575f80fd5b611b978260208301602087016133a2565b805161148f816130d4565b5f60208284031215613421575f80fd5b81516001600160401b0380821115613437575f80fd5b90830190610100828603121561344b575f80fd5b613453613009565b61345c83613394565b815260208301518281111561346f575f80fd5b61347b878286016133c4565b60208301525061348d60408401613406565b604082015261349e60608401613406565b60608201526134af60808401613406565b60808201526134c060a08401613406565b60a08201526134d160c08401613406565b60c08201526134e260e08401613406565b60e082015295945050505050565b5f8060408385031215613501575f80fd5b825191506020830151613342816130d4565b5f60208284031215613523575f80fd5b81516001600160401b03811115613538575f80fd5b611b97848285016133c4565b5f815180845261355b8160208601602086016133a2565b601f01601f19169290920160200192915050565b602081525f6128146020830184613544565b5f60208284031215613591575f80fd5b5051919050565b602081016006831061338e5761338e613366565b634e487b7160e01b5f52601160045260245ffd5b5f826135da57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610dda57610dda6135ac565b5f60208284031215613606575f80fd5b8151612814816130d4565b6001600160401b03818116838216019080821115613631576136316135ac565b5092915050565b80820180821115610dda57610dda6135ac565b5f806040838503121561365c575f80fd5b82516001600160401b0380821115613672575f80fd5b9084019060608287031215613685575f80fd5b6040516060810181811083821117156136a0576136a0612fcd565b6040528251815260208301516136b5816130f3565b60208201526040830151828111156136cb575f80fd5b6136d7888286016133c4565b604083015250809450505050602083015161334281612f6e565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b8083101561374c5784516001600160a01b03168252938301936001929092019190830190613723565b509695505050505050565b60c081525f61376960c0830189613544565b828103602084015261377b8189613544565b90506001600160401b038088166040850152838203606085015261379f82886136f1565b915083820360808501526137b382876136f1565b925080851660a08501525050979650505050505050565b6001600160401b03828116828216039080821115613631576136316135ac565b5f80604083850312156137fb575f80fd5b8251613806816130d4565b6020939093015192949293505050565b6001600160401b03818116838216028082169190828114613839576138396135ac565b505092915050565b5f60208284031215613851575f80fd5b8135612814816130f3565b5f6020828403121561386c575f80fd5b612814826131d0565b5f60208284031215613885575f80fd5b813560ff81168114612814575f80fd5b81810381811115610dda57610dda6135ac56fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212202d2cf36a26cacfe5cbe9495c4996f134a94c2b64bc3ebb3eb3f5d7355fa6cc5564736f6c63430008190033", + Bin: "0x608060405234801561000f575f80fd5b50604051613a4b380380613a4b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138fe8061014d5f395ff3fe6080604052600436106101ba575f3560e01c806362065856116100f2578063a3a65e4811610092578063b771b3bc11610062578063b771b3bc146104f2578063cacd97551461050c578063cc71bbba1461051f578063fb8b11dd1461053e575f80fd5b8063a3a65e4814610495578063a9778a7a1461034e578063aac80c39146104b4578063b2c1712e146104d3575f80fd5b80638af5499e116100cd5780638af5499e146104195780638ef34c981461043857806393e24598146104575780639681d94014610476575f80fd5b806362065856146103b4578063732214f8146103d35780637a63ad85146103e6575f80fd5b806327bf60cd1161015d578063329c3e1211610138578063329c3e121461031c57806335455ded1461034e5780634b396bcc1461037657806360ad778414610395575f80fd5b806327bf60cd146102a75780632aa56638146102c65780632e2194d8146102e5575f80fd5b806316679564116101985780631667956414610229578063245dafcb1461024857806325e1c77614610267578063264dc60314610286575f80fd5b80630d436317146101be57806313409645146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004612f1a565b61055d565b005b3480156101ea575f80fd5b506101dd6101f9366004612f44565b61063f565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd610243366004612f7b565b61097f565b348015610253575f80fd5b506101dd610262366004612fb6565b610991565b348015610272575f80fd5b506101dd610281366004612f44565b610c55565b6102996102943660046131e1565b610d33565b604051908152602001610220565b3480156102b2575f80fd5b506101dd6102c1366004612f7b565b610d6f565b3480156102d1575f80fd5b506101dd6102e0366004612f7b565b610d7b565b3480156102f0575f80fd5b506103046102ff366004612fb6565b610d8c565b6040516001600160401b039091168152602001610220565b348015610327575f80fd5b506103366001600160991b0181565b6040516001600160a01b039091168152602001610220565b348015610359575f80fd5b5061036361271081565b60405161ffff9091168152602001610220565b348015610381575f80fd5b506101dd6103903660046132b6565b610de0565b3480156103a0575f80fd5b506101dd6103af366004612f44565b610dec565b3480156103bf575f80fd5b506102996103ce366004613304565b61110e565b3480156103de575f80fd5b506102995f81565b3480156103f1575f80fd5b506102997fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60081565b348015610424575f80fd5b506101dd6104333660046132b6565b61112e565b348015610443575f80fd5b506101dd61045236600461331f565b61113a565b348015610462575f80fd5b506101dd610471366004612fb6565b6111eb565b348015610481575f80fd5b5061029961049036600461334d565b6112e4565b3480156104a0575f80fd5b506102996104af36600461334d565b611494565b3480156104bf575f80fd5b506101dd6104ce3660046132b6565b61150c565b3480156104de575f80fd5b506101dd6104ed366004612f7b565b611518565b3480156104fd575f80fd5b506103366005600160991b0181565b61029961051a366004612fb6565b611524565b34801561052a575f80fd5b506101dd6105393660046132b6565b611550565b348015610549575f80fd5b506101dd61055836600461331f565b61155c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806105a6575080546001600160401b03808416911610155b156105c45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556105ee836115f3565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610647611607565b5f61065061163e565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff16600381111561068957610689613366565b600381111561069a5761069a613366565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561071357610713613366565b1461073d578051604051633b0d540d60e21b8152610734919060040161337a565b60405180910390fd5b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610788573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107af9190810190613411565b9050600483546040808501519051636af907fb60e11b81526001600160a01b039092169163d5f20ff6916107e99160040190815260200190565b5f60405180830381865afa158015610803573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261082a9190810190613411565b51600581111561083c5761083c613366565b1415801561086357508160c001516001600160401b031681608001516001600160401b0316105b1561095957825460405163338587c560e21b815263ffffffff861660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af11580156108b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108db91906134f0565b91509150818460400151146109145781846040015160405163fee3144560e01b8152600401610734929190918252602082015260400190565b806001600160401b03168460c001516001600160401b0316111561095657604051632e19bc2d60e11b81526001600160401b0382166004820152602401610734565b50505b61096285611662565b50505061097b60015f805160206138a983398151915255565b5050565b61098b8383835f6118a6565b50505050565b5f61099a61163e565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156109d3576109d3613366565b60038111156109e4576109e4613366565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115610a5d57610a5d613366565b14158015610a7e5750600381516003811115610a7b57610a7b613366565b14155b15610a9f578051604051633b0d540d60e21b8152610734919060040161337a565b81546040828101519051636af907fb60e11b815260048101919091525f916001600160a01b03169063d5f20ff6906024015f60405180830381865afa158015610aea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b119190810190613411565b905080606001516001600160401b03165f03610b43576040516339b894f960e21b815260048101859052602401610734565b604080830151606083015160a0840151925163854a893f60e01b81526005600160991b019363ee5b48eb9373__$fd0c147b4031eef6079b0498cbafa865f0$__9363854a893f93610bb193906004019283526001600160401b03918216602084015216604082015260600190565b5f60405180830381865af4158015610bcb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bf29190810190613513565b6040518263ffffffff1660e01b8152600401610c0e919061356f565b6020604051808303815f875af1158015610c2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4e9190613581565b5050505050565b610c5e82611b9f565b610c7e576040516330efa98b60e01b815260048101839052602401610734565b5f610c8761163e565b54604051636af907fb60e11b8152600481018590526001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015610ccb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cf29190810190613411565b5190506002816005811115610d0957610d09613366565b14610d29578060405163170cc93360e21b81526004016107349190613598565b61098b8383611bc8565b5f610d3c611607565b610d4c8888888888888834611e6b565b9050610d6460015f805160206138a983398151915255565b979650505050505050565b61098b8383835f612068565b610d878383835f61246e565b505050565b5f80610d9661163e565b60040154610da490846135c0565b9050801580610db957506001600160401b0381115b15610dda5760405163222d164360e21b815260048101849052602401610734565b92915050565b610c4e848484846118a6565b5f610df561163e565b5f848152600882016020526040808220815160e0810190925280549394509192909190829060ff166003811115610e2e57610e2e613366565b6003811115610e3f57610e3f613366565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa158015610ef0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f179190810190613411565b9050600183516003811115610f2e57610f2e613366565b14610f4f578251604051633b0d540d60e21b8152610734919060040161337a565b600481516005811115610f6457610f64613366565b03610f7a57610f7286611662565b505050505050565b8260a001516001600160401b031681608001516001600160401b0316101561108257835460405163338587c560e21b815263ffffffff871660048201525f9182916001600160a01b039091169063ce161f149060240160408051808303815f875af1158015610feb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100f91906134f0565b9150915081841461103d5760405163fee3144560e01b81526004810183905260248101859052604401610734565b8460a001516001600160401b0316816001600160401b0316101561107f57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610734565b50505b5f868152600885016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252839188917f3886b7389bccb22cac62838dee3f400cf8b22289295283e01a2c7093f93dd5aa910160405180910390a3505050505050565b5f61111761163e565b60040154610dda906001600160401b0384166135df565b61098b8484848461246e565b5f61114361163e565b90506001600160a01b0382166111775760405163caa903f960e01b81526001600160a01b0383166004820152602401610734565b5f8381526007820160205260409020546001600160a01b031633146111bd57335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610734565b5f928352600c01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b5f6111f461163e565b8054604051636af907fb60e11b8152600481018590529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa15801561123e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112659190810190613411565b519050600481600581111561127c5761127c613366565b1461129c578060405163170cc93360e21b81526004016107349190613598565b5f8381526007830160205260409020546001600160a01b031633146112c15733611198565b5f838152600783016020526040902054610d87906001600160a01b03168461249a565b5f6112ed611607565b5f6112f661163e565b805460405163025a076560e61b815263ffffffff861660048201529192505f916001600160a01b0390911690639681d940906024016020604051808303815f875af1158015611347573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061136b9190613581565b8254604051636af907fb60e11b8152600481018390529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113dc9190810190613411565b90506113e782611b9f565b6113f5575091506114799050565b5f828152600784016020908152604080832054600c870190925290912080546001600160a01b031981169091556001600160a01b039182169116806114375750805b60048351600581111561144c5761144c613366565b0361145b5761145b818561249a565b6114718261146c856040015161110e565b6124c4565b509193505050505b61148f60015f805160206138a983398151915255565b919050565b5f61149d61163e565b54604051631474cbc960e31b815263ffffffff841660048201526001600160a01b039091169063a3a65e48906024016020604051808303815f875af11580156114e8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dda9190613581565b610c4e84848484612068565b610d878383835f6124d7565b5f61152d611607565b611538823334612503565b905061148f60015f805160206138a983398151915255565b61098b848484846124d7565b6001600160a01b03811661158e5760405163caa903f960e01b81526001600160a01b0382166004820152602401610734565b5f61159761163e565b5f8481526008820160205260409020549091506001600160a01b036101009091041633146115c55733611198565b5f928352600a01602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b6115fb61281b565b61160481612866565b50565b5f805160206138a983398151915280546001190161163857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60090565b5f61166b61163e565b5f838152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156116a4576116a4613366565b60038111156116b5576116b5613366565b815281546001600160a01b03610100909104811660208084019190915260018401546040808501919091526002909401546001600160401b038082166060860152600160401b820481166080860152600160801b8204811660a0860152600160c01b9091041660c09093019290925283830151865484516304e0efb360e11b8152945195965090949116926309c1df669260048083019391928290030181865afa158015611765573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061178991906135f6565b82608001516117989190613611565b6001600160401b03164210156117cc5760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b5f848152600884016020908152604080832080546001600160a81b031916815560018101849055600201839055600a8601909152902080546001600160a01b031981169091556001600160a01b031680611827575060208201515b5f806118348388866128e1565b9150915061184d856020015161146c876060015161110e565b6040805183815260208101839052859189917f5ecc5b26a9265302cf871229b3d983e5ca57dbb1448966c6c58b2d3c68bc7f7e910160405180910390a350505050505050565b60015f805160206138a983398151915255565b5f806118b061163e565b8054604051635b73516560e11b8152600481018990529192506001600160a01b03169063b6e6a2ca906024015f604051808303815f87803b1580156118f3575f80fd5b505af1158015611905573d5f803e3d5ffd5b50508254604051636af907fb60e11b8152600481018a90525f93506001600160a01b03909116915063d5f20ff6906024015f60405180830381865afa158015611950573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119779190810190613411565b905061198287611b9f565b61199157600192505050611b97565b5f8781526007830160205260409020546001600160a01b031633146119b65733611198565b5f87815260078301602052604090205460c08201516119e591600160b01b90046001600160401b031690613611565b6001600160401b03168160e001516001600160401b03161015611a2c5760e081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610734565b5f8615611a4457611a3d8887611bc8565b9050611a62565b505f8781526007830160205260409020600101546001600160401b03165b600583015460408301515f916001600160a01b031690634f22429f90611a879061110e565b60c086015160e0808801516040519185901b6001600160e01b031916825260048201939093526001600160401b0391821660248201819052604482015291811660648301528516608482015260a401602060405180830381865afa158015611af1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b159190613581565b90506001600160a01b038616611b41575f8981526007850160205260409020546001600160a01b031695505b5f898152600b8501602052604081208054839290611b60908490613638565b90915550505f898152600c94909401602052604090932080546001600160a01b0319166001600160a01b0387161790555050151590505b949350505050565b5f80611ba961163e565b5f938452600701602052505060409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c13573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c3a919081019061364b565b9150915080611c5c57604051636b2f19e960e01b815260040160405180910390fd5b5f611c6561163e565b6006810154845191925014611c93578251604051636ba589a560e01b81526004810191909152602401610734565b60208301516001600160a01b031615611ccf576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610734565b60208301516001600160a01b031615611d0b576020830151604051624de75d60e31b81526001600160a01b039091166004820152602401610734565b5f8073__$fd0c147b4031eef6079b0498cbafa865f0$__63088c246386604001516040518263ffffffff1660e01b8152600401611d48919061356f565b6040805180830381865af4158015611d62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d8691906134f0565b91509150818814611db45760405163fee3144560e01b81526004810183905260248101899052604401610734565b5f8881526007840160205260409020600101546001600160401b039081169082161115611e45575f888152600784016020908152604091829020600101805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2610d64565b50505f95865260070160205250506040909220600101546001600160401b031692915050565b5f80611e7561163e565b600381015490915061ffff600160401b90910481169086161080611e9e575061271061ffff8616115b15611ec257604051635f12e6c360e11b815261ffff86166004820152602401610734565b60038101546001600160401b039081169085161015611efe576040516202a06d60e11b81526001600160401b0385166004820152602401610734565b8060010154831080611f135750806002015483115b15611f345760405163222d164360e21b815260048101849052602401610734565b825f611f3f82610d8c565b90505f835f015f9054906101000a90046001600160a01b03166001600160a01b031663ed285ae18e8e8e8e8e886040518763ffffffff1660e01b8152600401611f8d96959493929190613757565b6020604051808303815f875af1158015611fa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcd9190613581565b5f818152600786016020908152604080832080546001600160401b039c909c16600160b01b0267ffffffffffffffff60b01b1961ffff9e909e16600160a01b02336001600160b01b0319909e168e17179d909d169c909c178c556001909b01805467ffffffffffffffff19169055600c9096019095529790932080546001600160a01b03191690961790955550939998505050505050505050565b5f8061207261163e565b5f878152600882016020526040808220815160e0810190925280549394509192909190829060ff1660038111156120ab576120ab613366565b60038111156120bc576120bc613366565b8152815461010090046001600160a01b03908116602083015260018301546040808401919091526002909301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b9091041660c0909201919091528282015185549251636af907fb60e11b815260048101829052939450925f929091169063d5f20ff6906024015f60405180830381865afa15801561216d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121949190810190613411565b90506002835160038111156121ab576121ab613366565b146121cc578251604051633b0d540d60e21b8152610734919060040161337a565b60208301516001600160a01b03163314612268575f8281526007850160205260409020546001600160a01b031633146122055733611198565b5f82815260078501602052604090205460c082015161223491600160b01b90046001600160401b031690613611565b6001600160401b03164210156122685760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b60028151600581111561227d5761227d613366565b03612416576003840154608084015161229f916001600160401b031690613611565b6001600160401b03164210156122d35760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610734565b87156122e5576122e38288611bc8565b505b5f8981526008850160205260409020805460ff191660031790558354606084015160a08301516001600160a01b0390921691636610966991859161232991906137ca565b6040516001600160e01b031960e085901b16815260048101929092526001600160401b0316602482015260440160408051808303815f875af1158015612371573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061239591906137ea565b505f8a8152600886016020526040812060020180546001600160401b03909316600160c01b026001600160c01b03909316929092179091556123d884888c61298e565b9050828a7f5abe543af12bb7f76f6fa9daaa9d95d181c5e90566df58d3c012216b6245eeaf60405160405180910390a315159450611b979350505050565b60048151600581111561242b5761242b613366565b036124525761243b83878b61298e565b5061244589611662565b6001945050505050611b97565b805160405163170cc93360e21b81526107349190600401613598565b61247a84848484612068565b61098b57604051631036cf9160e11b815260048101859052602401610734565b5f6124a361163e565b5f838152600b820160205260408120805491905590915061098b8482612be8565b61097b6001600160a01b03831682612c46565b6124e3848484846118a6565b61098b57604051635bff683f60e11b815260048101859052602401610734565b5f8061250d61163e565b90505f61251984610d8c565b8254604051636af907fb60e11b8152600481018990529192505f916001600160a01b039091169063d5f20ff6906024015f60405180830381865afa158015612563573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261258a9190810190613411565b905061259587611b9f565b6125b5576040516330efa98b60e01b815260048101889052602401610734565b6002815160058111156125ca576125ca613366565b146125eb57805160405163170cc93360e21b81526107349190600401613598565b5f828260a001516125fc9190613611565b905083600301600a9054906101000a90046001600160401b031682604001516126259190613816565b6001600160401b0316816001600160401b0316111561266257604051636d51fe0560e11b81526001600160401b0382166004820152602401610734565b8354604051636610966960e01b8152600481018a90526001600160401b03831660248201525f9182916001600160a01b039091169063661096699060440160408051808303815f875af11580156126bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126df91906137ea565b915091505f8a8360405160200161270d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815291815281516020928301205f81815260088b019093529120805491925060019160ff1916828002179055505f8181526008880160209081526040918290208054610100600160a81b0319166101006001600160a01b038f16908102919091178255600182018f9055600290910180546001600160401b038b81166001600160c01b03199092168217600160801b8a8316908102919091176001600160c01b031690935585519283528916938201939093529283019190915260608201849052908c9083907fdf91f7709a30fda3fc5fc5dc97cb5d5b05e67e193dccaaef3cb332d23fda83d19060800160405180910390a496505050505050505b9392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661286457604051631afcd79f60e31b815260040160405180910390fd5b565b61286e61281b565b612876612cd9565b6116046128866020830183613841565b602083013560408401356128a06080860160608701613304565b6128b060a087016080880161385c565b6128c060c0880160a08901613875565b60c08801356128d66101008a0160e08b01613841565b896101000135612ce9565b5f805f6128ec61163e565b5f86815260098201602052604081208054908290559192509081908015612980575f8781526007850160205260409020546127109061293690600160a01b900461ffff16836135df565b61294091906135c0565b91508184600b015f8981526020019081526020015f205f8282546129649190613638565b9091555061297490508282613895565b92506129808984612be8565b509097909650945050505050565b5f8061299861163e565b80546040808801519051636af907fb60e11b81529293505f926001600160a01b039092169163d5f20ff6916129d39160040190815260200190565b5f60405180830381865afa1580156129ed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a149190810190613411565b90505f600382516005811115612a2c57612a2c613366565b1480612a4a5750600482516005811115612a4857612a48613366565b145b15612a5a575060e0810151612a97565b600282516005811115612a6f57612a6f613366565b03612a7b575042612a97565b815160405163170cc93360e21b81526107349190600401613598565b86608001516001600160401b0316816001600160401b031611612abf575f9350505050612814565b600583015460608801515f916001600160a01b031690634f22429f90612ae49061110e565b60c086015160808c01516040808e01515f90815260078b0160205281902060010154905160e086901b6001600160e01b031916815260048101949094526001600160401b0392831660248501529082166044840152818716606484015216608482015260a401602060405180830381865afa158015612b65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b899190613581565b90506001600160a01b038716612ba157876020015196505b5f8681526009850160209081526040808320849055600a90960190529390932080546001600160a01b0388166001600160a01b031990911617905550909150509392505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c34575f80fd5b505af1158015610f72573d5f803e3d5ffd5b80471015612c695760405163cd78605960e01b8152306004820152602401610734565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612cb2576040519150601f19603f3d011682016040523d82523d5f602084013e612cb7565b606091505b5050905080610d8757604051630a12f52160e11b815260040160405180910390fd5b612ce161281b565b612864612f12565b612cf161281b565b5f612cfa61163e565b905061ffff86161580612d12575061271061ffff8716115b15612d3657604051635f12e6c360e11b815261ffff87166004820152602401610734565b87891115612d5a5760405163222d164360e21b8152600481018a9052602401610734565b60ff85161580612d6d5750600a60ff8616115b15612d905760405163170db35960e31b815260ff86166004820152602401610734565b896001600160a01b03166309c1df666040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df091906135f6565b6001600160401b0316876001600160401b03161015612e2c576040516202a06d60e11b81526001600160401b0388166004820152602401610734565b835f03612e4c5760405163a733007160e01b815260040160405180910390fd5b81612e6d57604051632f6bd1db60e01b815260048101839052602401610734565b80546001600160a01b039a8b166001600160a01b031991821617825560018201999099556002810197909755600387018054600160501b60ff9096169590950267ffffffffffffffff60501b1961ffff909716600160401b0269ffffffffffffffffffff199096166001600160401b03909816979097179490941794909416949094179091556004840155600583018054929095169190931617909255600690910155565b61189361281b565b5f6101208284031215612f2b575f80fd5b50919050565b803563ffffffff8116811461148f575f80fd5b5f8060408385031215612f55575f80fd5b82359150612f6560208401612f31565b90509250929050565b8015158114611604575f80fd5b5f805f60608486031215612f8d575f80fd5b833592506020840135612f9f81612f6e565b9150612fad60408501612f31565b90509250925092565b5f60208284031215612fc6575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b038111828210171561300357613003612fcd565b60405290565b60405161010081016001600160401b038111828210171561300357613003612fcd565b604051601f8201601f191681016001600160401b038111828210171561305457613054612fcd565b604052919050565b5f6001600160401b0382111561307457613074612fcd565b50601f01601f191660200190565b5f82601f830112613091575f80fd5b81356130a461309f8261305c565b61302c565b8181528460208386010111156130b8575f80fd5b816020850160208301375f918101602001919091529392505050565b6001600160401b0381168114611604575f80fd5b803561148f816130d4565b6001600160a01b0381168114611604575f80fd5b5f60408284031215613117575f80fd5b61311f612fe1565b905061312a82612f31565b81526020808301356001600160401b0380821115613146575f80fd5b818501915085601f830112613159575f80fd5b81358181111561316b5761316b612fcd565b8060051b915061317c84830161302c565b8181529183018401918481019088841115613195575f80fd5b938501935b838510156131bf57843592506131af836130f3565b828252938501939085019061319a565b808688015250505050505092915050565b803561ffff8116811461148f575f80fd5b5f805f805f805f60e0888a0312156131f7575f80fd5b87356001600160401b038082111561320d575f80fd5b6132198b838c01613082565b985060208a013591508082111561322e575f80fd5b61323a8b838c01613082565b975061324860408b016130e8565b965060608a013591508082111561325d575f80fd5b6132698b838c01613107565b955060808a013591508082111561327e575f80fd5b5061328b8a828b01613107565b93505061329a60a089016131d0565b91506132a860c089016130e8565b905092959891949750929550565b5f805f80608085870312156132c9575f80fd5b8435935060208501356132db81612f6e565b92506132e960408601612f31565b915060608501356132f9816130f3565b939692955090935050565b5f60208284031215613314575f80fd5b8135612814816130d4565b5f8060408385031215613330575f80fd5b823591506020830135613342816130f3565b809150509250929050565b5f6020828403121561335d575f80fd5b61281482612f31565b634e487b7160e01b5f52602160045260245ffd5b602081016004831061338e5761338e613366565b91905290565b80516006811061148f575f80fd5b5f5b838110156133bc5781810151838201526020016133a4565b50505f910152565b5f82601f8301126133d3575f80fd5b81516133e161309f8261305c565b8181528460208386010111156133f5575f80fd5b611b978260208301602087016133a2565b805161148f816130d4565b5f60208284031215613421575f80fd5b81516001600160401b0380821115613437575f80fd5b90830190610100828603121561344b575f80fd5b613453613009565b61345c83613394565b815260208301518281111561346f575f80fd5b61347b878286016133c4565b60208301525061348d60408401613406565b604082015261349e60608401613406565b60608201526134af60808401613406565b60808201526134c060a08401613406565b60a08201526134d160c08401613406565b60c08201526134e260e08401613406565b60e082015295945050505050565b5f8060408385031215613501575f80fd5b825191506020830151613342816130d4565b5f60208284031215613523575f80fd5b81516001600160401b03811115613538575f80fd5b611b97848285016133c4565b5f815180845261355b8160208601602086016133a2565b601f01601f19169290920160200192915050565b602081525f6128146020830184613544565b5f60208284031215613591575f80fd5b5051919050565b602081016006831061338e5761338e613366565b634e487b7160e01b5f52601160045260245ffd5b5f826135da57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610dda57610dda6135ac565b5f60208284031215613606575f80fd5b8151612814816130d4565b6001600160401b03818116838216019080821115613631576136316135ac565b5092915050565b80820180821115610dda57610dda6135ac565b5f806040838503121561365c575f80fd5b82516001600160401b0380821115613672575f80fd5b9084019060608287031215613685575f80fd5b6040516060810181811083821117156136a0576136a0612fcd565b6040528251815260208301516136b5816130f3565b60208201526040830151828111156136cb575f80fd5b6136d7888286016133c4565b604083015250809450505050602083015161334281612f6e565b5f6040830163ffffffff8351168452602080840151604060208701528281518085526060880191506020830194505f92505b8083101561374c5784516001600160a01b03168252938301936001929092019190830190613723565b509695505050505050565b60c081525f61376960c0830189613544565b828103602084015261377b8189613544565b90506001600160401b038088166040850152838203606085015261379f82886136f1565b915083820360808501526137b382876136f1565b925080851660a08501525050979650505050505050565b6001600160401b03828116828216039080821115613631576136316135ac565b5f80604083850312156137fb575f80fd5b8251613806816130d4565b6020939093015192949293505050565b6001600160401b03818116838216028082169190828114613839576138396135ac565b505092915050565b5f60208284031215613851575f80fd5b8135612814816130f3565b5f6020828403121561386c575f80fd5b612814826131d0565b5f60208284031215613885575f80fd5b813560ff81168114612814575f80fd5b81810381811115610dda57610dda6135ac56fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220c66873e57048527d5150963cc971402cacb78e3aba6436ab86d5d44e4c37dff164736f6c63430008190033", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. From ae4ae0bc5f0c7e730d98b172ef38adc7c2337880 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 7 Mar 2025 13:18:26 -0500 Subject: [PATCH 5/5] test remove unmigrated vdr --- .../validator-manager/migrate_from_v1.go | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/tests/flows/validator-manager/migrate_from_v1.go b/tests/flows/validator-manager/migrate_from_v1.go index 353e6d273..84d00f286 100644 --- a/tests/flows/validator-manager/migrate_from_v1.go +++ b/tests/flows/validator-manager/migrate_from_v1.go @@ -179,14 +179,6 @@ func MigrateFromV1PoA(network *localnetwork.LocalNetwork) { Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) - // Migrate already registered validators to the new ValidatorManager version - validatorManager, err := validatormanager.NewValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) - Expect(err).Should(BeNil()) - - opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) - Expect(err).Should(BeNil()) - validatorManager.MigrateFromV1(opts, poaValidationID, 0) - // Deploy StakingManager contract stakingManagerAddress, _ := utils.DeployAndInitializeValidatorManagerSpecialization( ctx, @@ -216,6 +208,10 @@ func MigrateFromV1PoA(network *localnetwork.LocalNetwork) { utils.WaitForTransactionSuccess(context.Background(), l1AInfo, tx.Hash()) // Check that previous validator is still registered + // Migrate already registered validators to the new ValidatorManager version + validatorManager, err := validatormanager.NewValidatorManager(validatorManagerProxy.Address, l1AInfo.RPCClient) + Expect(err).Should(BeNil()) + validationID, err := validatorManager.RegisteredValidators(&bind.CallOpts{}, poaNodeID) Expect(err).Should(BeNil()) Expect(validationID[:]).Should(Equal(poaValidationID[:])) @@ -226,10 +222,35 @@ func MigrateFromV1PoA(network *localnetwork.LocalNetwork) { Expect(subnetID[:]).Should(Equal(l1AInfo.SubnetID[:])) // - // Remove the PoA validator and re-register as a PoS validator + // Attempt to remove the PoA validator before migrating it // posStakingManager, err := istakingmanager.NewIStakingManager(stakingManagerAddress, l1AInfo.RPCClient) Expect(err).Should(BeNil()) + + opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) + Expect(err).Should(BeNil()) + tx, err = posStakingManager.ForceInitiateValidatorRemoval( + opts, + validationID, + false, + 0, + ) + Expect(err.Error()).Should(ContainSubstring("reverted")) + + // + // Migrate the validator + // + + opts, err = bind.NewKeyedTransactorWithChainID(ownerKey, l1AInfo.EVMChainID) + Expect(err).Should(BeNil()) + tx, err = validatorManager.MigrateFromV1(opts, poaValidationID, 0) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, l1AInfo, tx.Hash()) + + // + // Remove the PoA validator and re-register as a PoS validator + // + utils.InitiateAndCompleteEndPoSValidation( ctx, signatureAggregator,