From 5c38855fce5d6249dc51492fc8247ce4b88100fa Mon Sep 17 00:00:00 2001 From: ylg Date: Thu, 3 Sep 2026 10:07:58 -0400 Subject: [PATCH] Bind initializeValidatorSet to the manager configured subnet ID --- .../ValidatorManager/ValidatorManager.go | 4 +- .../validator-manager/ValidatorManager.sol | 13 +++++- .../interfaces/IValidatorManager.sol | 1 + .../tests/ValidatorManagerTests.t.sol | 40 +++++++++++++++++++ 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/abi-bindings/go/validator-manager/ValidatorManager/ValidatorManager.go b/abi-bindings/go/validator-manager/ValidatorManager/ValidatorManager.go index 68575e42a..f5aa00706 100644 --- a/abi-bindings/go/validator-manager/ValidatorManager/ValidatorManager.go +++ b/abi-bindings/go/validator-manager/ValidatorManager/ValidatorManager.go @@ -91,8 +91,8 @@ type ValidatorMessagesValidationPeriod struct { // ValidatorManagerMetaData contains all meta data concerning the ValidatorManager contract. var ValidatorManagerMetaData = &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\":\"uint64\",\"name\":\"churnPeriodLength\",\"type\":\"uint64\"}],\"name\":\"InvalidChurnPeriodLength\",\"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\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPChainOwnerAddresses\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"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\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"CompletedValidatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"CompletedValidatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"CompletedValidatorWeightUpdate\",\"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\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes20\",\"name\":\"nodeID\",\"type\":\"bytes20\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"registrationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitiatedValidatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"validatorWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"InitiatedValidatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"weightUpdateMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitiatedValidatorWeightUpdate\",\"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\":\"bytes20\",\"name\":\"nodeID\",\"type\":\"bytes20\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"RegisteredInitialValidator\",\"type\":\"event\"},{\"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_CHURN_PERIOD_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NODE_ID_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"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\":\"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\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorWeightUpdate\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChurnPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChurnTracker\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"initialWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"totalWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorChurnPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"getNodeValidationID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"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\":\"sentNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"receivedNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"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\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"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\"}],\"name\":\"initiateValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"newWeight\",\"type\":\"uint64\"}],\"name\":\"initiateValidatorWeightUpdate\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isValidatorSetInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1TotalWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"receivedNonce\",\"type\":\"uint32\"}],\"name\":\"migrateFromV1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendValidatorRemovalMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"subnetID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f5ffd5b50604051613dea380380613dea83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f5ffd5b815160028110610125575f5ffd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b613c9d8061014d5f395ff3fe608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c80639681d940116100fe578063bc5fbfec1161009e578063d47a948b1161006e578063d47a948b1461045d578063d5f20ff614610470578063efc008fb146103b8578063f2fde38b14610490575f5ffd5b8063bc5fbfec146103eb578063bee0a03f14610412578063c974d1b614610425578063ce161f141461042d575f5ffd5b8063b6c2fd41116100d9578063b6c2fd41146103b8578063b6e6a2ca146103c2578063b771b3bc146103d5578063bb0b1938146103e3575f5ffd5b80639681d9401461037f5780639cb7624e14610392578063a3a65e48146103a5575f5ffd5b80636610966911610169578063732214f811610144578063732214f814610307578063736c87be1461030e5780638280a25a146103215780638da5cb5b1461033b575f5ffd5b806366109669146102ba57806366edba73146102ec578063715018a6146102ff575f5ffd5b80634d693536116101a45780634d693536146102175780635bd93e881461026f5780635dc1f5351461028757806363e2ca971461029d575f5ffd5b806309c1df66146101ca57806320d91b7a146101ef57806330ffe4d714610204575b5f5ffd5b6101d26104a3565b6040516001600160401b0390911681526020015b60405180910390f35b6102026101fd366004612e38565b6104be565b005b610202610212366004612e82565b610a7f565b61021f610d2a565b604080516001600160401b03948516815260ff90931660208085019190915282518483015282015184166060808501919091529082015184166080840152015190911660a082015260c0016101e6565b610277610db5565b60405190151581526020016101e6565b61028f610dcc565b6040519081526020016101e6565b6102a5601481565b60405163ffffffff90911681526020016101e6565b6102cd6102c8366004612eb7565b610ddb565b604080516001600160401b0390931683526020830191909152016101e6565b6102026102fa366004612ee5565b610e60565b6102026110ea565b61028f5f81565b61020261031c366004612efc565b6110fd565b610329603081565b60405160ff90911681526020016101e6565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016101e6565b61028f61038d366004612f1d565b611209565b61028f6103a036600461311f565b611604565b61028f6103b3366004612f1d565b611624565b6101d26201518081565b6102026103d0366004612ee5565b61181a565b6103676005600160991b0181565b6101d261182e565b61028f7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0081565b610202610420366004612ee5565b611850565b610329601481565b61044061043b366004612f1d565b611970565b604080519283526001600160401b039091166020830152016101e6565b61028f61046b3660046131e8565b611afb565b61048361047e366004612ee5565b611b34565b6040516101e691906132d5565b61020261049e36600461338e565b611cb9565b5f6104ac611cf3565b600101546001600160401b0316919050565b5f6104c7611cf3565b600781015490915060ff16156104f057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610533573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061055791906133a9565b836020013514610585576040516372b0a7e760e11b8152602084013560048201526024015b60405180910390fd5b30610596606085016040860161338e565b6001600160a01b0316146105d9576105b4606084016040850161338e565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161057c565b5f73__$add2235b6a6cf493060b757d4655105486$__634d8478846105fd85611d17565b604001516040518263ffffffff1660e01b815260040161061d91906133c0565b602060405180830381865af4158015610638573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065c91906133a9565b90505f73__$add2235b6a6cf493060b757d4655105486$__6387418b8e866040518263ffffffff1660e01b81526004016106969190613501565b5f60405180830381865af41580156106b0573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106d791908101906135e0565b90505f6002826040516106ea9190613611565b602060405180830381855afa158015610705573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061072891906133a9565b90508281146107545760405163baaea89d60e01b8152600481018290526024810184905260440161057c565b5f610762606088018861362c565b905090505f5f5b828163ffffffff1610156109eb575f61078560608b018b61362c565b8363ffffffff1681811061079b5761079b613671565b90506020028101906107ad9190613685565b6107b690613699565b80516040519192505f9160068b01916107ce91613611565b908152602001604051809103902054146107fe57805160405163a41f772f60e01b815261057c91906004016133c0565b805151601414610824578051604051633e08a12560e11b815261057c91906004016133c0565b5f60028b5f01358460405160200161085392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261086d91613611565b602060405180830381855afa158015610888573d5f5f3e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108ab91906133a9565b90508089600601835f01516040516108c39190613611565b90815260408051918290036020908101909220929092555f83815260088c0190915220805460ff1916600217815582516001909101906109039082613795565b50604082810180515f84815260088d016020529290922060028101805492516001600160401b0394851667ffffffffffffffff60801b90941693909317600160c01b858516021790556003018054429093166001600160801b0319909316929092179091556109729085613863565b8251602001519094508b35906bffffffffffffffffffffffff1916827f070e0f6540afd612d613b71036a6d45f8c5fa97770a7e2d55663d75474ce0c0d85604001516040516109d091906001600160401b0391909116815260200190565b60405180910390a45050806109e490613882565b9050610769565b506003860180546fffffffffffffffff00000000000000001916600160401b6001600160401b0384168102919091179091556001870154606491610a33910460ff16836138a6565b6001600160401b03161015610a6657604051633e1a785160e01b81526001600160401b038216600482015260240161057c565b5050506007909201805460ff1916600117905550505050565b5f610a88611cf3565b5f8481526005820160205260408120919250815460ff166005811115610ab057610ab0613254565b03610ad15760405163089938b360e11b81526004810185905260240161057c565b6002810154600160401b90046001600160401b031663ffffffff84161115610b1457604051632e19bc2d60e11b815263ffffffff8416600482015260240161057c565b6040805161010081019091528154819060ff166005811115610b3857610b38613254565b8152602001826001018054610b4c90613718565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7890613718565b8015610bc35780601f10610b9a57610100808354040283529160200191610bc3565b820191905f5260205f20905b815481529060010190602001808311610ba657829003601f168201915b505050918352505060028301546001600160401b03808216602080850191909152600160401b8304821660408086019190915263ffffffff89166060860152600160801b840483166080860152600160c01b909304821660a0850152600386015490911660c0909301929092525f87815260088601909252902081518154829060ff19166001836005811115610c5b57610c5b613254565b021790555060208201516001820190610c749082613795565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031994851617600160401b9387168402176001600160801b0316600160801b928716929092026001600160c01b031691909117600160c01b918616919091021790925560c08601516003909501805460e09097015195841696909116959095179390911602919091179091555f94855260059290920160205250909120805460ff1916905550565b604080516080810182525f808252602082018190529181018290526060810182905281905f610d57611cf3565b600181015460408051608081018252600284015481526003909301546001600160401b038082166020860152600160401b808304821693860193909352600160801b90910481166060850152821697910460ff169550909350915050565b5f5f610dbf611cf3565b6007015460ff1692915050565b5f610dd5611cf3565b54919050565b5f5f610de5611e2d565b5f610dee611cf3565b905060025f86815260088301602052604090205460ff166005811115610e1657610e16613254565b14610e49575f8581526008820160205260409081902054905163170cc93360e21b815261057c9160ff16906004016138c8565b610e538585611e88565b92509250505b9250929050565b5f610e69611cf3565b5f8381526008820160205260408082208151610100810190925280549394509192909190829060ff166005811115610ea357610ea3613254565b6005811115610eb457610eb4613254565b8152602001600182018054610ec890613718565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef490613718565b8015610f3f5780601f10610f1657610100808354040283529160200191610f3f565b820191905f5260205f20905b815481529060010190602001808311610f2257829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b80830482166040850152600160801b830482166060850152600160c01b9092048116608084015260039384015480821660a0850152919091041660c09091015290915081516005811115610fb757610fb7613254565b14610fea575f8381526008830160205260409081902054905163170cc93360e21b815261057c9160ff16906004016138c8565b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$add2235b6a6cf493060b757d4655105486$__9063854a893f906064015f60405180830381865af4158015611061573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261108891908101906135e0565b6040518263ffffffff1660e01b81526004016110a491906133c0565b6020604051808303815f875af11580156110c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e491906133a9565b50505050565b6110f2611e2d565b6110fb5f612050565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156111415750825b90505f826001600160401b0316600114801561115c5750303b155b90508115801561116a575080155b156111885760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111b257845460ff60401b1916600160401b1785555b6111bb866120c0565b831561120157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f611212611e2d565b5f61121b611cf3565b90505f5f73__$add2235b6a6cf493060b757d4655105486$__63021de88f61124287611d17565b604001516040518263ffffffff1660e01b815260040161126291906133c0565b6040805180830381865af415801561127c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a091906138e5565b9150915080156112c757604051632d07135360e01b8152811515600482015260240161057c565b5f828152600884016020526040808220815161010081019092528054829060ff1660058111156112f9576112f9613254565b600581111561130a5761130a613254565b815260200160018201805461131e90613718565b80601f016020809104026020016040519081016040528092919081815260200182805461134a90613718565b80156113955780601f1061136c57610100808354040283529160200191611395565b820191905f5260205f20905b81548152906001019060200180831161137857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b80830482166040850152600160801b830482166060850152600160c01b9092048116608084015260039384015480821660a0850152919091041660c0909101529091508151600581111561140d5761140d613254565b1415801561142e575060018151600581111561142b5761142b613254565b14155b1561144f57805160405163170cc93360e21b815261057c91906004016138c8565b60038151600581111561146457611464613254565b0361147257600481526114c3565b60a081015160038501805460089061149b908490600160401b90046001600160401b0316613906565b82546001600160401b039182166101009390930a928302919092021990911617905550600581525b8360060181602001516040516114d99190613611565b90815260408051602092819003830190205f908190558581526008870190925290208151815483929190829060ff1916600183600581111561151d5761151d613254565b0217905550602082015160018201906115369082613795565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031994851617600160401b9387168402176001600160801b0316600160801b928716929092026001600160c01b031691909117600160c01b918616919091021790925560c08601516003909501805460e09097015195841696909116959095179390911602919091179091555183907fafaccef7080649a725bc30a35359a257a4a27225be352875c80bdf6b5f04080c905f90a25090925050505b919050565b5f61160d611e2d565b61161a86868686866120e6565b9695505050505050565b5f61162d611e2d565b5f611636611cf3565b90505f5f73__$add2235b6a6cf493060b757d4655105486$__63021de88f61165d87611d17565b604001516040518263ffffffff1660e01b815260040161167d91906133c0565b6040805180830381865af4158015611697573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116bb91906138e5565b91509150806116e157604051632d07135360e01b8152811515600482015260240161057c565b5f828152600484016020526040902080546116fb90613718565b90505f0361171f5760405163089938b360e11b81526004810183905260240161057c565b60015f83815260088501602052604090205460ff16600581111561174557611745613254565b14611778575f8281526008840160205260409081902054905163170cc93360e21b815261057c9160ff16906004016138c8565b5f828152600484016020526040812061179091612dc5565b5f828152600884016020908152604091829020805460ff1916600290811782556003820180546001600160401b0342811667ffffffffffffffff19909216919091179091559101549251600160c01b90930416825283917f967ae87813a3b5f201dd9bcba778d457176eafe6f41facee1c718091d3952d06910160405180910390a2509392505050565b611822611e2d565b61182b816124e3565b50565b5f611837611cf3565b60030154600160401b90046001600160401b0316919050565b5f611859611cf3565b5f838152600482016020526040902080549192509061187790613718565b90505f0361189b5760405163089938b360e11b81526004810183905260240161057c565b60015f83815260088301602052604090205460ff1660058111156118c1576118c1613254565b146118f4575f8281526008820160205260409081902054905163170cc93360e21b815261057c9160ff16906004016138c8565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb9261192b9201613925565b6020604051808303815f875af1158015611947573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196b91906133a9565b505050565b5f5f61197a611e2d565b5f61198484611d17565b90505f5f5f73__$add2235b6a6cf493060b757d4655105486$__6350782b0f85604001516040518263ffffffff1660e01b81526004016119c491906133c0565b606060405180830381865af41580156119df573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a0391906139ac565b9250925092505f611a12611cf3565b5f8581526008820160205260409020600201549091506001600160401b03808516600160401b909204161015611a6657604051632e19bc2d60e11b81526001600160401b038416600482015260240161057c565b5f8481526008820160205260409081902060020180546001600160401b038616600160801b0267ffffffffffffffff60801b199091161790555184907fc917996591802ecedcfced71321d4bb5320f7dfbacf5477dffe1dbf8b8839ff990611ae690869086906001600160401b0392831681529116602082015260400190565b60405180910390a25091945092505050915091565b5f5f611b05611cf3565b9050806006018484604051611b1b9291906139ed565b9081526020016040518091039020549150505b92915050565b60408051610100810182525f8082526060602083018190529282018190529181018290526080810182905260a0810182905260c0810182905260e0810182905290611b7d611cf3565b5f848152600882016020526040908190208151610100810190925280549293509091829060ff166005811115611bb557611bb5613254565b6005811115611bc657611bc6613254565b8152602001600182018054611bda90613718565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0690613718565b8015611c515780601f10611c2857610100808354040283529160200191611c51565b820191905f5260205f20905b815481529060010190602001808311611c3457829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b80830482166040850152600160801b830482166060850152600160c01b9092048116608084015260039093015480841660a08401520490911660c0909101529392505050565b611cc1611e2d565b6001600160a01b038116611cea57604051631e4fbdf760e01b81525f600482015260240161057c565b61182b81612050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0090565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d7b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611da291908101906139fc565b9150915080611dc457604051636b2f19e960e01b815260040160405180910390fd5b815115611dea578151604051636ba589a560e01b8152600481019190915260240161057c565b60208201516001600160a01b031615611e26576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161057c565b5092915050565b33611e5f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146110fb5760405163118cdaa760e01b815233600482015260240161057c565b5f5f5f611e93611cf3565b5f868152600882016020526040902060020154909150600160c01b90046001600160401b0316611ec385826127cd565b5f611ecd87612a3a565b5f88815260088501602052604080822060020180546001600160c01b0316600160c01b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$add2235b6a6cf493060b757d4655105486$__9063854a893f906064015f60405180830381865af4158015611f71573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f9891908101906135e0565b6040518263ffffffff1660e01b8152600401611fb491906133c0565b6020604051808303815f875af1158015611fd0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff491906133a9565b604080516001600160401b038581168252602082018490528a1681830152905191925089917f6e350dd49b060d87f297206fd309234ed43156d890ced0f139ecf704310481d39181900360600190a29097909650945050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6120c8612aa2565b6120dd6120d8602083018361338e565b612aeb565b61182b81612afc565b5f6120ef611cf3565b6007015460ff1661211357604051637fab81e560e01b815260040160405180910390fd5b5f61211c611cf3565b60038101549091506001600160401b039061214290600160401b90048216858316613a8c565b111561216c57604051633e1a785160e01b81526001600160401b038416600482015260240161057c565b61217585612c3b565b61217e84612c3b565b85516030146121a55785516040516326475b2f60e11b815260040161057c91815260200190565b86516014146121c95786604051633e08a12560e11b815260040161057c91906133c0565b5f5f1b81600601886040516121de9190613611565b9081526020016040518091039020541461220d578660405163a41f772f60e01b815260040161057c91906133c0565b612217835f6127cd565b5f6122256201518042613863565b90505f5f73__$add2235b6a6cf493060b757d4655105486$__63eb97ce516040518060e00160405280875f015481526020018d81526020018c8152602001866001600160401b031681526020018b81526020018a8152602001896001600160401b03168152506040518263ffffffff1660e01b81526004016122a79190613b05565b5f60405180830381865af41580156122c1573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122e89190810190613bb4565b90925090505f5f83815260088601602052604090205460ff16600581111561231257612312613254565b14612345575f8281526008850160205260409081902054905163170cc93360e21b815261057c9160ff16906004016138c8565b5f828152600485016020526040902061235e8282613795565b5081846006018b6040516123729190613611565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906123ae9085906004016133c0565b6020604051808303815f875af11580156123ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ee91906133a9565b5f8481526008870160205260409020805460ff191660019081178255919250016124188c82613795565b505f8381526008860160205260409020600281018054600160c01b6001600160401b038b1690810267ffffffffffffffff60801b9092161717905560030180546001600160801b031916905561246f8b6020015190565b6bffffffffffffffffffffffff1916837f5881be437bdcb008bfa5f20e32d3e335ccf8ab90ef2818852a251625260af35d83878b6040516124cc939291909283526001600160401b03918216602084015216604082015260600190565b60405180910390a350909998505050505050505050565b5f6124ec611cf3565b5f8381526008820160205260408082208151610100810190925280549394509192909190829060ff16600581111561252657612526613254565b600581111561253757612537613254565b815260200160018201805461254b90613718565b80601f016020809104026020016040519081016040528092919081815260200182805461257790613718565b80156125c25780601f10612599576101008083540402835291602001916125c2565b820191905f5260205f20905b8154815290600101906020018083116125a557829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b80830482166040860152600160801b830482166060860152600160c01b9092048116608085015260039094015480851660a08501520490921660c0909101529091508151600581111561263a5761263a613254565b1461266d575f8381526008830160205260409081902054905163170cc93360e21b815261057c9160ff16906004016138c8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156126b1576126b1613254565b0217905550602082015160018201906126ca9082613795565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031994851617600160401b9387168402176001600160801b0316600160801b928716929092026001600160c01b031691909117600160c01b918616919091021790925560c08501516003909401805460e090960151948416959091169490941792909116021790555f61276a8482611e88565b915050837fbae388a94e7f18411fe57098f12f418b8e1a8273e0532a90188a3a059b897273828460a00151426040516127bf939291909283526001600160401b03918216602084015216604082015260600190565b60405180910390a250505050565b5f6127d6611cf3565b90505f826001600160401b0316846001600160401b03161115612804576127fd8385613906565b9050612811565b61280e8484613906565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b900490921660608201524291158061287e57506001840154815161287a916001600160401b031690613a8c565b8210155b156128a6576001600160401b03808416606083015282825260408201511660208201526128c5565b82816060018181516128b89190613863565b6001600160401b03169052505b60608101516128d59060646138a6565b602082015160018601546001600160401b0392909216916129009190600160401b900460ff166138a6565b6001600160401b0316101561293957606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161057c565b858160400181815161294b9190613863565b6001600160401b031690525060408101805186919061296b908390613906565b6001600160401b03169052506001840154604082015160649161299991600160401b90910460ff16906138a6565b6001600160401b031610156129d2576040808201519051633e1a785160e01b81526001600160401b03909116600482015260240161057c565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b5f5f612a44611cf3565b5f84815260088281016020526040909120600201805492935091612a7790600160401b90046001600160401b0316613bf8565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166110fb57604051631afcd79f60e31b815260040160405180910390fd5b612af3612aa2565b61182b81612dbd565b612b04612aa2565b5f612b0d611cf3565b6020830135815590506014612b286080840160608501613c19565b60ff161180612b475750612b426080830160608401613c19565b60ff16155b15612b7b57612b5c6080830160608401613c19565b604051634a59bbff60e11b815260ff909116600482015260240161057c565b62015180612b8f6060840160408501613c39565b6001600160401b03161115612bd357612bae6060830160408401613c39565b6040516301f2f3ff60e51b81526001600160401b03909116600482015260240161057c565b612be36080830160608401613c19565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612c146060830160408401613c39565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b805163ffffffff16158015612c54575060208101515115155b15612c8857805160208201515160405163c08a0f1d60e01b815263ffffffff9092166004830152602482015260440161057c565b602081015151815163ffffffff161115612ccb57805160208201515160405163c08a0f1d60e01b815263ffffffff9092166004830152602482015260440161057c565b5f816020015151118015612d0d57505f6001600160a01b031681602001515f81518110612cfa57612cfa613671565b60200260200101516001600160a01b0316145b15612d2b5760405163d92e233d60e01b815260040160405180910390fd5b60015b816020015151811015612db9576020820151612d4b600183613c54565b81518110612d5b57612d5b613671565b60200260200101516001600160a01b031682602001518281518110612d8257612d82613671565b60200260200101516001600160a01b031611612db157604051637882c48760e01b815260040160405180910390fd5b600101612d2e565b5050565b611cc1612aa2565b508054612dd190613718565b5f825580601f10612de0575050565b601f0160209004905f5260205f209081019061182b91905b80821115612e0b575f8155600101612df8565b5090565b5f60808284031215612e1f575f5ffd5b50919050565b803563ffffffff811681146115ff575f5ffd5b5f5f60408385031215612e49575f5ffd5b82356001600160401b03811115612e5e575f5ffd5b612e6a85828601612e0f565b925050612e7960208401612e25565b90509250929050565b5f5f60408385031215612e93575f5ffd5b82359150612e7960208401612e25565b6001600160401b038116811461182b575f5ffd5b5f5f60408385031215612ec8575f5ffd5b823591506020830135612eda81612ea3565b809150509250929050565b5f60208284031215612ef5575f5ffd5b5035919050565b5f60808284031215612f0c575f5ffd5b612f168383612e0f565b9392505050565b5f60208284031215612f2d575f5ffd5b612f1682612e25565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715612f6c57612f6c612f36565b60405290565b604051606081016001600160401b0381118282101715612f6c57612f6c612f36565b604051601f8201601f191681016001600160401b0381118282101715612fbc57612fbc612f36565b604052919050565b5f6001600160401b03821115612fdc57612fdc612f36565b50601f01601f191660200190565b5f82601f830112612ff9575f5ffd5b813561300c61300782612fc4565b612f94565b818152846020838601011115613020575f5ffd5b816020850160208301375f918101602001919091529392505050565b6001600160a01b038116811461182b575f5ffd5b5f60408284031215613060575f5ffd5b613068612f4a565b905061307382612e25565b815260208201356001600160401b0381111561308d575f5ffd5b8201601f8101841361309d575f5ffd5b80356001600160401b038111156130b6576130b6612f36565b8060051b6130c660208201612f94565b918252602081840181019290810190878411156130e1575f5ffd5b6020850194505b8385101561310f57843592506130fd8361303c565b828252602094850194909101906130e8565b6020860152509295945050505050565b5f5f5f5f5f60a08688031215613133575f5ffd5b85356001600160401b03811115613148575f5ffd5b61315488828901612fea565b95505060208601356001600160401b0381111561316f575f5ffd5b61317b88828901612fea565b94505060408601356001600160401b03811115613196575f5ffd5b6131a288828901613050565b93505060608601356001600160401b038111156131bd575f5ffd5b6131c988828901613050565b92505060808601356131da81612ea3565b809150509295509295909350565b5f5f602083850312156131f9575f5ffd5b82356001600160401b0381111561320e575f5ffd5b8301601f8101851361321e575f5ffd5b80356001600160401b03811115613233575f5ffd5b856020828401011115613244575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52602160045260245ffd5b6006811061328457634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b838110156132a257818101518382015260200161328a565b50505f910152565b5f81518084526132c1816020860160208601613288565b601f01601f19169290920160200192915050565b602081526132e7602082018351613268565b5f602083015161010060408401526133036101208401826132aa565b90506001600160401b0360408501511660608401526001600160401b036060850151166080840152608084015161334560a08501826001600160401b03169052565b5060a08401516001600160401b03811660c08501525060c08401516001600160401b03811660e08501525060e08401516001600160401b0381166101008501525b509392505050565b5f6020828403121561339e575f5ffd5b8135612f168161303c565b5f602082840312156133b9575f5ffd5b5051919050565b602081525f612f1660208301846132aa565b5f5f8335601e198436030181126133e7575f5ffd5b83016020810192503590506001600160401b03811115613405575f5ffd5b803603821315610e59575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208501945060208460051b820101835f5b868110156134f557838303601f19018852813536879003605e19018112613477575f5ffd5b860161348381806133d2565b60608652613495606087018284613413565b9150506134a560208301836133d2565b86830360208801526134b8838284613413565b92505050604082013591506134cc82612ea3565b6001600160401b0391909116604094909401939093526020978801979190910190600101613452565b50909695505050505050565b60208082528235828201528201356040808301919091525f908301356135268161303c565b6001600160a01b031660608381019190915283013536849003601e1901811261354d575f5ffd5b83016020810190356001600160401b03811115613568575f5ffd5b8060051b3603821315613579575f5ffd5b60808085015261358d60a08501828461343b565b95945050505050565b5f82601f8301126135a5575f5ffd5b81516135b361300782612fc4565b8181528460208386010111156135c7575f5ffd5b6135d8826020830160208701613288565b949350505050565b5f602082840312156135f0575f5ffd5b81516001600160401b03811115613605575f5ffd5b6135d884828501613596565b5f8251613622818460208701613288565b9190910192915050565b5f5f8335601e19843603018112613641575f5ffd5b8301803591506001600160401b0382111561365a575f5ffd5b6020019150600581901b3603821315610e59575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613622575f5ffd5b5f606082360312156136a9575f5ffd5b6136b1612f72565b82356001600160401b038111156136c6575f5ffd5b6136d236828601612fea565b82525060208301356001600160401b038111156136ed575f5ffd5b6136f936828601612fea565b602083015250604083013561370d81612ea3565b604082015292915050565b600181811c9082168061372c57607f821691505b602082108103612e1f57634e487b7160e01b5f52602260045260245ffd5b601f82111561196b57805f5260205f20601f840160051c8101602085101561376f5750805b601f840160051c820191505b8181101561378e575f815560010161377b565b5050505050565b81516001600160401b038111156137ae576137ae612f36565b6137c2816137bc8454613718565b8461374a565b6020601f8211600181146137f4575f83156137dd5750848201515b5f19600385901b1c1916600184901b17845561378e565b5f84815260208120601f198516915b828110156138235787850151825560209485019460019092019101613803565b508482101561384057868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190811115611b2e57611b2e61384f565b5f63ffffffff821663ffffffff810361389d5761389d61384f565b60010192915050565b6001600160401b038181168382160290811690818114611e2657611e2661384f565b60208101611b2e8284613268565b805180151581146115ff575f5ffd5b5f5f604083850312156138f6575f5ffd5b82519150612e79602084016138d6565b6001600160401b038281168282160390811115611b2e57611b2e61384f565b602081525f5f835461393681613718565b806020860152600182165f81146139545760018114613970576139a1565b60ff1983166040870152604082151560051b87010193506139a1565b865f5260205f205f5b8381101561399857815488820160400152600190910190602001613979565b87016040019450505b509195945050505050565b5f5f5f606084860312156139be575f5ffd5b835160208501519093506139d181612ea3565b60408501519092506139e281612ea3565b809150509250925092565b818382375f9101908152919050565b5f5f60408385031215613a0d575f5ffd5b82516001600160401b03811115613a22575f5ffd5b830160608186031215613a33575f5ffd5b613a3b612f72565b815181526020820151613a4d8161303c565b602082015260408201516001600160401b03811115613a6a575f5ffd5b613a7687828501613596565b6040830152509250612e799050602084016138d6565b80820180821115611b2e57611b2e61384f565b5f6040830163ffffffff83511684526020830151604060208601528181518084526060870191506020830193505f92505b80831015613afb5783516001600160a01b031682526020938401936001939093019290910190613ad0565b5095945050505050565b60208152815160208201525f602083015160e06040840152613b2b6101008401826132aa565b90506040840151601f19848303016060850152613b4882826132aa565b9150506001600160401b0360608501511660808401526080840151601f198483030160a0850152613b798282613a9f565b91505060a0840151601f198483030160c0850152613b978282613a9f565b91505060c084015161338660e08501826001600160401b03169052565b5f5f60408385031215613bc5575f5ffd5b825160208401519092506001600160401b03811115613be2575f5ffd5b613bee85828601613596565b9150509250929050565b5f6001600160401b0382166001600160401b03810361389d5761389d61384f565b5f60208284031215613c29575f5ffd5b813560ff81168114612f16575f5ffd5b5f60208284031215613c49575f5ffd5b8135612f1681612ea3565b81810381811115611b2e57611b2e61384f56fea2646970667358221220b46378bb829d6faf05655bc885e79d1d1f1c94ea46cb0f4a614cd0733b11d49164736f6c634300081e0033", + 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\":\"uint64\",\"name\":\"churnPeriodLength\",\"type\":\"uint64\"}],\"name\":\"InvalidChurnPeriodLength\",\"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\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPChainOwnerAddresses\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"addressesLength\",\"type\":\"uint256\"}],\"name\":\"InvalidPChainOwnerThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"}],\"name\":\"InvalidSubnetID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InvalidTotalWeight\",\"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\":[{\"internalType\":\"bool\",\"name\":\"validRegistration\",\"type\":\"bool\"}],\"name\":\"UnexpectedRegistrationStatus\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"CompletedValidatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"CompletedValidatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"CompletedValidatorWeightUpdate\",\"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\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes20\",\"name\":\"nodeID\",\"type\":\"bytes20\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"registrationMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"registrationExpiry\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitiatedValidatorRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"validatorWeightMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"name\":\"InitiatedValidatorRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"weightUpdateMessageID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"InitiatedValidatorWeightUpdate\",\"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\":\"bytes20\",\"name\":\"nodeID\",\"type\":\"bytes20\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"name\":\"RegisteredInitialValidator\",\"type\":\"event\"},{\"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_CHURN_PERIOD_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NODE_ID_LENGTH\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"P_CHAIN_BLOCKCHAIN_ID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REGISTRATION_EXPIRY_LENGTH\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"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\":\"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\":\"uint32\",\"name\":\"messageIndex\",\"type\":\"uint32\"}],\"name\":\"completeValidatorWeightUpdate\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChurnPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChurnTracker\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"initialWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"totalWeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"churnAmount\",\"type\":\"uint64\"}],\"internalType\":\"structValidatorChurnPeriod\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"}],\"name\":\"getNodeValidationID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"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\":\"sentNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"receivedNonce\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"startTime\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"endTime\",\"type\":\"uint64\"}],\"internalType\":\"structValidator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\"}],\"internalType\":\"structValidatorManagerSettings\",\"name\":\"settings\",\"type\":\"tuple\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"subnetID\",\"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\":[{\"internalType\":\"bytes\",\"name\":\"nodeID\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"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\"}],\"name\":\"initiateValidatorRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"initiateValidatorRemoval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"newWeight\",\"type\":\"uint64\"}],\"name\":\"initiateValidatorWeightUpdate\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isValidatorSetInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1TotalWeight\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"receivedNonce\",\"type\":\"uint32\"}],\"name\":\"migrateFromV1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendRegisterValidatorMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"validationID\",\"type\":\"bytes32\"}],\"name\":\"resendValidatorRemovalMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"subnetID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f5ffd5b50604051613e0f380380613e0f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f5ffd5b815160028110610125575f5ffd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b613cc28061014d5f395ff3fe608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c80639681d940116100fe578063bc5fbfec1161009e578063d47a948b1161006e578063d47a948b1461045d578063d5f20ff614610470578063efc008fb146103b8578063f2fde38b14610490575f5ffd5b8063bc5fbfec146103eb578063bee0a03f14610412578063c974d1b614610425578063ce161f141461042d575f5ffd5b8063b6c2fd41116100d9578063b6c2fd41146103b8578063b6e6a2ca146103c2578063b771b3bc146103d5578063bb0b1938146103e3575f5ffd5b80639681d9401461037f5780639cb7624e14610392578063a3a65e48146103a5575f5ffd5b80636610966911610169578063732214f811610144578063732214f814610307578063736c87be1461030e5780638280a25a146103215780638da5cb5b1461033b575f5ffd5b806366109669146102ba57806366edba73146102ec578063715018a6146102ff575f5ffd5b80634d693536116101a45780634d693536146102175780635bd93e881461026f5780635dc1f5351461028757806363e2ca971461029d575f5ffd5b806309c1df66146101ca57806320d91b7a146101ef57806330ffe4d714610204575b5f5ffd5b6101d26104a3565b6040516001600160401b0390911681526020015b60405180910390f35b6102026101fd366004612e5d565b6104be565b005b610202610212366004612ea7565b610aa4565b61021f610d4f565b604080516001600160401b03948516815260ff90931660208085019190915282518483015282015184166060808501919091529082015184166080840152015190911660a082015260c0016101e6565b610277610dda565b60405190151581526020016101e6565b61028f610df1565b6040519081526020016101e6565b6102a5601481565b60405163ffffffff90911681526020016101e6565b6102cd6102c8366004612edc565b610e00565b604080516001600160401b0390931683526020830191909152016101e6565b6102026102fa366004612f0a565b610e85565b61020261110f565b61028f5f81565b61020261031c366004612f21565b611122565b610329603081565b60405160ff90911681526020016101e6565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016101e6565b61028f61038d366004612f42565b61122e565b61028f6103a0366004613144565b611629565b61028f6103b3366004612f42565b611649565b6101d26201518081565b6102026103d0366004612f0a565b61183f565b6103676005600160991b0181565b6101d2611853565b61028f7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0081565b610202610420366004612f0a565b611875565b610329601481565b61044061043b366004612f42565b611995565b604080519283526001600160401b039091166020830152016101e6565b61028f61046b36600461320d565b611b20565b61048361047e366004612f0a565b611b59565b6040516101e691906132fa565b61020261049e3660046133b3565b611cde565b5f6104ac611d18565b600101546001600160401b0316919050565b5f6104c7611d18565b600781015490915060ff16156104f057604051637fab81e560e01b815260040160405180910390fd5b805483351461051a57604051639828ebff60e01b8152833560048201526024015b60405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561055d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061058191906133ce565b8360200135146105aa576040516372b0a7e760e11b815260208401356004820152602401610511565b306105bb60608501604086016133b3565b6001600160a01b0316146105fe576105d960608401604085016133b3565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610511565b5f73__$add2235b6a6cf493060b757d4655105486$__634d84788461062285611d3c565b604001516040518263ffffffff1660e01b815260040161064291906133e5565b602060405180830381865af415801561065d573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061068191906133ce565b90505f73__$add2235b6a6cf493060b757d4655105486$__6387418b8e866040518263ffffffff1660e01b81526004016106bb9190613526565b5f60405180830381865af41580156106d5573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106fc9190810190613605565b90505f60028260405161070f9190613636565b602060405180830381855afa15801561072a573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061074d91906133ce565b90508281146107795760405163baaea89d60e01b81526004810182905260248101849052604401610511565b5f6107876060880188613651565b905090505f5f5b828163ffffffff161015610a10575f6107aa60608b018b613651565b8363ffffffff168181106107c0576107c0613696565b90506020028101906107d291906136aa565b6107db906136be565b80516040519192505f9160068b01916107f391613636565b9081526020016040518091039020541461082357805160405163a41f772f60e01b815261051191906004016133e5565b805151601414610849578051604051633e08a12560e11b815261051191906004016133e5565b5f60028b5f01358460405160200161087892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261089291613636565b602060405180830381855afa1580156108ad573d5f5f3e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108d091906133ce565b90508089600601835f01516040516108e89190613636565b90815260408051918290036020908101909220929092555f83815260088c0190915220805460ff19166002178155825160019091019061092890826137ba565b50604082810180515f84815260088d016020529290922060028101805492516001600160401b0394851667ffffffffffffffff60801b90941693909317600160c01b858516021790556003018054429093166001600160801b0319909316929092179091556109979085613888565b8251602001519094508b35906bffffffffffffffffffffffff1916827f070e0f6540afd612d613b71036a6d45f8c5fa97770a7e2d55663d75474ce0c0d85604001516040516109f591906001600160401b0391909116815260200190565b60405180910390a4505080610a09906138a7565b905061078e565b506003860180546fffffffffffffffff00000000000000001916600160401b6001600160401b0384168102919091179091556001870154606491610a58910460ff16836138cb565b6001600160401b03161015610a8b57604051633e1a785160e01b81526001600160401b0382166004820152602401610511565b5050506007909201805460ff1916600117905550505050565b5f610aad611d18565b5f8481526005820160205260408120919250815460ff166005811115610ad557610ad5613279565b03610af65760405163089938b360e11b815260048101859052602401610511565b6002810154600160401b90046001600160401b031663ffffffff84161115610b3957604051632e19bc2d60e11b815263ffffffff84166004820152602401610511565b6040805161010081019091528154819060ff166005811115610b5d57610b5d613279565b8152602001826001018054610b719061373d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9d9061373d565b8015610be85780601f10610bbf57610100808354040283529160200191610be8565b820191905f5260205f20905b815481529060010190602001808311610bcb57829003601f168201915b505050918352505060028301546001600160401b03808216602080850191909152600160401b8304821660408086019190915263ffffffff89166060860152600160801b840483166080860152600160c01b909304821660a0850152600386015490911660c0909301929092525f87815260088601909252902081518154829060ff19166001836005811115610c8057610c80613279565b021790555060208201516001820190610c9990826137ba565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031994851617600160401b9387168402176001600160801b0316600160801b928716929092026001600160c01b031691909117600160c01b918616919091021790925560c08601516003909501805460e09097015195841696909116959095179390911602919091179091555f94855260059290920160205250909120805460ff1916905550565b604080516080810182525f808252602082018190529181018290526060810182905281905f610d7c611d18565b600181015460408051608081018252600284015481526003909301546001600160401b038082166020860152600160401b808304821693860193909352600160801b90910481166060850152821697910460ff169550909350915050565b5f5f610de4611d18565b6007015460ff1692915050565b5f610dfa611d18565b54919050565b5f5f610e0a611e52565b5f610e13611d18565b905060025f86815260088301602052604090205460ff166005811115610e3b57610e3b613279565b14610e6e575f8581526008820160205260409081902054905163170cc93360e21b81526105119160ff16906004016138ed565b610e788585611ead565b92509250505b9250929050565b5f610e8e611d18565b5f8381526008820160205260408082208151610100810190925280549394509192909190829060ff166005811115610ec857610ec8613279565b6005811115610ed957610ed9613279565b8152602001600182018054610eed9061373d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f199061373d565b8015610f645780601f10610f3b57610100808354040283529160200191610f64565b820191905f5260205f20905b815481529060010190602001808311610f4757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b80830482166040850152600160801b830482166060850152600160c01b9092048116608084015260039384015480821660a0850152919091041660c09091015290915081516005811115610fdc57610fdc613279565b1461100f575f8381526008830160205260409081902054905163170cc93360e21b81526105119160ff16906004016138ed565b606081015160405163854a893f60e01b8152600481018590526001600160401b0390911660248201525f60448201526005600160991b019063ee5b48eb9073__$add2235b6a6cf493060b757d4655105486$__9063854a893f906064015f60405180830381865af4158015611086573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110ad9190810190613605565b6040518263ffffffff1660e01b81526004016110c991906133e5565b6020604051808303815f875af11580156110e5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110991906133ce565b50505050565b611117611e52565b6111205f612075565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156111665750825b90505f826001600160401b031660011480156111815750303b155b90508115801561118f575080155b156111ad5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156111d757845460ff60401b1916600160401b1785555b6111e0866120e5565b831561122657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f611237611e52565b5f611240611d18565b90505f5f73__$add2235b6a6cf493060b757d4655105486$__63021de88f61126787611d3c565b604001516040518263ffffffff1660e01b815260040161128791906133e5565b6040805180830381865af41580156112a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c5919061390a565b9150915080156112ec57604051632d07135360e01b81528115156004820152602401610511565b5f828152600884016020526040808220815161010081019092528054829060ff16600581111561131e5761131e613279565b600581111561132f5761132f613279565b81526020016001820180546113439061373d565b80601f016020809104026020016040519081016040528092919081815260200182805461136f9061373d565b80156113ba5780601f10611391576101008083540402835291602001916113ba565b820191905f5260205f20905b81548152906001019060200180831161139d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b80830482166040850152600160801b830482166060850152600160c01b9092048116608084015260039384015480821660a0850152919091041660c0909101529091508151600581111561143257611432613279565b14158015611453575060018151600581111561145057611450613279565b14155b1561147457805160405163170cc93360e21b815261051191906004016138ed565b60038151600581111561148957611489613279565b0361149757600481526114e8565b60a08101516003850180546008906114c0908490600160401b90046001600160401b031661392b565b82546001600160401b039182166101009390930a928302919092021990911617905550600581525b8360060181602001516040516114fe9190613636565b90815260408051602092819003830190205f908190558581526008870190925290208151815483929190829060ff1916600183600581111561154257611542613279565b02179055506020820151600182019061155b90826137ba565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031994851617600160401b9387168402176001600160801b0316600160801b928716929092026001600160c01b031691909117600160c01b918616919091021790925560c08601516003909501805460e09097015195841696909116959095179390911602919091179091555183907fafaccef7080649a725bc30a35359a257a4a27225be352875c80bdf6b5f04080c905f90a25090925050505b919050565b5f611632611e52565b61163f868686868661210b565b9695505050505050565b5f611652611e52565b5f61165b611d18565b90505f5f73__$add2235b6a6cf493060b757d4655105486$__63021de88f61168287611d3c565b604001516040518263ffffffff1660e01b81526004016116a291906133e5565b6040805180830381865af41580156116bc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e0919061390a565b915091508061170657604051632d07135360e01b81528115156004820152602401610511565b5f828152600484016020526040902080546117209061373d565b90505f036117445760405163089938b360e11b815260048101839052602401610511565b60015f83815260088501602052604090205460ff16600581111561176a5761176a613279565b1461179d575f8281526008840160205260409081902054905163170cc93360e21b81526105119160ff16906004016138ed565b5f82815260048401602052604081206117b591612dea565b5f828152600884016020908152604091829020805460ff1916600290811782556003820180546001600160401b0342811667ffffffffffffffff19909216919091179091559101549251600160c01b90930416825283917f967ae87813a3b5f201dd9bcba778d457176eafe6f41facee1c718091d3952d06910160405180910390a2509392505050565b611847611e52565b61185081612508565b50565b5f61185c611d18565b60030154600160401b90046001600160401b0316919050565b5f61187e611d18565b5f838152600482016020526040902080549192509061189c9061373d565b90505f036118c05760405163089938b360e11b815260048101839052602401610511565b60015f83815260088301602052604090205460ff1660058111156118e6576118e6613279565b14611919575f8281526008820160205260409081902054905163170cc93360e21b81526105119160ff16906004016138ed565b5f8281526004808301602052604091829020915163ee5b48eb60e01b81526005600160991b019263ee5b48eb92611950920161394a565b6020604051808303815f875af115801561196c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061199091906133ce565b505050565b5f5f61199f611e52565b5f6119a984611d3c565b90505f5f5f73__$add2235b6a6cf493060b757d4655105486$__6350782b0f85604001516040518263ffffffff1660e01b81526004016119e991906133e5565b606060405180830381865af4158015611a04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2891906139d1565b9250925092505f611a37611d18565b5f8581526008820160205260409020600201549091506001600160401b03808516600160401b909204161015611a8b57604051632e19bc2d60e11b81526001600160401b0384166004820152602401610511565b5f8481526008820160205260409081902060020180546001600160401b038616600160801b0267ffffffffffffffff60801b199091161790555184907fc917996591802ecedcfced71321d4bb5320f7dfbacf5477dffe1dbf8b8839ff990611b0b90869086906001600160401b0392831681529116602082015260400190565b60405180910390a25091945092505050915091565b5f5f611b2a611d18565b9050806006018484604051611b40929190613a12565b9081526020016040518091039020549150505b92915050565b60408051610100810182525f8082526060602083018190529282018190529181018290526080810182905260a0810182905260c0810182905260e0810182905290611ba2611d18565b5f848152600882016020526040908190208151610100810190925280549293509091829060ff166005811115611bda57611bda613279565b6005811115611beb57611beb613279565b8152602001600182018054611bff9061373d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2b9061373d565b8015611c765780601f10611c4d57610100808354040283529160200191611c76565b820191905f5260205f20905b815481529060010190602001808311611c5957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b80830482166040850152600160801b830482166060850152600160c01b9092048116608084015260039093015480841660a08401520490911660c0909101529392505050565b611ce6611e52565b6001600160a01b038116611d0f57604051631e4fbdf760e01b81525f6004820152602401610511565b61185081612075565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0090565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611da0573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dc79190810190613a21565b9150915080611de957604051636b2f19e960e01b815260040160405180910390fd5b815115611e0f578151604051636ba589a560e01b81526004810191909152602401610511565b60208201516001600160a01b031615611e4b576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610511565b5092915050565b33611e847f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146111205760405163118cdaa760e01b8152336004820152602401610511565b5f5f5f611eb8611d18565b5f868152600882016020526040902060020154909150600160c01b90046001600160401b0316611ee885826127f2565b5f611ef287612a5f565b5f88815260088501602052604080822060020180546001600160c01b0316600160c01b6001600160401b038c811691820292909217909255915163854a893f60e01b8152600481018c905291841660248301526044820152919250906005600160991b019063ee5b48eb9073__$add2235b6a6cf493060b757d4655105486$__9063854a893f906064015f60405180830381865af4158015611f96573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fbd9190810190613605565b6040518263ffffffff1660e01b8152600401611fd991906133e5565b6020604051808303815f875af1158015611ff5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201991906133ce565b604080516001600160401b038581168252602082018490528a1681830152905191925089917f6e350dd49b060d87f297206fd309234ed43156d890ced0f139ecf704310481d39181900360600190a29097909650945050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6120ed612ac7565b6121026120fd60208301836133b3565b612b10565b61185081612b21565b5f612114611d18565b6007015460ff1661213857604051637fab81e560e01b815260040160405180910390fd5b5f612141611d18565b60038101549091506001600160401b039061216790600160401b90048216858316613ab1565b111561219157604051633e1a785160e01b81526001600160401b0384166004820152602401610511565b61219a85612c60565b6121a384612c60565b85516030146121ca5785516040516326475b2f60e11b815260040161051191815260200190565b86516014146121ee5786604051633e08a12560e11b815260040161051191906133e5565b5f5f1b81600601886040516122039190613636565b90815260200160405180910390205414612232578660405163a41f772f60e01b815260040161051191906133e5565b61223c835f6127f2565b5f61224a6201518042613888565b90505f5f73__$add2235b6a6cf493060b757d4655105486$__63eb97ce516040518060e00160405280875f015481526020018d81526020018c8152602001866001600160401b031681526020018b81526020018a8152602001896001600160401b03168152506040518263ffffffff1660e01b81526004016122cc9190613b2a565b5f60405180830381865af41580156122e6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261230d9190810190613bd9565b90925090505f5f83815260088601602052604090205460ff16600581111561233757612337613279565b1461236a575f8281526008850160205260409081902054905163170cc93360e21b81526105119160ff16906004016138ed565b5f828152600485016020526040902061238382826137ba565b5081846006018b6040516123979190613636565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906123d39085906004016133e5565b6020604051808303815f875af11580156123ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061241391906133ce565b5f8481526008870160205260409020805460ff1916600190811782559192500161243d8c826137ba565b505f8381526008860160205260409020600281018054600160c01b6001600160401b038b1690810267ffffffffffffffff60801b9092161717905560030180546001600160801b03191690556124948b6020015190565b6bffffffffffffffffffffffff1916837f5881be437bdcb008bfa5f20e32d3e335ccf8ab90ef2818852a251625260af35d83878b6040516124f1939291909283526001600160401b03918216602084015216604082015260600190565b60405180910390a350909998505050505050505050565b5f612511611d18565b5f8381526008820160205260408082208151610100810190925280549394509192909190829060ff16600581111561254b5761254b613279565b600581111561255c5761255c613279565b81526020016001820180546125709061373d565b80601f016020809104026020016040519081016040528092919081815260200182805461259c9061373d565b80156125e75780601f106125be576101008083540402835291602001916125e7565b820191905f5260205f20905b8154815290600101906020018083116125ca57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b80830482166040860152600160801b830482166060860152600160c01b9092048116608085015260039094015480851660a08501520490921660c0909101529091508151600581111561265f5761265f613279565b14612692575f8381526008830160205260409081902054905163170cc93360e21b81526105119160ff16906004016138ed565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156126d6576126d6613279565b0217905550602082015160018201906126ef90826137ba565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031994851617600160401b9387168402176001600160801b0316600160801b928716929092026001600160c01b031691909117600160c01b918616919091021790925560c08501516003909401805460e090960151948416959091169490941792909116021790555f61278f8482611ead565b915050837fbae388a94e7f18411fe57098f12f418b8e1a8273e0532a90188a3a059b897273828460a00151426040516127e4939291909283526001600160401b03918216602084015216604082015260600190565b60405180910390a250505050565b5f6127fb611d18565b90505f826001600160401b0316846001600160401b0316111561282957612822838561392b565b9050612836565b612833848461392b565b90505b60408051608081018252600284015480825260038501546001600160401b038082166020850152600160401b8204811694840194909452600160801b90049092166060820152429115806128a357506001840154815161289f916001600160401b031690613ab1565b8210155b156128cb576001600160401b03808416606083015282825260408201511660208201526128ea565b82816060018181516128dd9190613888565b6001600160401b03169052505b60608101516128fa9060646138cb565b602082015160018601546001600160401b0392909216916129259190600160401b900460ff166138cb565b6001600160401b0316101561295e57606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610511565b85816040018181516129709190613888565b6001600160401b031690525060408101805186919061299090839061392b565b6001600160401b0316905250600184015460408201516064916129be91600160401b90910460ff16906138cb565b6001600160401b031610156129f7576040808201519051633e1a785160e01b81526001600160401b039091166004820152602401610511565b8051600285015560208101516003909401805460408301516060909301516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b0319909316919097161717919091169390931790925550505050565b5f5f612a69611d18565b5f84815260088281016020526040909120600201805492935091612a9c90600160401b90046001600160401b0316613c1d565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661112057604051631afcd79f60e31b815260040160405180910390fd5b612b18612ac7565b61185081612de2565b612b29612ac7565b5f612b32611d18565b6020830135815590506014612b4d6080840160608501613c3e565b60ff161180612b6c5750612b676080830160608401613c3e565b60ff16155b15612ba057612b816080830160608401613c3e565b604051634a59bbff60e11b815260ff9091166004820152602401610511565b62015180612bb46060840160408501613c5e565b6001600160401b03161115612bf857612bd36060830160408401613c5e565b6040516301f2f3ff60e51b81526001600160401b039091166004820152602401610511565b612c086080830160608401613c3e565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612c396060830160408401613c5e565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b805163ffffffff16158015612c79575060208101515115155b15612cad57805160208201515160405163c08a0f1d60e01b815263ffffffff90921660048301526024820152604401610511565b602081015151815163ffffffff161115612cf057805160208201515160405163c08a0f1d60e01b815263ffffffff90921660048301526024820152604401610511565b5f816020015151118015612d3257505f6001600160a01b031681602001515f81518110612d1f57612d1f613696565b60200260200101516001600160a01b0316145b15612d505760405163d92e233d60e01b815260040160405180910390fd5b60015b816020015151811015612dde576020820151612d70600183613c79565b81518110612d8057612d80613696565b60200260200101516001600160a01b031682602001518281518110612da757612da7613696565b60200260200101516001600160a01b031611612dd657604051637882c48760e01b815260040160405180910390fd5b600101612d53565b5050565b611ce6612ac7565b508054612df69061373d565b5f825580601f10612e05575050565b601f0160209004905f5260205f209081019061185091905b80821115612e30575f8155600101612e1d565b5090565b5f60808284031215612e44575f5ffd5b50919050565b803563ffffffff81168114611624575f5ffd5b5f5f60408385031215612e6e575f5ffd5b82356001600160401b03811115612e83575f5ffd5b612e8f85828601612e34565b925050612e9e60208401612e4a565b90509250929050565b5f5f60408385031215612eb8575f5ffd5b82359150612e9e60208401612e4a565b6001600160401b0381168114611850575f5ffd5b5f5f60408385031215612eed575f5ffd5b823591506020830135612eff81612ec8565b809150509250929050565b5f60208284031215612f1a575f5ffd5b5035919050565b5f60808284031215612f31575f5ffd5b612f3b8383612e34565b9392505050565b5f60208284031215612f52575f5ffd5b612f3b82612e4a565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b0381118282101715612f9157612f91612f5b565b60405290565b604051606081016001600160401b0381118282101715612f9157612f91612f5b565b604051601f8201601f191681016001600160401b0381118282101715612fe157612fe1612f5b565b604052919050565b5f6001600160401b0382111561300157613001612f5b565b50601f01601f191660200190565b5f82601f83011261301e575f5ffd5b813561303161302c82612fe9565b612fb9565b818152846020838601011115613045575f5ffd5b816020850160208301375f918101602001919091529392505050565b6001600160a01b0381168114611850575f5ffd5b5f60408284031215613085575f5ffd5b61308d612f6f565b905061309882612e4a565b815260208201356001600160401b038111156130b2575f5ffd5b8201601f810184136130c2575f5ffd5b80356001600160401b038111156130db576130db612f5b565b8060051b6130eb60208201612fb9565b91825260208184018101929081019087841115613106575f5ffd5b6020850194505b83851015613134578435925061312283613061565b8282526020948501949091019061310d565b6020860152509295945050505050565b5f5f5f5f5f60a08688031215613158575f5ffd5b85356001600160401b0381111561316d575f5ffd5b6131798882890161300f565b95505060208601356001600160401b03811115613194575f5ffd5b6131a08882890161300f565b94505060408601356001600160401b038111156131bb575f5ffd5b6131c788828901613075565b93505060608601356001600160401b038111156131e2575f5ffd5b6131ee88828901613075565b92505060808601356131ff81612ec8565b809150509295509295909350565b5f5f6020838503121561321e575f5ffd5b82356001600160401b03811115613233575f5ffd5b8301601f81018513613243575f5ffd5b80356001600160401b03811115613258575f5ffd5b856020828401011115613269575f5ffd5b6020919091019590945092505050565b634e487b7160e01b5f52602160045260245ffd5b600681106132a957634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b838110156132c75781810151838201526020016132af565b50505f910152565b5f81518084526132e68160208601602086016132ad565b601f01601f19169290920160200192915050565b6020815261330c60208201835161328d565b5f602083015161010060408401526133286101208401826132cf565b90506001600160401b0360408501511660608401526001600160401b036060850151166080840152608084015161336a60a08501826001600160401b03169052565b5060a08401516001600160401b03811660c08501525060c08401516001600160401b03811660e08501525060e08401516001600160401b0381166101008501525b509392505050565b5f602082840312156133c3575f5ffd5b8135612f3b81613061565b5f602082840312156133de575f5ffd5b5051919050565b602081525f612f3b60208301846132cf565b5f5f8335601e1984360301811261340c575f5ffd5b83016020810192503590506001600160401b0381111561342a575f5ffd5b803603821315610e7e575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8383855260208501945060208460051b820101835f5b8681101561351a57838303601f19018852813536879003605e1901811261349c575f5ffd5b86016134a881806133f7565b606086526134ba606087018284613438565b9150506134ca60208301836133f7565b86830360208801526134dd838284613438565b92505050604082013591506134f182612ec8565b6001600160401b0391909116604094909401939093526020978801979190910190600101613477565b50909695505050505050565b60208082528235828201528201356040808301919091525f9083013561354b81613061565b6001600160a01b031660608381019190915283013536849003601e19018112613572575f5ffd5b83016020810190356001600160401b0381111561358d575f5ffd5b8060051b360382131561359e575f5ffd5b6080808501526135b260a085018284613460565b95945050505050565b5f82601f8301126135ca575f5ffd5b81516135d861302c82612fe9565b8181528460208386010111156135ec575f5ffd5b6135fd8260208301602087016132ad565b949350505050565b5f60208284031215613615575f5ffd5b81516001600160401b0381111561362a575f5ffd5b6135fd848285016135bb565b5f82516136478184602087016132ad565b9190910192915050565b5f5f8335601e19843603018112613666575f5ffd5b8301803591506001600160401b0382111561367f575f5ffd5b6020019150600581901b3603821315610e7e575f5ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613647575f5ffd5b5f606082360312156136ce575f5ffd5b6136d6612f97565b82356001600160401b038111156136eb575f5ffd5b6136f73682860161300f565b82525060208301356001600160401b03811115613712575f5ffd5b61371e3682860161300f565b602083015250604083013561373281612ec8565b604082015292915050565b600181811c9082168061375157607f821691505b602082108103612e4457634e487b7160e01b5f52602260045260245ffd5b601f82111561199057805f5260205f20601f840160051c810160208510156137945750805b601f840160051c820191505b818110156137b3575f81556001016137a0565b5050505050565b81516001600160401b038111156137d3576137d3612f5b565b6137e7816137e1845461373d565b8461376f565b6020601f821160018114613819575f83156138025750848201515b5f19600385901b1c1916600184901b1784556137b3565b5f84815260208120601f198516915b828110156138485787850151825560209485019460019092019101613828565b508482101561386557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190811115611b5357611b53613874565b5f63ffffffff821663ffffffff81036138c2576138c2613874565b60010192915050565b6001600160401b038181168382160290811690818114611e4b57611e4b613874565b60208101611b53828461328d565b80518015158114611624575f5ffd5b5f5f6040838503121561391b575f5ffd5b82519150612e9e602084016138fb565b6001600160401b038281168282160390811115611b5357611b53613874565b602081525f5f835461395b8161373d565b806020860152600182165f81146139795760018114613995576139c6565b60ff1983166040870152604082151560051b87010193506139c6565b865f5260205f205f5b838110156139bd5781548882016040015260019091019060200161399e565b87016040019450505b509195945050505050565b5f5f5f606084860312156139e3575f5ffd5b835160208501519093506139f681612ec8565b6040850151909250613a0781612ec8565b809150509250925092565b818382375f9101908152919050565b5f5f60408385031215613a32575f5ffd5b82516001600160401b03811115613a47575f5ffd5b830160608186031215613a58575f5ffd5b613a60612f97565b815181526020820151613a7281613061565b602082015260408201516001600160401b03811115613a8f575f5ffd5b613a9b878285016135bb565b6040830152509250612e9e9050602084016138fb565b80820180821115611b5357611b53613874565b5f6040830163ffffffff83511684526020830151604060208601528181518084526060870191506020830193505f92505b80831015613b205783516001600160a01b031682526020938401936001939093019290910190613af5565b5095945050505050565b60208152815160208201525f602083015160e06040840152613b506101008401826132cf565b90506040840151601f19848303016060850152613b6d82826132cf565b9150506001600160401b0360608501511660808401526080840151601f198483030160a0850152613b9e8282613ac4565b91505060a0840151601f198483030160c0850152613bbc8282613ac4565b91505060c08401516133ab60e08501826001600160401b03169052565b5f5f60408385031215613bea575f5ffd5b825160208401519092506001600160401b03811115613c07575f5ffd5b613c13858286016135bb565b9150509250929050565b5f6001600160401b0382166001600160401b0381036138c2576138c2613874565b5f60208284031215613c4e575f5ffd5b813560ff81168114612f3b575f5ffd5b5f60208284031215613c6e575f5ffd5b8135612f3b81612ec8565b81810381811115611b5357611b5361387456fea264697066735822122020ba7b261216452b7d0ebbccf8e40d7d0a5297424763eeed98802e465f4652de64736f6c634300081e0033", } // ValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/icm-contracts/avalanche/validator-manager/ValidatorManager.sol b/icm-contracts/avalanche/validator-manager/ValidatorManager.sol index fc0517639..93afe3f28 100644 --- a/icm-contracts/avalanche/validator-manager/ValidatorManager.sol +++ b/icm-contracts/avalanche/validator-manager/ValidatorManager.sol @@ -214,8 +214,17 @@ contract ValidatorManager is IValidatorManager, Initializable, OwnableUpgradeabl revert InvalidInitializationStatus(); } - // Check that the blockchainID and validator manager address in the ConversionData correspond to this contract. - // Other validation checks are done by the P-Chain when converting the L1, so are not required here. + // Check that the subnetID, blockchainID and validator manager address in the ConversionData + // correspond to this contract. Other validation checks are done by the P-Chain when converting + // the L1, so are not required here. + // + // The subnetID check is required because the P-Chain places no restriction on which + // (blockchainID, address) pair a subnet names as its manager: anyone can convert their own + // subnet naming this contract, and the resulting SubnetToL1ConversionMessage would otherwise + // pass every check below with an attacker-chosen initial validator set. + if (conversionData.subnetID != $._subnetID) { + revert InvalidSubnetID(conversionData.subnetID); + } if (conversionData.validatorManagerBlockchainID != WARP_MESSENGER.getBlockchainID()) { revert InvalidValidatorManagerBlockchainID(conversionData.validatorManagerBlockchainID); } diff --git a/icm-contracts/avalanche/validator-manager/interfaces/IValidatorManager.sol b/icm-contracts/avalanche/validator-manager/interfaces/IValidatorManager.sol index c53b3215d..a2eedd3f1 100644 --- a/icm-contracts/avalanche/validator-manager/interfaces/IValidatorManager.sol +++ b/icm-contracts/avalanche/validator-manager/interfaces/IValidatorManager.sol @@ -16,6 +16,7 @@ interface IValidatorManager is IACP99Manager { error InvalidValidatorManagerAddress(address validatorManagerAddress); error InvalidWarpOriginSenderAddress(address senderAddress); error InvalidValidatorManagerBlockchainID(bytes32 blockchainID); + error InvalidSubnetID(bytes32 subnetID); error InvalidWarpSourceChainID(bytes32 sourceChainID); error InvalidInitializationStatus(); error InvalidMaximumChurnPercentage(uint8 maximumChurnPercentage); diff --git a/icm-contracts/avalanche/validator-manager/tests/ValidatorManagerTests.t.sol b/icm-contracts/avalanche/validator-manager/tests/ValidatorManagerTests.t.sol index 78e8ef1c4..a11752344 100644 --- a/icm-contracts/avalanche/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/icm-contracts/avalanche/validator-manager/tests/ValidatorManagerTests.t.sol @@ -387,6 +387,46 @@ abstract contract ValidatorManagerTest is Test { manager.initializeValidatorSet(conversionData, 0); } + // The P-Chain lets any subnet name an arbitrary (blockchainID, address) pair as its manager, so a + // conversion of an unrelated subnet naming this contract is a genuinely signed P-Chain message. + // It must not be accepted as this manager's initial validator set. + function testInitializeValidatorSetForeignSubnet() public { + vm.prank(address(0x123)); + IACP99Manager manager = _setUp(); + + bytes32 foreignSubnetID = + bytes32(hex"8765432187654321876543218765432187654321876543218765432187654321"); + ConversionData memory conversionData = _defaultConversionData(); + conversionData.subnetID = foreignSubnetID; + + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getBlockchainID.selector), + abi.encode(DEFAULT_SOURCE_BLOCKCHAIN_ID) + ); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: validatorManager.P_CHAIN_BLOCKCHAIN_ID(), + originSenderAddress: address(0), + payload: ValidatorMessages.packSubnetToL1ConversionMessage( + sha256(ValidatorMessages.packConversionData(conversionData)) + ) + }), + true + ) + ); + + vm.expectRevert( + abi.encodeWithSelector(IValidatorManager.InvalidSubnetID.selector, foreignSubnetID) + ); + manager.initializeValidatorSet(conversionData, 0); + + assertFalse(validatorManager.isValidatorSetInitialized()); + } + function testRemoveValidatorTotalWeight5() public { // Use prank here, because otherwise each test will end up with a different contract address, leading to a different subnet conversion hash. vm.prank(address(0x123));