From 885b8d9bc73031f54e39ff91e06283bb954e3fbc Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 14:32:12 -0400 Subject: [PATCH] Fix tests --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 9 +-- contracts/staking/ValidatorManager.sol | 24 +++---- .../tests/PoSValidatorManagerTests.t.sol | 72 +++++++++---------- .../staking/tests/ValidatorManagerTests.t.sol | 4 +- 7 files changed, 57 insertions(+), 58 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b4f86a79c..a8021b75f 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516146a83803806146a883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61455b8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610246578063a3a65e4814610259578063b771b3bc1461026c578063ba3a4b9714610292578063bee0a03f146102a5575f80fd5b806366435abf146101fa57806376f786211461020d578063872fda641461022057806398f3e2b414610233575f80fd5b80632e2194d8116100d95780632e2194d814610196578063467ef06f146101c15780635297fae6146101d457806362065856146101e7575f80fd5b80630118acc41461010a5780630322ed981461011f5780630cdd09851461013257806327f39ca814610183575b5f80fd5b61011d610118366004613bce565b6102b8565b005b61011d61012d366004613c09565b610722565b610170610140366004613c09565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61011d610191366004613c34565b610862565b6101a96101a4366004613c09565b610946565b6040516001600160401b03909116815260200161017a565b61011d6101cf366004613c71565b61095c565b61011d6101e2366004613c8a565b610cc5565b6101706101f5366004613cc8565b610e95565b6101a9610208366004613c09565b610eae565b61011d61021b366004613bce565b610ec2565b61017061022e366004613d73565b610ee2565b61011d610241366004613c8a565b610f07565b610170610254366004613e0f565b611086565b61011d610267366004613c71565b611099565b61027a6005600160991b0181565b6040516001600160a01b03909116815260200161017a565b61011d6102a0366004613c09565b611256565b61011d6102b3366004613c09565b6114e2565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206144af83398151915291841561030a5761030782856115f1565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561033c5761033c613e2f565b600481111561034d5761034d613e2f565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103d4576103d4613e2f565b146104265760405162461bcd60e51b815260206004820152602a60248201525f805160206144cf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461048b5760405162461bcd60e51b815260206004820152603360248201525f805160206144cf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161041d565b5f6104958461188d565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104e2576104e2613e2f565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105b485611901565b905082606001516001600160401b03168160a001516001600160401b03161161062b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161041d565b5f83606001518260a001516106409190613e57565b905061064c8682611a12565b5f6005600160991b0163ee5b48eb610665898786611a5a565b6040518263ffffffff1660e01b81526004016106819190613ea0565b6020604051808303815f875af115801561069d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c19190613ed2565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061452f83398151915260205260409020545f805160206144ef8339815191529060039060ff16600581111561076257610762613e2f565b146107c75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161041d565b5f8281526006820160205260408120600301546107ef9084906001600160401b031683611a5a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061081c908490600401613ea0565b6020604051808303815f875af1158015610838573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085c9190613ed2565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806108ab575080546001600160401b03808416911610155b156108c95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556108f48484611c77565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f61095664e8d4a5100083613efd565b92915050565b5f805160206144ef8339815191525f61097483611c95565b90505f806109858360400151611e76565b9150915080156109ea5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161041d565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610a1c57610a1c613e2f565b6005811115610a2d57610a2d613e2f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610ab457610ab4613e2f565b1480610ad25750600182516005811115610ad057610ad0613e2f565b145b610b315760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161041d565b600382516005811115610b4657610b46613e2f565b03610b5357506004610b57565b5060055b6020808301515f90815260078801909152604081205581816005811115610b8057610b80613e2f565b90816005811115610b9357610b93613e2f565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610bc757610bc7613e2f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610c9257610c92613e2f565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206144af8339815191525f610cdd84611c95565b90505f80610cee8360400151612017565b50915091505f610cfd83611901565b9050816001600160401b031681608001516001600160401b03161015610d355760405162461bcd60e51b815260040161041d90613f10565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610d7a5760405162461bcd60e51b815260040161041d90613f52565b60015f87815260038701602052604090205460ff166004811115610da057610da0613e2f565b14610e095760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161041d565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109566001600160401b03831664e8d4a51000613f9b565b5f610eb882611901565b60a0015192915050565b8115610ed457610ed283826115f1565b505b610edd83612252565b505050565b5f80610eed866125f0565b9050610efb8582868661269d565b9150505b949350505050565b5f805160206144af8339815191525f610f1f84611c95565b90505f80610f308360400151612017565b50915091505f610f3f83611901565b9050816001600160401b031681608001516001600160401b03161015610f775760405162461bcd60e51b815260040161041d90613f10565b5f8681526003808701602052604090912001546001600160401b0380841691161115610fb55760405162461bcd60e51b815260040161041d90613f52565b60035f87815260038701602052604090205460ff166004811115610fdb57610fdb613e2f565b1461102f5760405162461bcd60e51b815260206004820152603160248201525f805160206144cf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161041d565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611092833384612af2565b9392505050565b5f805160206144ef8339815191525f6110b183611c95565b90505f806110c28360400151611e76565b91509150806111245760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161041d565b5f8281526005850160205260408120805461113e90613fb2565b9050118015611170575060015f83815260068601602052604090205460ff16600581111561116e5761116e613e2f565b145b61118c5760405162461bcd60e51b815260040161041d90613fea565b5f82815260058501602052604081206111a491613b5f565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f805160206144af83398151915293929190829060ff1660048111156112b7576112b7613e2f565b60048111156112c8576112c8613e2f565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff16600481111561136057611360613e2f565b146113c05760405162461bcd60e51b815260206004820152603860248201525f805160206144cf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161041d565b5f6113ce8260400151611901565b905080608001516001600160401b03165f036114525760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb61147f846040015184608001518560a00151611a5a565b6040518263ffffffff1660e01b815260040161149b9190613ea0565b6020604051808303815f875af11580156114b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114db9190613ed2565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144ef83398151915292919061152a90613fb2565b905011801561155c575060015f83815260068301602052604090205460ff16600581111561155a5761155a613e2f565b145b6115785760405162461bcd60e51b815260040161041d90613fea565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115b19190600401614031565b6020604051808303815f875af11580156115cd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd9190613ed2565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561163c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261166391908101906140c6565b91509150806116c65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161041d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611709573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172d9190613ed2565b8251146117915760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161041d565b60208201516001600160a01b0316156118075760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161041d565b5f806118168460400151612e64565b915091508187146118835760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161041d565b9695505050505050565b5f8181525f8051602061452f8339815191526020526040812060030180545f805160206144ef833981519152916001600160401b03909116908190846118d283614198565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061452f83398151915290528390208351918201909352825491925f805160206144ef83398151915292829060ff16600581111561198957611989613e2f565b600581111561199a5761199a613e2f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061452f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ad357611a938160016141bd565b611a9e906008613f9b565b5081515f90839083908110611ab557611ab56141d0565b60200101906001600160f81b03191690815f1a905350600101611a7f565b505f5b6004811015611b3657611aea8160036141bd565b611af5906008613f9b565b6001901c60f81b82611b088360026141e4565b81518110611b1857611b186141d0565b60200101906001600160f81b03191690815f1a905350600101611ad6565b505f5b6020811015611b9857611b4d81601f6141bd565b611b58906008613f9b565b86901c60f81b82611b6a8360066141e4565b81518110611b7a57611b7a6141d0565b60200101906001600160f81b03191690815f1a905350600101611b39565b505f5b6008811015611c0357611baf8160076141bd565b611bba906008613f9b565b6001600160401b038616901c60f81b82611bd58360266141e4565b81518110611be557611be56141d0565b60200101906001600160f81b03191690815f1a905350600101611b9b565b505f5b6008811015611c6e57611c1a8160076141bd565b611c25906008613f9b565b6001600160401b038516901c60f81b82611c4083602e6141e4565b81518110611c5057611c506141d0565b60200101906001600160f81b03191690815f1a905350600101611c06565b50949350505050565b611c7f61303c565b611c8882613087565b611c91816130cd565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206144ef8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d0a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d3191908101906140c6565b9150915080611d985760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161041d565b8254825114611dfb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161041d565b60208201516001600160a01b031615611e6e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161041d565b509392505050565b5f808251602714611e995760405162461bcd60e51b815260040161041d906141f7565b5f805b6002811015611ee857611eb08160016141bd565b611ebb906008613f9b565b61ffff16858281518110611ed157611ed16141d0565b016020015160f81c901b9190911790600101611e9c565b5061ffff811615611f0b5760405162461bcd60e51b815260040161041d90614240565b5f805b6004811015611f6657611f228160036141bd565b611f2d906008613f9b565b63ffffffff1686611f3f8360026141e4565b81518110611f4f57611f4f6141d0565b016020015160f81c901b9190911790600101611f0e565b5063ffffffff8116600214611f8d5760405162461bcd60e51b815260040161041d90614283565b5f805b6020811015611fe257611fa481601f6141bd565b611faf906008613f9b565b87611fbb8360066141e4565b81518110611fcb57611fcb6141d0565b016020015160f81c901b9190911790600101611f90565b505f86602681518110611ff757611ff76141d0565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461203b5760405162461bcd60e51b815260040161041d906141f7565b5f805b600281101561208a576120528160016141bd565b61205d906008613f9b565b61ffff16868281518110612073576120736141d0565b016020015160f81c901b919091179060010161203e565b5061ffff8116156120ad5760405162461bcd60e51b815260040161041d90614240565b5f805b6004811015612108576120c48160036141bd565b6120cf906008613f9b565b63ffffffff16876120e18360026141e4565b815181106120f1576120f16141d0565b016020015160f81c901b91909117906001016120b0565b5063ffffffff811660031461212f5760405162461bcd60e51b815260040161041d90614283565b5f805b60208110156121845761214681601f6141bd565b612151906008613f9b565b8861215d8360066141e4565b8151811061216d5761216d6141d0565b016020015160f81c901b9190911790600101612132565b505f805b60088110156121e35761219c8160076141bd565b6121a7906008613f9b565b6001600160401b0316896121bc8360266141e4565b815181106121cc576121cc6141d0565b016020015160f81c901b9190911790600101612188565b505f805b6008811015612242576121fb8160076141bd565b612206906008613f9b565b6001600160401b03168a61221b83602e6141e4565b8151811061222b5761222b6141d0565b016020015160f81c901b91909117906001016121e7565b5091989097509095509350505050565b5f8181525f8051602061452f83398151915260205260408082208151610100810190925280545f805160206144ef83398151915293929190829060ff1660058111156122a0576122a0613e2f565b60058111156122b1576122b1613e2f565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561233957612339613e2f565b146123955760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161041d565b60408101516001600160a01b0316336001600160a01b03161461240f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161041d565b61241c8160a00151613181565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561246057612460613e2f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61252c846125268161188d565b5f611a5a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061255b908590600401613ea0565b6020604051808303815f875af1158015612577573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259b9190613ed2565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206144af8339815191528161260984613322565b90505f61261582610946565b83549091506001600160401b0382161080159061263f57508260010154816001600160401b031611155b610eff5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161041d565b5f6126a6613358565b5f805160206144ef833981519152426001600160401b0385161180156126e057506001600160401b0384166126de426202a3006141e4565b115b6127425760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161041d565b856127995760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161041d565b5f868152600782016020526040902054156128075760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161041d565b825160301461286e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161041d565b61287785613181565b5f806128be6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061338f565b5f828152600586016020526040902091935091506128dc828261430e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612909908590600401613ea0565b6020604051808303815f875af1158015612925573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129499190613ed2565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156129cb576129cb613e2f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a8c8361188d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610eff60015f8051602061450f83398151915255565b5f612afb613358565b5f612b086101a484613322565b90505f805160206144af8339815191525f612b2287611901565b9050600281516005811115612b3957612b39613e2f565b14612b985760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161041d565b5f838260a00151612ba991906143cd565b9050612bb58882611a12565b5f612bbf8961188d565b90505f898983604051602001612c079392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612c2886613181565b5f6005600160991b0163ee5b48eb612c418d8688611a5a565b6040518263ffffffff1660e01b8152600401612c5d9190613ea0565b6020604051808303815f875af1158015612c79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c9d9190613ed2565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612d2557612d25613e2f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061109260015f8051602061450f83398151915255565b5f808251602e14612e875760405162461bcd60e51b815260040161041d906141f7565b5f805b6002811015612ed657612e9e8160016141bd565b612ea9906008613f9b565b61ffff16858281518110612ebf57612ebf6141d0565b016020015160f81c901b9190911790600101612e8a565b5061ffff811615612ef95760405162461bcd60e51b815260040161041d90614240565b5f805b6004811015612f5457612f108160036141bd565b612f1b906008613f9b565b63ffffffff1686612f2d8360026141e4565b81518110612f3d57612f3d6141d0565b016020015160f81c901b9190911790600101612efc565b5063ffffffff8116600414612f7b5760405162461bcd60e51b815260040161041d90614283565b5f805b6020811015612fd057612f9281601f6141bd565b612f9d906008613f9b565b87612fa98360066141e4565b81518110612fb957612fb96141d0565b016020015160f81c901b9190911790600101612f7e565b505f805b600881101561302f57612fe88160076141bd565b612ff3906008613f9b565b6001600160401b0316886130088360266141e4565b81518110613018576130186141d0565b016020015160f81c901b9190911790600101612fd4565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661308557604051631afcd79f60e31b815260040160405180910390fd5b565b61308f61303c565b61309881613747565b6130ca606082013560808301356130b560c0850160a08601613cc8565b6130c560e0860160c087016143ed565b613768565b50565b6130d561303c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161041d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144ef8339815191529060ff165f036131bf575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061320790836141bd565b10613223576001600160401b0384166040830152808252613242565b838260400181815161323591906143cd565b6001600160401b03169052505b5f8260200151836040015160646132599190614408565b6132639190614433565b600285015490915060ff90811690821611156132de5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161041d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610956827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906137c3565b5f8051602061450f83398151915280546001190161338957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146133f95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161041d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613470576134308160016141bd565b61343b906008613f9b565b5081515f90839083908110613452576134526141d0565b60200101906001600160f81b03191690815f1a90535060010161341c565b505f5b60048110156134ce576134878160036141bd565b613492906008613f9b565b505f826134a08360026141e4565b815181106134b0576134b06141d0565b60200101906001600160f81b03191690815f1a905350600101613473565b505f5b602081101561352b57845181602081106134ed576134ed6141d0565b1a60f81b826134fd8360066141e4565b8151811061350d5761350d6141d0565b60200101906001600160f81b03191690815f1a9053506001016134d1565b505f5b602081101561358b578460200151816020811061354d5761354d6141d0565b1a60f81b8261355d8360266141e4565b8151811061356d5761356d6141d0565b60200101906001600160f81b03191690815f1a90535060010161352e565b505f5b60088110156135ff576135a28160076141bd565b6135ad906008613f9b565b60ff1685604001516001600160401b0316901c60f81b828260466135d191906141e4565b815181106135e1576135e16141d0565b60200101906001600160f81b03191690815f1a90535060010161358e565b505f5b603081101561366a5784608001518181518110613621576136216141d0565b01602001516001600160f81b0319168261363c83604e6141e4565b8151811061364c5761364c6141d0565b60200101906001600160f81b03191690815f1a905350600101613602565b505f5b60088110156136dc576136818160076141bd565b61368c906008613f9b565b60608601516001600160401b0390811691161c60f81b826136ae83607e6141e4565b815181106136be576136be6141d0565b60200101906001600160f81b03191690815f1a90535060010161366d565b506002816040516136ed9190614458565b602060405180830381855afa158015613708573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061372b9190613ed2565b94909350915050565b60015f8051602061450f83398151915255565b61374f61303c565b613757613925565b61375f613935565b6130ca8161393d565b61377061303c565b5f5f805160206144af833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613809573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061382d9190613ed2565b90506138446001600160a01b0385163330866139a9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613888573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138ac9190613ed2565b90508181116139125760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161041d565b61391c82826141bd565b95945050505050565b61392d61303c565b613085613a03565b61308561303c565b61394561303c565b80355f805160206144ef83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561398f6060830160408401614473565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261085c908590613a0b565b61373461303c565b5f613a1f6001600160a01b03841683613a6c565b905080515f14158015613a43575080806020019051810190613a419190614493565b155b15610edd57604051635274afe760e01b81526001600160a01b038416600482015260240161041d565b606061109283835f845f80856001600160a01b03168486604051613a909190614458565b5f6040518083038185875af1925050503d805f8114613aca576040519150601f19603f3d011682016040523d82523d5f602084013e613acf565b606091505b5091509150611883868383606082613aef57613aea82613b36565b611092565b8151158015613b0657506001600160a01b0384163b155b15613b2f57604051639996b31560e01b81526001600160a01b038516600482015260240161041d565b5080611092565b805115613b465780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613b6b90613fb2565b5f825580601f10613b7a575050565b601f0160209004905f5260205f20908101906130ca91905b80821115613ba5575f8155600101613b92565b5090565b80151581146130ca575f80fd5b803563ffffffff81168114613bc9575f80fd5b919050565b5f805f60608486031215613be0575f80fd5b833592506020840135613bf281613ba9565b9150613c0060408501613bb6565b90509250925092565b5f60208284031215613c19575f80fd5b5035919050565b6001600160a01b03811681146130ca575f80fd5b5f80828403610100811215613c47575f80fd5b60e0811215613c54575f80fd5b5082915060e0830135613c6681613c20565b809150509250929050565b5f60208284031215613c81575f80fd5b61109282613bb6565b5f8060408385031215613c9b575f80fd5b613ca483613bb6565b946020939093013593505050565b80356001600160401b0381168114613bc9575f80fd5b5f60208284031215613cd8575f80fd5b61109282613cb2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d1757613d17613ce1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d4557613d45613ce1565b604052919050565b5f6001600160401b03821115613d6557613d65613ce1565b50601f01601f191660200190565b5f805f8060808587031215613d86575f80fd5b8435935060208501359250613d9d60408601613cb2565b915060608501356001600160401b03811115613db7575f80fd5b8501601f81018713613dc7575f80fd5b8035613dda613dd582613d4d565b613d1d565b818152886020838501011115613dee575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613e20575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e7757613e77613e43565b5092915050565b5f5b83811015613e98578181015183820152602001613e80565b50505f910152565b602081525f8251806020840152613ebe816040850160208701613e7e565b601f01601f19169190910160400192915050565b5f60208284031215613ee2575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f0b57613f0b613ee9565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761095657610956613e43565b600181811c90821680613fc657607f821691505b602082108103613fe457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461404381613fb2565b806020870152604060018084165f81146140645760018114614080576140ad565b60ff19851660408a0152604084151560051b8a010195506140ad565b895f5260205f205f5b858110156140a45781548b8201860152908301908801614089565b8a016040019650505b509398975050505050505050565b8051613bc981613ba9565b5f80604083850312156140d7575f80fd5b82516001600160401b03808211156140ed575f80fd5b9084019060608287031215614100575f80fd5b614108613cf5565b8251815260208084015161411b81613c20565b82820152604084015183811115614130575f80fd5b80850194505087601f850112614144575f80fd5b83519250614154613dd584613d4d565b8381528882858701011115614167575f80fd5b61417684838301848801613e7e565b8060408401525081955061418b8188016140bb565b9450505050509250929050565b5f6001600160401b038083168181036141b3576141b3613e43565b6001019392505050565b8181038181111561095657610956613e43565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561095657610956613e43565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610edd57805f5260205f20601f840160051c810160208510156142ef5750805b601f840160051c820191505b818110156114db575f81556001016142fb565b81516001600160401b0381111561432757614327613ce1565b61433b816143358454613fb2565b846142ca565b602080601f83116001811461436e575f84156143575750858301515b5f19600386901b1c1916600185901b1785556143c5565b5f85815260208120601f198616915b8281101561439c5788860151825594840194600190910190840161437d565b50858210156143b957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115613e7757613e77613e43565b5f602082840312156143fd575f80fd5b813561109281613c20565b6001600160401b0381811683821602808216919082811461442b5761442b613e43565b505092915050565b5f6001600160401b038084168061444c5761444c613ee9565b92169190910492915050565b5f8251614469818460208701613e7e565b9190910192915050565b5f60208284031215614483575f80fd5b813560ff81168114611092575f80fd5b5f602082840312156144a3575f80fd5b815161109281613ba956fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161473138038061473183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145e48061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610246578063a3a65e4814610259578063b771b3bc1461026c578063ba3a4b9714610292578063bee0a03f146102a5575f80fd5b806366435abf146101fa57806376f786211461020d578063872fda641461022057806398f3e2b414610233575f80fd5b80632e2194d8116100d95780632e2194d814610196578063467ef06f146101c15780635297fae6146101d457806362065856146101e7575f80fd5b80630118acc41461010a5780630322ed981461011f5780630cdd09851461013257806327f39ca814610183575b5f80fd5b61011d610118366004613c57565b6102b8565b005b61011d61012d366004613c92565b610722565b610170610140366004613c92565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61011d610191366004613cbd565b6108f2565b6101a96101a4366004613c92565b6109d6565b6040516001600160401b03909116815260200161017a565b61011d6101cf366004613cfa565b6109ec565b61011d6101e2366004613d13565b610d55565b6101706101f5366004613d51565b610f25565b6101a9610208366004613c92565b610f3e565b61011d61021b366004613c57565b610f52565b61017061022e366004613dfc565b610f72565b61011d610241366004613d13565b610f97565b610170610254366004613e98565b611116565b61011d610267366004613cfa565b611129565b61027a6005600160991b0181565b6040516001600160a01b03909116815260200161017a565b61011d6102a0366004613c92565b6112e6565b61011d6102b3366004613c92565b611573565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061453883398151915291841561030a576103078285611682565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561033c5761033c613eb8565b600481111561034d5761034d613eb8565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103d4576103d4613eb8565b146104265760405162461bcd60e51b815260206004820152602a60248201525f805160206145588339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461048b5760405162461bcd60e51b815260206004820152603360248201525f805160206145588339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161041d565b5f6104958461191e565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104e2576104e2613eb8565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105b4856119a0565b905082606001516001600160401b03168160a001516001600160401b03161161062b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161041d565b5f83606001518260a001516106409190613ee0565b905061064c8682611ab1565b5f6005600160991b0163ee5b48eb610665898786611af9565b6040518263ffffffff1660e01b81526004016106819190613f29565b6020604051808303815f875af115801561069d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c19190613f5b565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206145b883398151915260205260408082208151610100810190925280545f8051602061457883398151915293929190829060ff16600581111561077057610770613eb8565b600581111561078157610781613eb8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561080657610806613eb8565b1461086b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb6108908584608001515f611af9565b6040518263ffffffff1660e01b81526004016108ac9190613f29565b6020604051808303815f875af11580156108c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ec9190613f5b565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061093b575080546001600160401b03808416911610155b156109595760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109848484611d16565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109e664e8d4a5100083613f86565b92915050565b5f805160206145788339815191525f610a0483611d34565b90505f80610a158360400151611f15565b915091508015610a7a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161041d565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610aac57610aac613eb8565b6005811115610abd57610abd613eb8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b4457610b44613eb8565b1480610b625750600182516005811115610b6057610b60613eb8565b145b610bc15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161041d565b600382516005811115610bd657610bd6613eb8565b03610be357506004610be7565b5060055b6020808301515f90815260078801909152604081205581816005811115610c1057610c10613eb8565b90816005811115610c2357610c23613eb8565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610c5757610c57613eb8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d2257610d22613eb8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145388339815191525f610d6d84611d34565b90505f80610d7e83604001516120b6565b50915091505f610d8d836119a0565b9050816001600160401b031681608001516001600160401b03161015610dc55760405162461bcd60e51b815260040161041d90613f99565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e0a5760405162461bcd60e51b815260040161041d90613fdb565b60015f87815260038701602052604090205460ff166004811115610e3057610e30613eb8565b14610e995760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161041d565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109e66001600160401b03831664e8d4a51000614024565b5f610f48826119a0565b60a0015192915050565b8115610f6457610f628382611682565b505b610f6d836122f1565b505050565b5f80610f7d8661268f565b9050610f8b8582868661273c565b9150505b949350505050565b5f805160206145388339815191525f610faf84611d34565b90505f80610fc083604001516120b6565b50915091505f610fcf836119a0565b9050816001600160401b031681608001516001600160401b031610156110075760405162461bcd60e51b815260040161041d90613f99565b5f8681526003808701602052604090912001546001600160401b03808416911611156110455760405162461bcd60e51b815260040161041d90613fdb565b60035f87815260038701602052604090205460ff16600481111561106b5761106b613eb8565b146110bf5760405162461bcd60e51b815260206004820152603160248201525f805160206145588339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161041d565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611122833384612b7b565b9392505050565b5f805160206145788339815191525f61114183611d34565b90505f806111528360400151611f15565b91509150806111b45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161041d565b5f828152600585016020526040812080546111ce9061403b565b9050118015611200575060015f83815260068601602052604090205460ff1660058111156111fe576111fe613eb8565b145b61121c5760405162461bcd60e51b815260040161041d90614073565b5f828152600585016020526040812061123491613be8565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061453883398151915293929190829060ff16600481111561134757611347613eb8565b600481111561135857611358613eb8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156113df576113df613eb8565b14806113fd57506003815160048111156113fb576113fb613eb8565b145b6114515760405162461bcd60e51b815260206004820152603260248201525f80516020614558833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161041d565b5f61145f82604001516119a0565b905080608001516001600160401b03165f036114e35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb611510846040015184608001518560a00151611af9565b6040518263ffffffff1660e01b815260040161152c9190613f29565b6020604051808303815f875af1158015611548573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156c9190613f5b565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145788339815191529291906115bb9061403b565b90501180156115ed575060015f83815260068301602052604090205460ff1660058111156115eb576115eb613eb8565b145b6116095760405162461bcd60e51b815260040161041d90614073565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161164291906004016140ba565b6020604051808303815f875af115801561165e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6d9190613f5b565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156116cd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116f4919081019061414f565b91509150806117575760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161041d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117be9190613f5b565b8251146118225760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161041d565b60208201516001600160a01b0316156118985760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161041d565b5f806118a78460400151612eed565b915091508187146119145760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161041d565b9695505050505050565b5f8181525f805160206145b88339815191526020526040812060030180545f80516020614578833981519152916001600160401b03909116908361196183614221565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206145b883398151915290528390208351918201909352825491925f8051602061457883398151915292829060ff166005811115611a2857611a28613eb8565b6005811115611a3957611a39613eb8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145b8833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b7257611b32816001614246565b611b3d906008614024565b5081515f90839083908110611b5457611b54614259565b60200101906001600160f81b03191690815f1a905350600101611b1e565b505f5b6004811015611bd557611b89816003614246565b611b94906008614024565b6001901c60f81b82611ba783600261426d565b81518110611bb757611bb7614259565b60200101906001600160f81b03191690815f1a905350600101611b75565b505f5b6020811015611c3757611bec81601f614246565b611bf7906008614024565b86901c60f81b82611c0983600661426d565b81518110611c1957611c19614259565b60200101906001600160f81b03191690815f1a905350600101611bd8565b505f5b6008811015611ca257611c4e816007614246565b611c59906008614024565b6001600160401b038616901c60f81b82611c7483602661426d565b81518110611c8457611c84614259565b60200101906001600160f81b03191690815f1a905350600101611c3a565b505f5b6008811015611d0d57611cb9816007614246565b611cc4906008614024565b6001600160401b038516901c60f81b82611cdf83602e61426d565b81518110611cef57611cef614259565b60200101906001600160f81b03191690815f1a905350600101611ca5565b50949350505050565b611d1e6130c5565b611d2782613110565b611d3081613156565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206145788339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611da9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dd0919081019061414f565b9150915080611e375760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161041d565b8254825114611e9a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161041d565b60208201516001600160a01b031615611f0d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161041d565b509392505050565b5f808251602714611f385760405162461bcd60e51b815260040161041d90614280565b5f805b6002811015611f8757611f4f816001614246565b611f5a906008614024565b61ffff16858281518110611f7057611f70614259565b016020015160f81c901b9190911790600101611f3b565b5061ffff811615611faa5760405162461bcd60e51b815260040161041d906142c9565b5f805b600481101561200557611fc1816003614246565b611fcc906008614024565b63ffffffff1686611fde83600261426d565b81518110611fee57611fee614259565b016020015160f81c901b9190911790600101611fad565b5063ffffffff811660021461202c5760405162461bcd60e51b815260040161041d9061430c565b5f805b60208110156120815761204381601f614246565b61204e906008614024565b8761205a83600661426d565b8151811061206a5761206a614259565b016020015160f81c901b919091179060010161202f565b505f8660268151811061209657612096614259565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120da5760405162461bcd60e51b815260040161041d90614280565b5f805b6002811015612129576120f1816001614246565b6120fc906008614024565b61ffff1686828151811061211257612112614259565b016020015160f81c901b91909117906001016120dd565b5061ffff81161561214c5760405162461bcd60e51b815260040161041d906142c9565b5f805b60048110156121a757612163816003614246565b61216e906008614024565b63ffffffff168761218083600261426d565b8151811061219057612190614259565b016020015160f81c901b919091179060010161214f565b5063ffffffff81166003146121ce5760405162461bcd60e51b815260040161041d9061430c565b5f805b6020811015612223576121e581601f614246565b6121f0906008614024565b886121fc83600661426d565b8151811061220c5761220c614259565b016020015160f81c901b91909117906001016121d1565b505f805b60088110156122825761223b816007614246565b612246906008614024565b6001600160401b03168961225b83602661426d565b8151811061226b5761226b614259565b016020015160f81c901b9190911790600101612227565b505f805b60088110156122e15761229a816007614246565b6122a5906008614024565b6001600160401b03168a6122ba83602e61426d565b815181106122ca576122ca614259565b016020015160f81c901b9190911790600101612286565b5091989097509095509350505050565b5f8181525f805160206145b883398151915260205260408082208151610100810190925280545f8051602061457883398151915293929190829060ff16600581111561233f5761233f613eb8565b600581111561235057612350613eb8565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123d8576123d8613eb8565b146124345760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161041d565b60408101516001600160a01b0316336001600160a01b0316146124ae5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161041d565b6124bb8160a0015161320a565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156124ff576124ff613eb8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125cb846125c58161191e565b5f611af9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125fa908590600401613f29565b6020604051808303815f875af1158015612616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061263a9190613f5b565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f80516020614538833981519152816126a8846133ab565b90505f6126b4826109d6565b83549091506001600160401b038216108015906126de57508260010154816001600160401b031611155b610f8f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161041d565b5f6127456133e1565b5f80516020614578833981519152426001600160401b03851611801561277f57506001600160401b03841661277d426202a30061426d565b115b6127e15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161041d565b856128385760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161041d565b5f868152600782016020526040902054156128a65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161041d565b825160301461290d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161041d565b6129168561320a565b5f8061295d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613418565b5f8281526005860160205260409020919350915061297b8282614397565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129a8908590600401613f29565b6020604051808303815f875af11580156129c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e89190613f5b565b6040805161010081018252600180825260208083018e905233838501526001600160401b038d16606084018190526080840183905260a08401525f60c0840181905260e0840181905288815260068a01909152929092208151815494955091939092839160ff191690836005811115612a6357612a63613eb8565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610f8f60015f8051602061459883398151915255565b5f612b846133e1565b5f612b916101a4846133ab565b90505f805160206145388339815191525f612bab876119a0565b9050600281516005811115612bc257612bc2613eb8565b14612c215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161041d565b5f838260a00151612c329190614456565b9050612c3e8882611ab1565b5f612c488961191e565b90505f898983604051602001612c909392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612cb18661320a565b5f6005600160991b0163ee5b48eb612cca8d8688611af9565b6040518263ffffffff1660e01b8152600401612ce69190613f29565b6020604051808303815f875af1158015612d02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d269190613f5b565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612dae57612dae613eb8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061112260015f8051602061459883398151915255565b5f808251602e14612f105760405162461bcd60e51b815260040161041d90614280565b5f805b6002811015612f5f57612f27816001614246565b612f32906008614024565b61ffff16858281518110612f4857612f48614259565b016020015160f81c901b9190911790600101612f13565b5061ffff811615612f825760405162461bcd60e51b815260040161041d906142c9565b5f805b6004811015612fdd57612f99816003614246565b612fa4906008614024565b63ffffffff1686612fb683600261426d565b81518110612fc657612fc6614259565b016020015160f81c901b9190911790600101612f85565b5063ffffffff81166004146130045760405162461bcd60e51b815260040161041d9061430c565b5f805b60208110156130595761301b81601f614246565b613026906008614024565b8761303283600661426d565b8151811061304257613042614259565b016020015160f81c901b9190911790600101613007565b505f805b60088110156130b857613071816007614246565b61307c906008614024565b6001600160401b03168861309183602661426d565b815181106130a1576130a1614259565b016020015160f81c901b919091179060010161305d565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661310e57604051631afcd79f60e31b815260040160405180910390fd5b565b6131186130c5565b613121816137d0565b6131536060820135608083013561313e60c0850160a08601613d51565b61314e60e0860160c08701614476565b6137f1565b50565b61315e6130c5565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131ea5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161041d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145788339815191529060ff165f03613248575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132909083614246565b106132ac576001600160401b03841660408301528082526132cb565b83826040018181516132be9190614456565b6001600160401b03169052505b5f8260200151836040015160646132e29190614491565b6132ec91906144bc565b600285015490915060ff90811690821611156133675760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161041d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109e6827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061384c565b5f8051602061459883398151915280546001190161341257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134825760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161041d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134f9576134b9816001614246565b6134c4906008614024565b5081515f908390839081106134db576134db614259565b60200101906001600160f81b03191690815f1a9053506001016134a5565b505f5b600481101561355757613510816003614246565b61351b906008614024565b505f8261352983600261426d565b8151811061353957613539614259565b60200101906001600160f81b03191690815f1a9053506001016134fc565b505f5b60208110156135b4578451816020811061357657613576614259565b1a60f81b8261358683600661426d565b8151811061359657613596614259565b60200101906001600160f81b03191690815f1a90535060010161355a565b505f5b602081101561361457846020015181602081106135d6576135d6614259565b1a60f81b826135e683602661426d565b815181106135f6576135f6614259565b60200101906001600160f81b03191690815f1a9053506001016135b7565b505f5b60088110156136885761362b816007614246565b613636906008614024565b60ff1685604001516001600160401b0316901c60f81b8282604661365a919061426d565b8151811061366a5761366a614259565b60200101906001600160f81b03191690815f1a905350600101613617565b505f5b60308110156136f357846080015181815181106136aa576136aa614259565b01602001516001600160f81b031916826136c583604e61426d565b815181106136d5576136d5614259565b60200101906001600160f81b03191690815f1a90535060010161368b565b505f5b60088110156137655761370a816007614246565b613715906008614024565b60608601516001600160401b0390811691161c60f81b8261373783607e61426d565b8151811061374757613747614259565b60200101906001600160f81b03191690815f1a9053506001016136f6565b5060028160405161377691906144e1565b602060405180830381855afa158015613791573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137b49190613f5b565b94909350915050565b60015f8051602061459883398151915255565b6137d86130c5565b6137e06139ae565b6137e86139be565b613153816139c6565b6137f96130c5565b5f5f80516020614538833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613892573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b69190613f5b565b90506138cd6001600160a01b038516333086613a32565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613911573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139359190613f5b565b905081811161399b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161041d565b6139a58282614246565b95945050505050565b6139b66130c5565b61310e613a8c565b61310e6130c5565b6139ce6130c5565b80355f8051602061457883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a1860608301604084016144fc565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526108ec908590613a94565b6137bd6130c5565b5f613aa86001600160a01b03841683613af5565b905080515f14158015613acc575080806020019051810190613aca919061451c565b155b15610f6d57604051635274afe760e01b81526001600160a01b038416600482015260240161041d565b606061112283835f845f80856001600160a01b03168486604051613b1991906144e1565b5f6040518083038185875af1925050503d805f8114613b53576040519150601f19603f3d011682016040523d82523d5f602084013e613b58565b606091505b5091509150611914868383606082613b7857613b7382613bbf565b611122565b8151158015613b8f57506001600160a01b0384163b155b15613bb857604051639996b31560e01b81526001600160a01b038516600482015260240161041d565b5080611122565b805115613bcf5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613bf49061403b565b5f825580601f10613c03575050565b601f0160209004905f5260205f209081019061315391905b80821115613c2e575f8155600101613c1b565b5090565b8015158114613153575f80fd5b803563ffffffff81168114613c52575f80fd5b919050565b5f805f60608486031215613c69575f80fd5b833592506020840135613c7b81613c32565b9150613c8960408501613c3f565b90509250925092565b5f60208284031215613ca2575f80fd5b5035919050565b6001600160a01b0381168114613153575f80fd5b5f80828403610100811215613cd0575f80fd5b60e0811215613cdd575f80fd5b5082915060e0830135613cef81613ca9565b809150509250929050565b5f60208284031215613d0a575f80fd5b61112282613c3f565b5f8060408385031215613d24575f80fd5b613d2d83613c3f565b946020939093013593505050565b80356001600160401b0381168114613c52575f80fd5b5f60208284031215613d61575f80fd5b61112282613d3b565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613da057613da0613d6a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dce57613dce613d6a565b604052919050565b5f6001600160401b03821115613dee57613dee613d6a565b50601f01601f191660200190565b5f805f8060808587031215613e0f575f80fd5b8435935060208501359250613e2660408601613d3b565b915060608501356001600160401b03811115613e40575f80fd5b8501601f81018713613e50575f80fd5b8035613e63613e5e82613dd6565b613da6565b818152886020838501011115613e77575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ea9575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f0057613f00613ecc565b5092915050565b5f5b83811015613f21578181015183820152602001613f09565b50505f910152565b602081525f8251806020840152613f47816040850160208701613f07565b601f01601f19169190910160400192915050565b5f60208284031215613f6b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f9457613f94613f72565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109e6576109e6613ecc565b600181811c9082168061404f57607f821691505b60208210810361406d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546140cc8161403b565b806020870152604060018084165f81146140ed576001811461410957614136565b60ff19851660408a0152604084151560051b8a01019550614136565b895f5260205f205f5b8581101561412d5781548b8201860152908301908801614112565b8a016040019650505b509398975050505050505050565b8051613c5281613c32565b5f8060408385031215614160575f80fd5b82516001600160401b0380821115614176575f80fd5b9084019060608287031215614189575f80fd5b614191613d7e565b825181526020808401516141a481613ca9565b828201526040840151838111156141b9575f80fd5b80850194505087601f8501126141cd575f80fd5b835192506141dd613e5e84613dd6565b83815288828587010111156141f0575f80fd5b6141ff84838301848801613f07565b80604084015250819550614214818801614144565b9450505050509250929050565b5f6001600160401b0380831681810361423c5761423c613ecc565b6001019392505050565b818103818111156109e6576109e6613ecc565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109e6576109e6613ecc565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610f6d57805f5260205f20601f840160051c810160208510156143785750805b601f840160051c820191505b8181101561156c575f8155600101614384565b81516001600160401b038111156143b0576143b0613d6a565b6143c4816143be845461403b565b84614353565b602080601f8311600181146143f7575f84156143e05750858301515b5f19600386901b1c1916600185901b17855561444e565b5f85815260208120601f198616915b8281101561442557888601518255948401946001909101908401614406565b508582101561444257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115613f0057613f00613ecc565b5f60208284031215614486575f80fd5b813561112281613ca9565b6001600160401b038181168382160280821691908281146144b4576144b4613ecc565b505092915050565b5f6001600160401b03808416806144d5576144d5613f72565b92169190910492915050565b5f82516144f2818460208701613f07565b9190910192915050565b5f6020828403121561450c575f80fd5b813560ff81168114611122575f80fd5b5f6020828403121561452c575f80fd5b815161112281613c3256fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index dc3b2a3e6..d7e0f9571 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"valueToWeight\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"weightToValue\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"DelegationEnded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516142c63803806142c683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6141798061014d5f395ff3fe6080604052600436106100f9575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc146102c9578063ba3a4b97146102fb578063bee0a03f1461031a578063c599e24f14610339578063f40797d71461034c575f80fd5b806366435abf1461024d57806376f786211461026c57806398f3e2b41461028b578063a3a65e48146102aa575f80fd5b80632e2194d8116100cd5780632e2194d8146101b9578063467ef06f146101f05780635297fae61461020f578063620658561461022e575f80fd5b8062e41792146100fd5780630118acc41461011e5780630322ed981461013d5780630cdd09851461015c575b5f80fd5b348015610108575f80fd5b5061011c610117366004613839565b61035f565b005b348015610129575f80fd5b5061011c610138366004613874565b610441565b348015610148575f80fd5b5061011c6101573660046138af565b6108ab565b348015610167575f80fd5b506101a66101763660046138af565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c4575f80fd5b506101d86101d33660046138af565b6109eb565b6040516001600160401b0390911681526020016101b0565b3480156101fb575f80fd5b5061011c61020a3660046138c6565b610a01565b34801561021a575f80fd5b5061011c6102293660046138df565b610d6a565b348015610239575f80fd5b506101a661024836600461391d565b610f3a565b348015610258575f80fd5b506101d86102673660046138af565b610f53565b348015610277575f80fd5b5061011c610286366004613874565b610f67565b348015610296575f80fd5b5061011c6102a53660046138df565b610f87565b3480156102b5575f80fd5b5061011c6102c43660046138c6565b611106565b3480156102d4575f80fd5b506102e36005600160991b0181565b6040516001600160a01b0390911681526020016101b0565b348015610306575f80fd5b5061011c6103153660046138af565b6112c3565b348015610325575f80fd5b5061011c6103343660046138af565b61154f565b6101a66103473660046138af565b61165e565b6101a661035a3660046139c8565b61166a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103a8575080546001600160401b03808416911610155b156103c65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556103f08361168e565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206140cd8339815191529184156104935761049082856116a2565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104c5576104c5613a5a565b60048111156104d6576104d6613a5a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561055d5761055d613a5a565b146105af5760405162461bcd60e51b815260206004820152602a60248201525f805160206140ed8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106145760405162461bcd60e51b815260206004820152603360248201525f805160206140ed8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a6565b5f61061e8461193e565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561066b5761066b613a5a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61073d856119b2565b905082606001516001600160401b03168160a001516001600160401b0316116107b45760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a6565b5f83606001518260a001516107c99190613a82565b90506107d58682611ac3565b5f6005600160991b0163ee5b48eb6107ee898786611b0b565b6040518263ffffffff1660e01b815260040161080a9190613acb565b6020604051808303815f875af1158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190613afd565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061414d83398151915260205260409020545f8051602061410d8339815191529060039060ff1660058111156108eb576108eb613a5a565b146109505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a6565b5f8281526006820160205260408120600301546109789084906001600160401b031683611b0b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906109a5908490600401613acb565b6020604051808303815f875af11580156109c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e59190613afd565b50505050565b5f6109fb64e8d4a5100083613b28565b92915050565b5f8051602061410d8339815191525f610a1983611d28565b90505f80610a2a8360400151611f09565b915091508015610a8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a6565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610ac157610ac1613a5a565b6005811115610ad257610ad2613a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b5957610b59613a5a565b1480610b775750600182516005811115610b7557610b75613a5a565b145b610bd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a6565b600382516005811115610beb57610beb613a5a565b03610bf857506004610bfc565b5060055b6020808301515f90815260078801909152604081205581816005811115610c2557610c25613a5a565b90816005811115610c3857610c38613a5a565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610c6c57610c6c613a5a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d3757610d37613a5a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206140cd8339815191525f610d8284611d28565b90505f80610d9383604001516120aa565b50915091505f610da2836119b2565b9050816001600160401b031681608001516001600160401b03161015610dda5760405162461bcd60e51b81526004016105a690613b3b565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e1f5760405162461bcd60e51b81526004016105a690613b7d565b60015f87815260038701602052604090205460ff166004811115610e4557610e45613a5a565b14610eae5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a6565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109fb6001600160401b03831664e8d4a51000613bc6565b5f610f5d826119b2565b60a0015192915050565b8115610f7957610f7783826116a2565b505b610f82836122e5565b505050565b5f805160206140cd8339815191525f610f9f84611d28565b90505f80610fb083604001516120aa565b50915091505f610fbf836119b2565b9050816001600160401b031681608001516001600160401b03161015610ff75760405162461bcd60e51b81526004016105a690613b3b565b5f8681526003808701602052604090912001546001600160401b03808416911611156110355760405162461bcd60e51b81526004016105a690613b7d565b60035f87815260038701602052604090205460ff16600481111561105b5761105b613a5a565b146110af5760405162461bcd60e51b815260206004820152603160248201525f805160206140ed8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a6565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061410d8339815191525f61111e83611d28565b90505f8061112f8360400151611f09565b91509150806111915760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a6565b5f828152600585016020526040812080546111ab90613bdd565b90501180156111dd575060015f83815260068601602052604090205460ff1660058111156111db576111db613a5a565b145b6111f95760405162461bcd60e51b81526004016105a690613c0f565b5f8281526005850160205260408120611211916137ef565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f805160206140cd83398151915293929190829060ff16600481111561132457611324613a5a565b600481111561133557611335613a5a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff1660048111156113cd576113cd613a5a565b1461142d5760405162461bcd60e51b815260206004820152603860248201525f805160206140ed83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105a6565b5f61143b82604001516119b2565b905080608001516001600160401b03165f036114bf5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a6565b6005600160991b016001600160a01b031663ee5b48eb6114ec846040015184608001518560a00151611b0b565b6040518263ffffffff1660e01b81526004016115089190613acb565b6020604051808303815f875af1158015611524573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115489190613afd565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061410d83398151915292919061159790613bdd565b90501180156115c9575060015f83815260068301602052604090205460ff1660058111156115c7576115c7613a5a565b145b6115e55760405162461bcd60e51b81526004016105a690613c0f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161161e9190600401613c56565b6020604051808303815f875af115801561163a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f829190613afd565b5f6109fb823334612683565b5f80611675346129f2565b905061168385828686612a9c565b9150505b9392505050565b611696612ef1565b61169f81612f3c565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156116ed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117149190810190613cff565b91509150806117775760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117de9190613afd565b8251146118425760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a6565b60208201516001600160a01b0316156118b85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a6565b5f806118c78460400151612f7f565b915091508187146119345760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a6565b9695505050505050565b5f8181525f8051602061414d8339815191526020526040812060030180545f8051602061410d833981519152916001600160401b039091169081908461198383613dd1565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061414d83398151915290528390208351918201909352825491925f8051602061410d83398151915292829060ff166005811115611a3a57611a3a613a5a565b6005811115611a4b57611a4b613a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061414d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b8457611b44816001613df6565b611b4f906008613bc6565b5081515f90839083908110611b6657611b66613e09565b60200101906001600160f81b03191690815f1a905350600101611b30565b505f5b6004811015611be757611b9b816003613df6565b611ba6906008613bc6565b6001901c60f81b82611bb9836002613e1d565b81518110611bc957611bc9613e09565b60200101906001600160f81b03191690815f1a905350600101611b87565b505f5b6020811015611c4957611bfe81601f613df6565b611c09906008613bc6565b86901c60f81b82611c1b836006613e1d565b81518110611c2b57611c2b613e09565b60200101906001600160f81b03191690815f1a905350600101611bea565b505f5b6008811015611cb457611c60816007613df6565b611c6b906008613bc6565b6001600160401b038616901c60f81b82611c86836026613e1d565b81518110611c9657611c96613e09565b60200101906001600160f81b03191690815f1a905350600101611c4c565b505f5b6008811015611d1f57611ccb816007613df6565b611cd6906008613bc6565b6001600160401b038516901c60f81b82611cf183602e613e1d565b81518110611d0157611d01613e09565b60200101906001600160f81b03191690815f1a905350600101611cb7565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f8051602061410d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d9d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dc49190810190613cff565b9150915080611e2b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a6565b8254825114611e8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a6565b60208201516001600160a01b031615611f015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a6565b509392505050565b5f808251602714611f2c5760405162461bcd60e51b81526004016105a690613e30565b5f805b6002811015611f7b57611f43816001613df6565b611f4e906008613bc6565b61ffff16858281518110611f6457611f64613e09565b016020015160f81c901b9190911790600101611f2f565b5061ffff811615611f9e5760405162461bcd60e51b81526004016105a690613e79565b5f805b6004811015611ff957611fb5816003613df6565b611fc0906008613bc6565b63ffffffff1686611fd2836002613e1d565b81518110611fe257611fe2613e09565b016020015160f81c901b9190911790600101611fa1565b5063ffffffff81166002146120205760405162461bcd60e51b81526004016105a690613ebc565b5f805b60208110156120755761203781601f613df6565b612042906008613bc6565b8761204e836006613e1d565b8151811061205e5761205e613e09565b016020015160f81c901b9190911790600101612023565b505f8660268151811061208a5761208a613e09565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120ce5760405162461bcd60e51b81526004016105a690613e30565b5f805b600281101561211d576120e5816001613df6565b6120f0906008613bc6565b61ffff1686828151811061210657612106613e09565b016020015160f81c901b91909117906001016120d1565b5061ffff8116156121405760405162461bcd60e51b81526004016105a690613e79565b5f805b600481101561219b57612157816003613df6565b612162906008613bc6565b63ffffffff1687612174836002613e1d565b8151811061218457612184613e09565b016020015160f81c901b9190911790600101612143565b5063ffffffff81166003146121c25760405162461bcd60e51b81526004016105a690613ebc565b5f805b6020811015612217576121d981601f613df6565b6121e4906008613bc6565b886121f0836006613e1d565b8151811061220057612200613e09565b016020015160f81c901b91909117906001016121c5565b505f805b60088110156122765761222f816007613df6565b61223a906008613bc6565b6001600160401b03168961224f836026613e1d565b8151811061225f5761225f613e09565b016020015160f81c901b919091179060010161221b565b505f805b60088110156122d55761228e816007613df6565b612299906008613bc6565b6001600160401b03168a6122ae83602e613e1d565b815181106122be576122be613e09565b016020015160f81c901b919091179060010161227a565b5091989097509095509350505050565b5f8181525f8051602061414d83398151915260205260408082208151610100810190925280545f8051602061410d83398151915293929190829060ff16600581111561233357612333613a5a565b600581111561234457612344613a5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123cc576123cc613a5a565b146124285760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a6565b60408101516001600160a01b0316336001600160a01b0316146124a25760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a6565b6124af8160a00151613157565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156124f3576124f3613a5a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125bf846125b98161193e565b5f611b0b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125ee908590600401613acb565b6020604051808303815f875af115801561260a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262e9190613afd565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61268c6132f8565b5f612696836109eb565b90505f805160206140cd8339815191525f6126b0876119b2565b90506002815160058111156126c7576126c7613a5a565b146127265760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a6565b5f838260a001516127379190613f03565b90506127438882611ac3565b5f61274d8961193e565b90505f8989836040516020016127959392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506127b686613157565b5f6005600160991b0163ee5b48eb6127cf8d8688611b0b565b6040518263ffffffff1660e01b81526004016127eb9190613acb565b6020604051808303815f875af1158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b9190613afd565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff191660018360048111156128b3576128b3613a5a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061168760015f8051602061412d83398151915255565b5f5f805160206140cd8339815191528282612a0c826109eb565b83549091506001600160401b03821610801590612a3657508260010154816001600160401b031611155b612a945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105a6565b949350505050565b5f612aa56132f8565b5f8051602061410d833981519152426001600160401b038516118015612adf57506001600160401b038416612add426202a300613e1d565b115b612b415760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105a6565b85612b985760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a6565b5f86815260078201602052604090205415612c065760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a6565b8251603014612c6d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a6565b612c7685613157565b5f80612cbd6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613342565b5f82815260058601602052604090209193509150612cdb8282613f67565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d08908590600401613acb565b6020604051808303815f875af1158015612d24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d489190613afd565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612dca57612dca613a5a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612e8b8361193e565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612a9460015f8051602061412d83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612f3a57604051631afcd79f60e31b815260040160405180910390fd5b565b612f44612ef1565b612f4d816136e7565b61169f60608201356080830135612f6a60c0850160a0860161391d565b612f7a60e0860160c08701614026565b613708565b5f808251602e14612fa25760405162461bcd60e51b81526004016105a690613e30565b5f805b6002811015612ff157612fb9816001613df6565b612fc4906008613bc6565b61ffff16858281518110612fda57612fda613e09565b016020015160f81c901b9190911790600101612fa5565b5061ffff8116156130145760405162461bcd60e51b81526004016105a690613e79565b5f805b600481101561306f5761302b816003613df6565b613036906008613bc6565b63ffffffff1686613048836002613e1d565b8151811061305857613058613e09565b016020015160f81c901b9190911790600101613017565b5063ffffffff81166004146130965760405162461bcd60e51b81526004016105a690613ebc565b5f805b60208110156130eb576130ad81601f613df6565b6130b8906008613bc6565b876130c4836006613e1d565b815181106130d4576130d4613e09565b016020015160f81c901b9190911790600101613099565b505f805b600881101561314a57613103816007613df6565b61310e906008613bc6565b6001600160401b031688613123836026613e1d565b8151811061313357613133613e09565b016020015160f81c901b91909117906001016130ef565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061410d8339815191529060ff165f03613195575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131dd9083613df6565b106131f9576001600160401b0384166040830152808252613218565b838260400181815161320b9190613f03565b6001600160401b03169052505b5f82602001518360400151606461322f9190614041565b613239919061406c565b600285015490915060ff90811690821611156132b45760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105a6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061412d83398151915280546001190161332957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061412d83398151915255565b5f60608260800151516030146133ac5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613423576133e3816001613df6565b6133ee906008613bc6565b5081515f9083908390811061340557613405613e09565b60200101906001600160f81b03191690815f1a9053506001016133cf565b505f5b60048110156134815761343a816003613df6565b613445906008613bc6565b505f82613453836002613e1d565b8151811061346357613463613e09565b60200101906001600160f81b03191690815f1a905350600101613426565b505f5b60208110156134de57845181602081106134a0576134a0613e09565b1a60f81b826134b0836006613e1d565b815181106134c0576134c0613e09565b60200101906001600160f81b03191690815f1a905350600101613484565b505f5b602081101561353e578460200151816020811061350057613500613e09565b1a60f81b82613510836026613e1d565b8151811061352057613520613e09565b60200101906001600160f81b03191690815f1a9053506001016134e1565b505f5b60088110156135b257613555816007613df6565b613560906008613bc6565b60ff1685604001516001600160401b0316901c60f81b828260466135849190613e1d565b8151811061359457613594613e09565b60200101906001600160f81b03191690815f1a905350600101613541565b505f5b603081101561361d57846080015181815181106135d4576135d4613e09565b01602001516001600160f81b031916826135ef83604e613e1d565b815181106135ff576135ff613e09565b60200101906001600160f81b03191690815f1a9053506001016135b5565b505f5b600881101561368f57613634816007613df6565b61363f906008613bc6565b60608601516001600160401b0390811691161c60f81b8261366183607e613e1d565b8151811061367157613671613e09565b60200101906001600160f81b03191690815f1a905350600101613620565b506002816040516136a09190614091565b602060405180830381855afa1580156136bb573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906136de9190613afd565b94909350915050565b6136ef612ef1565b6136f7613763565b6136ff613773565b61169f8161377b565b613710612ef1565b5f5f805160206140cd833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61376b612ef1565b612f3a6137e7565b612f3a612ef1565b613783612ef1565b80355f8051602061410d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556137cd60608301604084016140ac565b600291909101805460ff191660ff90921691909117905550565b61332f612ef1565b5080546137fb90613bdd565b5f825580601f1061380a575050565b601f0160209004905f5260205f209081019061169f91905b80821115613835575f8155600101613822565b5090565b5f60e08284031215613849575f80fd5b50919050565b801515811461169f575f80fd5b803563ffffffff8116811461386f575f80fd5b919050565b5f805f60608486031215613886575f80fd5b8335925060208401356138988161384f565b91506138a66040850161385c565b90509250925092565b5f602082840312156138bf575f80fd5b5035919050565b5f602082840312156138d6575f80fd5b6116878261385c565b5f80604083850312156138f0575f80fd5b6138f98361385c565b946020939093013593505050565b80356001600160401b038116811461386f575f80fd5b5f6020828403121561392d575f80fd5b61168782613907565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561396c5761396c613936565b60405290565b604051601f8201601f191681016001600160401b038111828210171561399a5761399a613936565b604052919050565b5f6001600160401b038211156139ba576139ba613936565b50601f01601f191660200190565b5f805f606084860312156139da575f80fd5b833592506139ea60208501613907565b915060408401356001600160401b03811115613a04575f80fd5b8401601f81018613613a14575f80fd5b8035613a27613a22826139a2565b613972565b818152876020838501011115613a3b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613aa257613aa2613a6e565b5092915050565b5f5b83811015613ac3578181015183820152602001613aab565b50505f910152565b602081525f8251806020840152613ae9816040850160208701613aa9565b601f01601f19169190910160400192915050565b5f60208284031215613b0d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613b3657613b36613b14565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109fb576109fb613a6e565b600181811c90821680613bf157607f821691505b60208210810361384957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613c6881613bdd565b806020870152604060018084165f8114613c895760018114613ca557613cd2565b60ff19851660408a0152604084151560051b8a01019550613cd2565b895f5260205f205f5b85811015613cc95781548b8201860152908301908801613cae565b8a016040019650505b509398975050505050505050565b6001600160a01b038116811461169f575f80fd5b805161386f8161384f565b5f8060408385031215613d10575f80fd5b82516001600160401b0380821115613d26575f80fd5b9084019060608287031215613d39575f80fd5b613d4161394a565b82518152602080840151613d5481613ce0565b82820152604084015183811115613d69575f80fd5b80850194505087601f850112613d7d575f80fd5b83519250613d8d613a22846139a2565b8381528882858701011115613da0575f80fd5b613daf84838301848801613aa9565b80604084015250819550613dc4818801613cf4565b9450505050509250929050565b5f6001600160401b03808316818103613dec57613dec613a6e565b6001019392505050565b818103818111156109fb576109fb613a6e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109fb576109fb613a6e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613aa257613aa2613a6e565b601f821115610f8257805f5260205f20601f840160051c81016020851015613f485750805b601f840160051c820191505b81811015611548575f8155600101613f54565b81516001600160401b03811115613f8057613f80613936565b613f9481613f8e8454613bdd565b84613f23565b602080601f831160018114613fc7575f8415613fb05750858301515b5f19600386901b1c1916600185901b17855561401e565b5f85815260208120601f198616915b82811015613ff557888601518255948401946001909101908401613fd6565b508582101561401257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614036575f80fd5b813561168781613ce0565b6001600160401b0381811683821602808216919082811461406457614064613a6e565b505092915050565b5f6001600160401b038084168061408557614085613b14565b92169190910492915050565b5f82516140a2818460208701613aa9565b9190910192915050565b5f602082840312156140bc575f80fd5b813560ff81168114611687575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161434f38038061434f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142028061014d5f395ff3fe6080604052600436106100f9575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc146102c9578063ba3a4b97146102fb578063bee0a03f1461031a578063c599e24f14610339578063f40797d71461034c575f80fd5b806366435abf1461024d57806376f786211461026c57806398f3e2b41461028b578063a3a65e48146102aa575f80fd5b80632e2194d8116100cd5780632e2194d8146101b9578063467ef06f146101f05780635297fae61461020f578063620658561461022e575f80fd5b8062e41792146100fd5780630118acc41461011e5780630322ed981461013d5780630cdd09851461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046138c2565b61035f565b005b348015610129575f80fd5b5061011c6101383660046138fd565b610441565b348015610148575f80fd5b5061011c610157366004613938565b6108ab565b348015610167575f80fd5b506101a6610176366004613938565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c4575f80fd5b506101d86101d3366004613938565b610a7b565b6040516001600160401b0390911681526020016101b0565b3480156101fb575f80fd5b5061011c61020a36600461394f565b610a91565b34801561021a575f80fd5b5061011c610229366004613968565b610dfa565b348015610239575f80fd5b506101a66102483660046139a6565b610fca565b348015610258575f80fd5b506101d8610267366004613938565b610fe3565b348015610277575f80fd5b5061011c6102863660046138fd565b610ff7565b348015610296575f80fd5b5061011c6102a5366004613968565b611017565b3480156102b5575f80fd5b5061011c6102c436600461394f565b611196565b3480156102d4575f80fd5b506102e36005600160991b0181565b6040516001600160a01b0390911681526020016101b0565b348015610306575f80fd5b5061011c610315366004613938565b611353565b348015610325575f80fd5b5061011c610334366004613938565b6115e0565b6101a6610347366004613938565b6116ef565b6101a661035a366004613a51565b6116fb565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103a8575080546001600160401b03808416911610155b156103c65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556103f08361171f565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f80516020614156833981519152918415610493576104908285611733565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104c5576104c5613ae3565b60048111156104d6576104d6613ae3565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561055d5761055d613ae3565b146105af5760405162461bcd60e51b815260206004820152602a60248201525f805160206141768339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106145760405162461bcd60e51b815260206004820152603360248201525f805160206141768339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a6565b5f61061e846119cf565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561066b5761066b613ae3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61073d85611a51565b905082606001516001600160401b03168160a001516001600160401b0316116107b45760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a6565b5f83606001518260a001516107c99190613b0b565b90506107d58682611b62565b5f6005600160991b0163ee5b48eb6107ee898786611baa565b6040518263ffffffff1660e01b815260040161080a9190613b54565b6020604051808303815f875af1158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190613b86565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206141d683398151915260205260408082208151610100810190925280545f8051602061419683398151915293929190829060ff1660058111156108f9576108f9613ae3565b600581111561090a5761090a613ae3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561098f5761098f613ae3565b146109f45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a6565b6005600160991b016001600160a01b031663ee5b48eb610a198584608001515f611baa565b6040518263ffffffff1660e01b8152600401610a359190613b54565b6020604051808303815f875af1158015610a51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a759190613b86565b50505050565b5f610a8b64e8d4a5100083613bb1565b92915050565b5f805160206141968339815191525f610aa983611dc7565b90505f80610aba8360400151611fa8565b915091508015610b1f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a6565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b5157610b51613ae3565b6005811115610b6257610b62613ae3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610be957610be9613ae3565b1480610c075750600182516005811115610c0557610c05613ae3565b145b610c665760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a6565b600382516005811115610c7b57610c7b613ae3565b03610c8857506004610c8c565b5060055b6020808301515f90815260078801909152604081205581816005811115610cb557610cb5613ae3565b90816005811115610cc857610cc8613ae3565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610cfc57610cfc613ae3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610dc757610dc7613ae3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141568339815191525f610e1284611dc7565b90505f80610e238360400151612149565b50915091505f610e3283611a51565b9050816001600160401b031681608001516001600160401b03161015610e6a5760405162461bcd60e51b81526004016105a690613bc4565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610eaf5760405162461bcd60e51b81526004016105a690613c06565b60015f87815260038701602052604090205460ff166004811115610ed557610ed5613ae3565b14610f3e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a6565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a8b6001600160401b03831664e8d4a51000613c4f565b5f610fed82611a51565b60a0015192915050565b8115611009576110078382611733565b505b61101283612384565b505050565b5f805160206141568339815191525f61102f84611dc7565b90505f806110408360400151612149565b50915091505f61104f83611a51565b9050816001600160401b031681608001516001600160401b031610156110875760405162461bcd60e51b81526004016105a690613bc4565b5f8681526003808701602052604090912001546001600160401b03808416911611156110c55760405162461bcd60e51b81526004016105a690613c06565b60035f87815260038701602052604090205460ff1660048111156110eb576110eb613ae3565b1461113f5760405162461bcd60e51b815260206004820152603160248201525f805160206141768339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a6565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206141968339815191525f6111ae83611dc7565b90505f806111bf8360400151611fa8565b91509150806112215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a6565b5f8281526005850160205260408120805461123b90613c66565b905011801561126d575060015f83815260068601602052604090205460ff16600581111561126b5761126b613ae3565b145b6112895760405162461bcd60e51b81526004016105a690613c98565b5f82815260058501602052604081206112a191613878565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061415683398151915293929190829060ff1660048111156113b4576113b4613ae3565b60048111156113c5576113c5613ae3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561144c5761144c613ae3565b148061146a575060038151600481111561146857611468613ae3565b145b6114be5760405162461bcd60e51b815260206004820152603260248201525f80516020614176833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105a6565b5f6114cc8260400151611a51565b905080608001516001600160401b03165f036115505760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a6565b6005600160991b016001600160a01b031663ee5b48eb61157d846040015184608001518560a00151611baa565b6040518263ffffffff1660e01b81526004016115999190613b54565b6020604051808303815f875af11580156115b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d99190613b86565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061419683398151915292919061162890613c66565b905011801561165a575060015f83815260068301602052604090205460ff16600581111561165857611658613ae3565b145b6116765760405162461bcd60e51b81526004016105a690613c98565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916116af9190600401613cdf565b6020604051808303815f875af11580156116cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110129190613b86565b5f610a8b823334612722565b5f8061170634612a91565b905061171485828686612b3b565b9150505b9392505050565b611727612f7a565b61173081612fc5565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561177e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117a59190810190613d88565b91509150806118085760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561184b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186f9190613b86565b8251146118d35760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a6565b60208201516001600160a01b0316156119495760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a6565b5f806119588460400151613008565b915091508187146119c55760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a6565b9695505050505050565b5f8181525f805160206141d68339815191526020526040812060030180545f80516020614196833981519152916001600160401b039091169083611a1283613e5a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206141d683398151915290528390208351918201909352825491925f8051602061419683398151915292829060ff166005811115611ad957611ad9613ae3565b6005811115611aea57611aea613ae3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206141d6833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611c2357611be3816001613e7f565b611bee906008613c4f565b5081515f90839083908110611c0557611c05613e92565b60200101906001600160f81b03191690815f1a905350600101611bcf565b505f5b6004811015611c8657611c3a816003613e7f565b611c45906008613c4f565b6001901c60f81b82611c58836002613ea6565b81518110611c6857611c68613e92565b60200101906001600160f81b03191690815f1a905350600101611c26565b505f5b6020811015611ce857611c9d81601f613e7f565b611ca8906008613c4f565b86901c60f81b82611cba836006613ea6565b81518110611cca57611cca613e92565b60200101906001600160f81b03191690815f1a905350600101611c89565b505f5b6008811015611d5357611cff816007613e7f565b611d0a906008613c4f565b6001600160401b038616901c60f81b82611d25836026613ea6565b81518110611d3557611d35613e92565b60200101906001600160f81b03191690815f1a905350600101611ceb565b505f5b6008811015611dbe57611d6a816007613e7f565b611d75906008613c4f565b6001600160401b038516901c60f81b82611d9083602e613ea6565b81518110611da057611da0613e92565b60200101906001600160f81b03191690815f1a905350600101611d56565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f805160206141968339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e639190810190613d88565b9150915080611eca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a6565b8254825114611f2d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a6565b60208201516001600160a01b031615611fa05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a6565b509392505050565b5f808251602714611fcb5760405162461bcd60e51b81526004016105a690613eb9565b5f805b600281101561201a57611fe2816001613e7f565b611fed906008613c4f565b61ffff1685828151811061200357612003613e92565b016020015160f81c901b9190911790600101611fce565b5061ffff81161561203d5760405162461bcd60e51b81526004016105a690613f02565b5f805b600481101561209857612054816003613e7f565b61205f906008613c4f565b63ffffffff1686612071836002613ea6565b8151811061208157612081613e92565b016020015160f81c901b9190911790600101612040565b5063ffffffff81166002146120bf5760405162461bcd60e51b81526004016105a690613f45565b5f805b6020811015612114576120d681601f613e7f565b6120e1906008613c4f565b876120ed836006613ea6565b815181106120fd576120fd613e92565b016020015160f81c901b91909117906001016120c2565b505f8660268151811061212957612129613e92565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461216d5760405162461bcd60e51b81526004016105a690613eb9565b5f805b60028110156121bc57612184816001613e7f565b61218f906008613c4f565b61ffff168682815181106121a5576121a5613e92565b016020015160f81c901b9190911790600101612170565b5061ffff8116156121df5760405162461bcd60e51b81526004016105a690613f02565b5f805b600481101561223a576121f6816003613e7f565b612201906008613c4f565b63ffffffff1687612213836002613ea6565b8151811061222357612223613e92565b016020015160f81c901b91909117906001016121e2565b5063ffffffff81166003146122615760405162461bcd60e51b81526004016105a690613f45565b5f805b60208110156122b65761227881601f613e7f565b612283906008613c4f565b8861228f836006613ea6565b8151811061229f5761229f613e92565b016020015160f81c901b9190911790600101612264565b505f805b6008811015612315576122ce816007613e7f565b6122d9906008613c4f565b6001600160401b0316896122ee836026613ea6565b815181106122fe576122fe613e92565b016020015160f81c901b91909117906001016122ba565b505f805b60088110156123745761232d816007613e7f565b612338906008613c4f565b6001600160401b03168a61234d83602e613ea6565b8151811061235d5761235d613e92565b016020015160f81c901b9190911790600101612319565b5091989097509095509350505050565b5f8181525f805160206141d683398151915260205260408082208151610100810190925280545f8051602061419683398151915293929190829060ff1660058111156123d2576123d2613ae3565b60058111156123e3576123e3613ae3565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561246b5761246b613ae3565b146124c75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a6565b60408101516001600160a01b0316336001600160a01b0316146125415760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a6565b61254e8160a001516131e0565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561259257612592613ae3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61265e84612658816119cf565b5f611baa565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061268d908590600401613b54565b6020604051808303815f875af11580156126a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126cd9190613b86565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61272b613381565b5f61273583610a7b565b90505f805160206141568339815191525f61274f87611a51565b905060028151600581111561276657612766613ae3565b146127c55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a6565b5f838260a001516127d69190613f8c565b90506127e28882611b62565b5f6127ec896119cf565b90505f8989836040516020016128349392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612855866131e0565b5f6005600160991b0163ee5b48eb61286e8d8688611baa565b6040518263ffffffff1660e01b815260040161288a9190613b54565b6020604051808303815f875af11580156128a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ca9190613b86565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff1916600183600481111561295257612952613ae3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061171860015f805160206141b683398151915255565b5f5f805160206141568339815191528282612aab82610a7b565b83549091506001600160401b03821610801590612ad557508260010154816001600160401b031611155b612b335760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105a6565b949350505050565b5f612b44613381565b5f80516020614196833981519152426001600160401b038516118015612b7e57506001600160401b038416612b7c426202a300613ea6565b115b612be05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105a6565b85612c375760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a6565b5f86815260078201602052604090205415612ca55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a6565b8251603014612d0c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a6565b612d15856131e0565b5f80612d5c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506133cb565b5f82815260058601602052604090209193509150612d7a8282613ff0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612da7908590600401613b54565b6020604051808303815f875af1158015612dc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612de79190613b86565b6040805161010081018252600180825260208083018e905233838501526001600160401b038d16606084018190526080840183905260a08401525f60c0840181905260e0840181905288815260068a01909152929092208151815494955091939092839160ff191690836005811115612e6257612e62613ae3565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b3360015f805160206141b683398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612fc357604051631afcd79f60e31b815260040160405180910390fd5b565b612fcd612f7a565b612fd681613770565b61173060608201356080830135612ff360c0850160a086016139a6565b61300360e0860160c087016140af565b613791565b5f808251602e1461302b5760405162461bcd60e51b81526004016105a690613eb9565b5f805b600281101561307a57613042816001613e7f565b61304d906008613c4f565b61ffff1685828151811061306357613063613e92565b016020015160f81c901b919091179060010161302e565b5061ffff81161561309d5760405162461bcd60e51b81526004016105a690613f02565b5f805b60048110156130f8576130b4816003613e7f565b6130bf906008613c4f565b63ffffffff16866130d1836002613ea6565b815181106130e1576130e1613e92565b016020015160f81c901b91909117906001016130a0565b5063ffffffff811660041461311f5760405162461bcd60e51b81526004016105a690613f45565b5f805b60208110156131745761313681601f613e7f565b613141906008613c4f565b8761314d836006613ea6565b8151811061315d5761315d613e92565b016020015160f81c901b9190911790600101613122565b505f805b60088110156131d35761318c816007613e7f565b613197906008613c4f565b6001600160401b0316886131ac836026613ea6565b815181106131bc576131bc613e92565b016020015160f81c901b9190911790600101613178565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206141968339815191529060ff165f0361321e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132669083613e7f565b10613282576001600160401b03841660408301528082526132a1565b83826040018181516132949190613f8c565b6001600160401b03169052505b5f8260200151836040015160646132b891906140ca565b6132c291906140f5565b600285015490915060ff908116908216111561333d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105a6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206141b68339815191528054600119016133b257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206141b683398151915255565b5f60608260800151516030146134355760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134ac5761346c816001613e7f565b613477906008613c4f565b5081515f9083908390811061348e5761348e613e92565b60200101906001600160f81b03191690815f1a905350600101613458565b505f5b600481101561350a576134c3816003613e7f565b6134ce906008613c4f565b505f826134dc836002613ea6565b815181106134ec576134ec613e92565b60200101906001600160f81b03191690815f1a9053506001016134af565b505f5b6020811015613567578451816020811061352957613529613e92565b1a60f81b82613539836006613ea6565b8151811061354957613549613e92565b60200101906001600160f81b03191690815f1a90535060010161350d565b505f5b60208110156135c7578460200151816020811061358957613589613e92565b1a60f81b82613599836026613ea6565b815181106135a9576135a9613e92565b60200101906001600160f81b03191690815f1a90535060010161356a565b505f5b600881101561363b576135de816007613e7f565b6135e9906008613c4f565b60ff1685604001516001600160401b0316901c60f81b8282604661360d9190613ea6565b8151811061361d5761361d613e92565b60200101906001600160f81b03191690815f1a9053506001016135ca565b505f5b60308110156136a6578460800151818151811061365d5761365d613e92565b01602001516001600160f81b0319168261367883604e613ea6565b8151811061368857613688613e92565b60200101906001600160f81b03191690815f1a90535060010161363e565b505f5b6008811015613718576136bd816007613e7f565b6136c8906008613c4f565b60608601516001600160401b0390811691161c60f81b826136ea83607e613ea6565b815181106136fa576136fa613e92565b60200101906001600160f81b03191690815f1a9053506001016136a9565b50600281604051613729919061411a565b602060405180830381855afa158015613744573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137679190613b86565b94909350915050565b613778612f7a565b6137806137ec565b6137886137fc565b61173081613804565b613799612f7a565b5f5f80516020614156833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6137f4612f7a565b612fc3613870565b612fc3612f7a565b61380c612f7a565b80355f8051602061419683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138566060830160408401614135565b600291909101805460ff191660ff90921691909117905550565b6133b8612f7a565b50805461388490613c66565b5f825580601f10613893575050565b601f0160209004905f5260205f209081019061173091905b808211156138be575f81556001016138ab565b5090565b5f60e082840312156138d2575f80fd5b50919050565b8015158114611730575f80fd5b803563ffffffff811681146138f8575f80fd5b919050565b5f805f6060848603121561390f575f80fd5b833592506020840135613921816138d8565b915061392f604085016138e5565b90509250925092565b5f60208284031215613948575f80fd5b5035919050565b5f6020828403121561395f575f80fd5b611718826138e5565b5f8060408385031215613979575f80fd5b613982836138e5565b946020939093013593505050565b80356001600160401b03811681146138f8575f80fd5b5f602082840312156139b6575f80fd5b61171882613990565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156139f5576139f56139bf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a2357613a236139bf565b604052919050565b5f6001600160401b03821115613a4357613a436139bf565b50601f01601f191660200190565b5f805f60608486031215613a63575f80fd5b83359250613a7360208501613990565b915060408401356001600160401b03811115613a8d575f80fd5b8401601f81018613613a9d575f80fd5b8035613ab0613aab82613a2b565b6139fb565b818152876020838501011115613ac4575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b2b57613b2b613af7565b5092915050565b5f5b83811015613b4c578181015183820152602001613b34565b50505f910152565b602081525f8251806020840152613b72816040850160208701613b32565b601f01601f19169190910160400192915050565b5f60208284031215613b96575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613bbf57613bbf613b9d565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a8b57610a8b613af7565b600181811c90821680613c7a57607f821691505b6020821081036138d257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613cf181613c66565b806020870152604060018084165f8114613d125760018114613d2e57613d5b565b60ff19851660408a0152604084151560051b8a01019550613d5b565b895f5260205f205f5b85811015613d525781548b8201860152908301908801613d37565b8a016040019650505b509398975050505050505050565b6001600160a01b0381168114611730575f80fd5b80516138f8816138d8565b5f8060408385031215613d99575f80fd5b82516001600160401b0380821115613daf575f80fd5b9084019060608287031215613dc2575f80fd5b613dca6139d3565b82518152602080840151613ddd81613d69565b82820152604084015183811115613df2575f80fd5b80850194505087601f850112613e06575f80fd5b83519250613e16613aab84613a2b565b8381528882858701011115613e29575f80fd5b613e3884838301848801613b32565b80604084015250819550613e4d818801613d7d565b9450505050509250929050565b5f6001600160401b03808316818103613e7557613e75613af7565b6001019392505050565b81810381811115610a8b57610a8b613af7565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a8b57610a8b613af7565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b2b57613b2b613af7565b601f82111561101257805f5260205f20601f840160051c81016020851015613fd15750805b601f840160051c820191505b818110156115d9575f8155600101613fdd565b81516001600160401b03811115614009576140096139bf565b61401d816140178454613c66565b84613fac565b602080601f831160018114614050575f84156140395750858301515b5f19600386901b1c1916600185901b1785556140a7565b5f85815260208120601f198616915b8281101561407e5788860151825594840194600190910190840161405f565b508582101561409b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156140bf575f80fd5b813561171881613d69565b6001600160401b038181168382160280821691908281146140ed576140ed613af7565b505092915050565b5f6001600160401b038084168061410e5761410e613b9d565b92169190910492915050565b5f825161412b818460208701613b32565b9190910192915050565b5f60208284031215614145575f80fd5b813560ff81168114611718575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 6127a29df..2ec4a29d9 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"registerValidationMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodEnded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"enumValidatorStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612b90380380612b9083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a438061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd366004612339565b61023f565b005b6101226100f2366004612339565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101226101433660046123fd565b610384565b6100e26101563660046124a0565b6103a4565b61016e610169366004612339565b61070d565b6040516001600160401b03909116815260200161012c565b6100e2610721565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612339565b610734565b6100e26101f33660046124a0565b610740565b6101ba6005600160991b0181565b6100e2610214366004612339565b6108fd565b6100e26102273660046124de565b610a11565b6100e261023a36600461251a565b610b1f565b5f8181525f80516020612a1783398151915260205260409020545f805160206129f78339815191529060039060ff16600581111561027f5761027f612535565b146102e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f8281526006820160205260408120600301546103119084906001600160401b031683610b59565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061033e90849060040161256b565b6020604051808303815f875af115801561035a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037e919061259d565b50505050565b5f61038d610d76565b61039984868585610dd1565b90505b949350505050565b5f805160206129f78339815191525f6103bc83611239565b90505f806103cd836040015161141a565b9150915080156104325760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e0565b5f828152600685016020526040808220815161010081019092528054829060ff16600581111561046457610464612535565b600581111561047557610475612535565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156104fc576104fc612535565b148061051a575060018251600581111561051857610518612535565b145b6105795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016102e0565b60038251600581111561058e5761058e612535565b0361059b5750600461059f565b5060055b6020808301515f908152600788019091526040812055818160058111156105c8576105c8612535565b908160058111156105db576105db612535565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561060f5761060f612535565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156106da576106da612535565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61071782611679565b60a0015192915050565b610729610d76565b6107325f61178a565b565b61073d816117fa565b50565b5f805160206129f78339815191525f61075883611239565b90505f80610769836040015161141a565b91509150806107cb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e0565b5f828152600585016020526040812080546107e5906125b4565b9050118015610817575060015f83815260068601602052604090205460ff16600581111561081557610815612535565b145b6108335760405162461bcd60e51b81526004016102e0906125ec565b5f828152600585016020526040812061084b916122ef565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206129f7833981519152929190610945906125b4565b9050118015610977575060015f83815260068301602052604090205460ff16600581111561097557610975612535565b145b6109935760405162461bcd60e51b81526004016102e0906125ec565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cc9190600401612633565b6020604051808303815f875af11580156109e8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0c919061259d565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a555750825b90505f826001600160401b03166001148015610a705750303b155b905081158015610a7e575080155b15610a9c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ac657845460ff60401b1916600160401b1785555b610ad08787611b98565b8315610b1657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610b27610d76565b6001600160a01b038116610b5057604051631e4fbdf760e01b81525f60048201526024016102e0565b61073d8161178a565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610bd257610b928160016126d1565b610b9d9060086126ea565b5081515f90839083908110610bb457610bb4612701565b60200101906001600160f81b03191690815f1a905350600101610b7e565b505f5b6004811015610c3557610be98160036126d1565b610bf49060086126ea565b6001901c60f81b82610c07836002612715565b81518110610c1757610c17612701565b60200101906001600160f81b03191690815f1a905350600101610bd5565b505f5b6020811015610c9757610c4c81601f6126d1565b610c579060086126ea565b86901c60f81b82610c69836006612715565b81518110610c7957610c79612701565b60200101906001600160f81b03191690815f1a905350600101610c38565b505f5b6008811015610d0257610cae8160076126d1565b610cb99060086126ea565b6001600160401b038616901c60f81b82610cd4836026612715565b81518110610ce457610ce4612701565b60200101906001600160f81b03191690815f1a905350600101610c9a565b505f5b6008811015610d6d57610d198160076126d1565b610d249060086126ea565b6001600160401b038516901c60f81b82610d3f83602e612715565b81518110610d4f57610d4f612701565b60200101906001600160f81b03191690815f1a905350600101610d05565b50949350505050565b33610da87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107325760405163118cdaa760e01b81523360048201526024016102e0565b5f610dda611bb6565b5f805160206129f7833981519152426001600160401b038516118015610e1457506001600160401b038416610e12426202a300612715565b115b610e765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e0565b85610ecd5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e0565b5f86815260078201602052604090205415610f3b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e0565b8251603014610fa25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e0565b610fab85611c00565b5f80610ff26040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611da1565b5f828152600586016020526040902091935091506110108282612773565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061103d90859060040161256b565b6020604051808303815f875af1158015611059573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107d919061259d565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156110ff576110ff612535565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556111c083612146565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f805160206129f78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156112ae573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112d59190810190612841565b915091508061133c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016102e0565b825482511461139f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102e0565b60208201516001600160a01b0316156114125760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102e0565b509392505050565b5f80825160271461147f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016102e0565b5f805b60028110156114ce576114968160016126d1565b6114a19060086126ea565b61ffff168582815181106114b7576114b7612701565b016020015160f81c901b9190911790600101611482565b5061ffff81161561152d5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016102e0565b5f805b6004811015611588576115448160036126d1565b61154f9060086126ea565b63ffffffff1686611561836002612715565b8151811061157157611571612701565b016020015160f81c901b9190911790600101611530565b5063ffffffff81166002146115ef5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016102e0565b5f805b60208110156116445761160681601f6126d1565b6116119060086126ea565b8761161d836006612715565b8151811061162d5761162d612701565b016020015160f81c901b91909117906001016115f2565b505f8660268151811061165957611659612701565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f80516020612a1783398151915290528390208351918201909352825491925f805160206129f783398151915292829060ff16600581111561170157611701612535565b600581111561171257611712612535565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181525f80516020612a1783398151915260205260408082208151610100810190925280545f805160206129f783398151915293929190829060ff16600581111561184857611848612535565b600581111561185957611859612535565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156118e1576118e1612535565b1461193d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e0565b60408101516001600160a01b0316336001600160a01b0316146119b75760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102e0565b6119c48160a00151611c00565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115611a0857611a08612535565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f611ad484611ace81612146565b5f610b59565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611b0390859060040161256b565b6020604051808303815f875af1158015611b1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b43919061259d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611ba06121e0565b611ba982612229565b611bb28161224a565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bfa57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206129f78339815191529060ff165f03611c3e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c8690836126d1565b10611ca2576001600160401b0384166040830152808252611cc1565b8382604001818151611cb49190612913565b6001600160401b03169052505b5f826020015183604001516064611cd8919061293a565b611ce29190612965565b600285015490915060ff9081169082161115611d5d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e0b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e8257611e428160016126d1565b611e4d9060086126ea565b5081515f90839083908110611e6457611e64612701565b60200101906001600160f81b03191690815f1a905350600101611e2e565b505f5b6004811015611ee057611e998160036126d1565b611ea49060086126ea565b505f82611eb2836002612715565b81518110611ec257611ec2612701565b60200101906001600160f81b03191690815f1a905350600101611e85565b505f5b6020811015611f3d5784518160208110611eff57611eff612701565b1a60f81b82611f0f836006612715565b81518110611f1f57611f1f612701565b60200101906001600160f81b03191690815f1a905350600101611ee3565b505f5b6020811015611f9d5784602001518160208110611f5f57611f5f612701565b1a60f81b82611f6f836026612715565b81518110611f7f57611f7f612701565b60200101906001600160f81b03191690815f1a905350600101611f40565b505f5b600881101561201157611fb48160076126d1565b611fbf9060086126ea565b60ff1685604001516001600160401b0316901c60f81b82826046611fe39190612715565b81518110611ff357611ff3612701565b60200101906001600160f81b03191690815f1a905350600101611fa0565b505f5b603081101561207c578460800151818151811061203357612033612701565b01602001516001600160f81b0319168261204e83604e612715565b8151811061205e5761205e612701565b60200101906001600160f81b03191690815f1a905350600101612014565b505f5b60088110156120ee576120938160076126d1565b61209e9060086126ea565b60608601516001600160401b0390811691161c60f81b826120c083607e612715565b815181106120d0576120d0612701565b60200101906001600160f81b03191690815f1a90535060010161207f565b506002816040516120ff9190612996565b602060405180830381855afa15801561211a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061213d919061259d565b94909350915050565b5f8181525f80516020612a178339815191526020526040812060030180545f805160206129f7833981519152916001600160401b039091169081908461218b836129b1565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661073257604051631afcd79f60e31b815260040160405180910390fd5b6122316121e0565b61223961225b565b61224161226b565b61073d81612273565b6122526121e0565b61073d816122df565b6122636121e0565b6107326122e7565b6107326121e0565b61227b6121e0565b80355f805160206129f783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122c560608301604084016129d6565b600291909101805460ff191660ff90921691909117905550565b610b276121e0565b6121ba6121e0565b5080546122fb906125b4565b5f825580601f1061230a575050565b601f0160209004905f5260205f209081019061073d91905b80821115612335575f8155600101612322565b5090565b5f60208284031215612349575f80fd5b5035919050565b80356001600160401b0381168114612366575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156123a1576123a161236b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156123cf576123cf61236b565b604052919050565b5f6001600160401b038211156123ef576123ef61236b565b50601f01601f191660200190565b5f805f8060808587031215612410575f80fd5b61241985612350565b93506020850135925061242e60408601612350565b915060608501356001600160401b03811115612448575f80fd5b8501601f81018713612458575f80fd5b803561246b612466826123d7565b6123a7565b81815288602083850101111561247f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156124b0575f80fd5b813563ffffffff811681146124c3575f80fd5b9392505050565b6001600160a01b038116811461073d575f80fd5b5f8082840360808112156124f0575f80fd5b60608112156124fd575f80fd5b50829150606083013561250f816124ca565b809150509250929050565b5f6020828403121561252a575f80fd5b81356124c3816124ca565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561256357818101518382015260200161254b565b50505f910152565b602081525f8251806020840152612589816040850160208701612549565b601f01601f19169190910160400192915050565b5f602082840312156125ad575f80fd5b5051919050565b600181811c908216806125c857607f821691505b6020821081036125e657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612645816125b4565b806020870152604060018084165f81146126665760018114612682576126af565b60ff19851660408a0152604084151560051b8a010195506126af565b895f5260205f205f5b858110156126a65781548b820186015290830190880161268b565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156126e4576126e46126bd565b92915050565b80820281158282048414176126e4576126e46126bd565b634e487b7160e01b5f52603260045260245ffd5b808201808211156126e4576126e46126bd565b601f821115610a0c57805f5260205f20601f840160051c8101602085101561274d5750805b601f840160051c820191505b8181101561276c575f8155600101612759565b5050505050565b81516001600160401b0381111561278c5761278c61236b565b6127a08161279a84546125b4565b84612728565b602080601f8311600181146127d3575f84156127bc5750858301515b5f19600386901b1c1916600185901b17855561282a565b5f85815260208120601f198616915b82811015612801578886015182559484019460019091019084016127e2565b508582101561281e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b80518015158114612366575f80fd5b5f8060408385031215612852575f80fd5b82516001600160401b0380821115612868575f80fd5b908401906060828703121561287b575f80fd5b61288361237f565b82518152602080840151612896816124ca565b828201526040840151838111156128ab575f80fd5b80850194505087601f8501126128bf575f80fd5b835192506128cf612466846123d7565b83815288828587010111156128e2575f80fd5b6128f184838301848801612549565b80604084015250819550612906818801612832565b9450505050509250929050565b6001600160401b03818116838216019080821115612933576129336126bd565b5092915050565b6001600160401b0381811683821602808216919082811461295d5761295d6126bd565b505092915050565b5f6001600160401b038084168061298a57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516129a7818460208701612549565b9190910192915050565b5f6001600160401b038083168181036129cc576129cc6126bd565b6001019392505050565b5f602082840312156129e6575f80fd5b813560ff811681146124c3575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612c18380380612c1883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612acb8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd3660046123c1565b61023f565b005b6101226100f23660046123c1565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612485565b610414565b6100e2610156366004612528565b610434565b61016e6101693660046123c1565b61079d565b6040516001600160401b03909116815260200161012c565b6100e26107b1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e03660046123c1565b6107c4565b6100e26101f3366004612528565b6107d0565b6101ba6005600160991b0181565b6100e26102143660046123c1565b61098d565b6100e2610227366004612566565b610aa1565b6100e261023a3660046125a2565b610baf565b5f8181525f80516020612a9f83398151915260205260408082208151610100810190925280545f80516020612a7f83398151915293929190829060ff16600581111561028d5761028d6125bd565b600581111561029e5761029e6125bd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610323576103236125bd565b1461038d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103b28584608001515f610be9565b6040518263ffffffff1660e01b81526004016103ce91906125f3565b6020604051808303815f875af11580156103ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040e9190612625565b50505050565b5f61041d610e06565b61042984868585610e61565b90505b949350505050565b5f80516020612a7f8339815191525f61044c836112b3565b90505f8061045d8360400151611494565b9150915080156104c25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610384565b5f828152600685016020526040808220815161010081019092528054829060ff1660058111156104f4576104f46125bd565b6005811115610505576105056125bd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561058c5761058c6125bd565b14806105aa57506001825160058111156105a8576105a86125bd565b145b6106095760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610384565b60038251600581111561061e5761061e6125bd565b0361062b5750600461062f565b5060055b6020808301515f90815260078801909152604081205581816005811115610658576106586125bd565b9081600581111561066b5761066b6125bd565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561069f5761069f6125bd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561076a5761076a6125bd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107a7826116f3565b60a0015192915050565b6107b9610e06565b6107c25f611804565b565b6107cd81611874565b50565b5f80516020612a7f8339815191525f6107e8836112b3565b90505f806107f98360400151611494565b915091508061085b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610384565b5f828152600585016020526040812080546108759061263c565b90501180156108a7575060015f83815260068601602052604090205460ff1660058111156108a5576108a56125bd565b145b6108c35760405162461bcd60e51b815260040161038490612674565b5f82815260058501602052604081206108db91612377565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a7f8339815191529291906109d59061263c565b9050118015610a07575060015f83815260068301602052604090205460ff166005811115610a0557610a056125bd565b145b610a235760405162461bcd60e51b815260040161038490612674565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a5c91906004016126bb565b6020604051808303815f875af1158015610a78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c9190612625565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ae55750825b90505f826001600160401b03166001148015610b005750303b155b905081158015610b0e575080155b15610b2c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b5657845460ff60401b1916600160401b1785555b610b608787611c12565b8315610ba657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610bb7610e06565b6001600160a01b038116610be057604051631e4fbdf760e01b81525f6004820152602401610384565b6107cd81611804565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610c6257610c22816001612759565b610c2d906008612772565b5081515f90839083908110610c4457610c44612789565b60200101906001600160f81b03191690815f1a905350600101610c0e565b505f5b6004811015610cc557610c79816003612759565b610c84906008612772565b6001901c60f81b82610c9783600261279d565b81518110610ca757610ca7612789565b60200101906001600160f81b03191690815f1a905350600101610c65565b505f5b6020811015610d2757610cdc81601f612759565b610ce7906008612772565b86901c60f81b82610cf983600661279d565b81518110610d0957610d09612789565b60200101906001600160f81b03191690815f1a905350600101610cc8565b505f5b6008811015610d9257610d3e816007612759565b610d49906008612772565b6001600160401b038616901c60f81b82610d6483602661279d565b81518110610d7457610d74612789565b60200101906001600160f81b03191690815f1a905350600101610d2a565b505f5b6008811015610dfd57610da9816007612759565b610db4906008612772565b6001600160401b038516901c60f81b82610dcf83602e61279d565b81518110610ddf57610ddf612789565b60200101906001600160f81b03191690815f1a905350600101610d95565b50949350505050565b33610e387f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107c25760405163118cdaa760e01b8152336004820152602401610384565b5f610e6a611c30565b5f80516020612a7f833981519152426001600160401b038516118015610ea457506001600160401b038416610ea2426202a30061279d565b115b610f065760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610384565b85610f5d5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610384565b5f86815260078201602052604090205415610fcb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610384565b82516030146110325760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610384565b61103b85611c7a565b5f806110826040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611e1b565b5f828152600586016020526040902091935091506110a082826127fb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906110cd9085906004016125f3565b6020604051808303815f875af11580156110e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110d9190612625565b6040805161010081018252600180825260208083018e905233838501526001600160401b038d16606084018190526080840183905260a08401525f60c0840181905260e0840181905288815260068a01909152929092208151815494955091939092839160ff191690836005811115611188576111886125bd565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061042c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f80516020612a7f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611328573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261134f91908101906128c9565b91509150806113b65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610384565b82548251146114195760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610384565b60208201516001600160a01b03161561148c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610384565b509392505050565b5f8082516027146114f95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610384565b5f805b600281101561154857611510816001612759565b61151b906008612772565b61ffff1685828151811061153157611531612789565b016020015160f81c901b91909117906001016114fc565b5061ffff8116156115a75760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610384565b5f805b6004811015611602576115be816003612759565b6115c9906008612772565b63ffffffff16866115db83600261279d565b815181106115eb576115eb612789565b016020015160f81c901b91909117906001016115aa565b5063ffffffff81166002146116695760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610384565b5f805b60208110156116be5761168081601f612759565b61168b906008612772565b8761169783600661279d565b815181106116a7576116a7612789565b016020015160f81c901b919091179060010161166c565b505f866026815181106116d3576116d3612789565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f80516020612a9f83398151915290528390208351918201909352825491925f80516020612a7f83398151915292829060ff16600581111561177b5761177b6125bd565b600581111561178c5761178c6125bd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181525f80516020612a9f83398151915260205260408082208151610100810190925280545f80516020612a7f83398151915293929190829060ff1660058111156118c2576118c26125bd565b60058111156118d3576118d36125bd565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561195b5761195b6125bd565b146119b75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610384565b60408101516001600160a01b0316336001600160a01b031614611a315760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610384565b611a3e8160a00151611c7a565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115611a8257611a826125bd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f611b4e84611b48816121e6565b5f610be9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611b7d9085906004016125f3565b6020604051808303815f875af1158015611b99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbd9190612625565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611c1a612268565b611c23826122b1565b611c2c816122d2565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611c7457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a7f8339815191529060ff165f03611cb8575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d009083612759565b10611d1c576001600160401b0384166040830152808252611d3b565b8382604001818151611d2e919061299b565b6001600160401b03169052505b5f826020015183604001516064611d5291906129c2565b611d5c91906129ed565b600285015490915060ff9081169082161115611dd75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610384565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e855760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610384565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611efc57611ebc816001612759565b611ec7906008612772565b5081515f90839083908110611ede57611ede612789565b60200101906001600160f81b03191690815f1a905350600101611ea8565b505f5b6004811015611f5a57611f13816003612759565b611f1e906008612772565b505f82611f2c83600261279d565b81518110611f3c57611f3c612789565b60200101906001600160f81b03191690815f1a905350600101611eff565b505f5b6020811015611fb75784518160208110611f7957611f79612789565b1a60f81b82611f8983600661279d565b81518110611f9957611f99612789565b60200101906001600160f81b03191690815f1a905350600101611f5d565b505f5b60208110156120175784602001518160208110611fd957611fd9612789565b1a60f81b82611fe983602661279d565b81518110611ff957611ff9612789565b60200101906001600160f81b03191690815f1a905350600101611fba565b505f5b600881101561208b5761202e816007612759565b612039906008612772565b60ff1685604001516001600160401b0316901c60f81b8282604661205d919061279d565b8151811061206d5761206d612789565b60200101906001600160f81b03191690815f1a90535060010161201a565b505f5b60308110156120f657846080015181815181106120ad576120ad612789565b01602001516001600160f81b031916826120c883604e61279d565b815181106120d8576120d8612789565b60200101906001600160f81b03191690815f1a90535060010161208e565b505f5b60088110156121685761210d816007612759565b612118906008612772565b60608601516001600160401b0390811691161c60f81b8261213a83607e61279d565b8151811061214a5761214a612789565b60200101906001600160f81b03191690815f1a9053506001016120f9565b506002816040516121799190612a1e565b602060405180830381855afa158015612194573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121b79190612625565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f8181525f80516020612a9f8339815191526020526040812060030180545f80516020612a7f833981519152916001600160401b03909116908361222983612a39565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107c257604051631afcd79f60e31b815260040160405180910390fd5b6122b9612268565b6122c16122e3565b6122c96122f3565b6107cd816122fb565b6122da612268565b6107cd81612367565b6122eb612268565b6107c261236f565b6107c2612268565b612303612268565b80355f80516020612a7f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561234d6060830160408401612a5e565b600291909101805460ff191660ff90921691909117905550565b610bb7612268565b6121c0612268565b5080546123839061263c565b5f825580601f10612392575050565b601f0160209004905f5260205f20908101906107cd91905b808211156123bd575f81556001016123aa565b5090565b5f602082840312156123d1575f80fd5b5035919050565b80356001600160401b03811681146123ee575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612429576124296123f3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612457576124576123f3565b604052919050565b5f6001600160401b03821115612477576124776123f3565b50601f01601f191660200190565b5f805f8060808587031215612498575f80fd5b6124a1856123d8565b9350602085013592506124b6604086016123d8565b915060608501356001600160401b038111156124d0575f80fd5b8501601f810187136124e0575f80fd5b80356124f36124ee8261245f565b61242f565b818152886020838501011115612507575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612538575f80fd5b813563ffffffff8116811461254b575f80fd5b9392505050565b6001600160a01b03811681146107cd575f80fd5b5f808284036080811215612578575f80fd5b6060811215612585575f80fd5b50829150606083013561259781612552565b809150509250929050565b5f602082840312156125b2575f80fd5b813561254b81612552565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156125eb5781810151838201526020016125d3565b50505f910152565b602081525f82518060208401526126118160408501602087016125d1565b601f01601f19169190910160400192915050565b5f60208284031215612635575f80fd5b5051919050565b600181811c9082168061265057607f821691505b60208210810361266e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546126cd8161263c565b806020870152604060018084165f81146126ee576001811461270a57612737565b60ff19851660408a0152604084151560051b8a01019550612737565b895f5260205f205f5b8581101561272e5781548b8201860152908301908801612713565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561276c5761276c612745565b92915050565b808202811582820484141761276c5761276c612745565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561276c5761276c612745565b601f821115610a9c57805f5260205f20601f840160051c810160208510156127d55750805b601f840160051c820191505b818110156127f4575f81556001016127e1565b5050505050565b81516001600160401b03811115612814576128146123f3565b61282881612822845461263c565b846127b0565b602080601f83116001811461285b575f84156128445750858301515b5f19600386901b1c1916600185901b1785556128b2565b5f85815260208120601f198616915b828110156128895788860151825594840194600190910190840161286a565b50858210156128a657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b805180151581146123ee575f80fd5b5f80604083850312156128da575f80fd5b82516001600160401b03808211156128f0575f80fd5b9084019060608287031215612903575f80fd5b61290b612407565b8251815260208084015161291e81612552565b82820152604084015183811115612933575f80fd5b80850194505087601f850112612947575f80fd5b835192506129576124ee8461245f565b838152888285870101111561296a575f80fd5b612979848383018488016125d1565b8060408401525081955061298e8188016128ba565b9450505050509250929050565b6001600160401b038181168382160190808211156129bb576129bb612745565b5092915050565b6001600160401b038181168382160280821691908281146129e5576129e5612745565b505092915050565b5f6001600160401b0380841680612a1257634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a2f8184602087016125d1565b9190910192915050565b5f6001600160401b03808316818103612a5457612a54612745565b6001019392505050565b5f60208284031215612a6e575f80fd5b813560ff8116811461254b575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index b24da729e..27edaf15b 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -158,7 +158,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Construct the delegation ID. This is guaranteed to be unique since it is // constructed using a new nonce. - uint64 nonce = _getAndIncrementNonce(validationID); + uint64 nonce = _incrementAndGetNonce(validationID); bytes32 delegationID = keccak256(abi.encodePacked(validationID, delegatorAddress, nonce)); _checkAndUpdateChurnTracker(weight); @@ -262,7 +262,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" ); - uint64 nonce = _getAndIncrementNonce(validationID); + uint64 nonce = _incrementAndGetNonce(validationID); // Set the delegator status to pending removed, so that it can be properly removed in // the complete step, even if the delivered nonce is greater than the nonce used to @@ -299,8 +299,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; require( - $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegation registration not pending" + delegator.status == DelegatorStatus.PendingAdded + || delegator.status == DelegatorStatus.PendingRemoved, + "PoSValidatorManager: delegation status not pending" ); Validator memory validator = _getValidator(delegator.validationID); diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index c3ac3d278..ec6b3ec00 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -142,13 +142,12 @@ abstract contract ValidatorManager is nodeID: nodeID, owner: _msgSender(), startingWeight: weight, - messageNonce: 0, + messageNonce: 1, weight: weight, startedAt: 0, // The validation period only starts once the registration is acknowledged. endedAt: 0 }); - // Increment the nonce for the next usage. - _getAndIncrementNonce(validationID); + emit ValidationPeriodCreated(validationID, nodeID, messageID, weight, registrationExpiry); return validationID; @@ -235,7 +234,7 @@ abstract contract ValidatorManager is // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), 0); + .packSetSubnetValidatorWeightMessage(validationID, _incrementAndGetNonce(validationID), 0); bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); @@ -250,18 +249,18 @@ abstract contract ValidatorManager is // solhint-disable-next-line function resendEndValidatorMessage(bytes32 validationID) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + Validator memory validator = $._validationPeriods[validationID]; require( - $._validationPeriods[validationID].status == ValidatorStatus.PendingRemoved, + validator.status == ValidatorStatus.PendingRemoved, "ValidatorManager: Validator not pending removal" ); - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage( - validationID, $._validationPeriods[validationID].messageNonce, 0 + WARP_MESSENGER.sendWarpMessage( + ValidatorMessages.packSetSubnetValidatorWeightMessage( + validationID, validator.messageNonce, 0 + ) ); - - WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); } /** @@ -347,11 +346,10 @@ abstract contract ValidatorManager is $._churnTracker = churnTracker; } - function _getAndIncrementNonce(bytes32 validationID) internal returns (uint64) { + function _incrementAndGetNonce(bytes32 validationID) internal returns (uint64) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - uint64 currentNonce = $._validationPeriods[validationID].messageNonce; $._validationPeriods[validationID].messageNonce++; - return currentNonce; + return $._validationPeriods[validationID].messageNonce; } function _getPChainWarpMessage(uint32 messageIndex) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index c6179ef21..3e939a11a 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -162,7 +162,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); } @@ -181,11 +181,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage( - validationID, 1, DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + validationID, 2, DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT ); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); posValidatorManager.resendUpdateDelegation(delegationID); @@ -206,14 +206,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); _setUpCompleteDelegatorRegistration( validationID, delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 + 2 ); } @@ -234,7 +234,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); address delegator2 = address(0x5678567856785678567856785678567856785678); bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ @@ -244,14 +244,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 3 }); // Complete registration of delegator2 with delegator1's nonce // Note that registering delegator1 with delegator2's nonce is valid bytes memory setValidatorWeightPayload = ValidatorMessages .packSubnetValidatorWeightUpdateMessage( - validationID, 1, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT + validationID, 2, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT ); _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); @@ -277,7 +277,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); address delegator2 = address(0x5678567856785678567856785678567856785678); _setUpInitializeDelegatorRegistration({ @@ -287,7 +287,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 3 }); // Mark delegator1 as registered by delivering the weight update from nonce 2 (delegator 2's nonce) _setUpCompleteDelegatorRegistration( @@ -295,7 +295,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 2 + 3 ); } @@ -314,14 +314,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); _setUpCompleteDelegatorRegistration( validationID, delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 + 2 ); _setUpInitializeEndDelegation({ validationID: validationID, @@ -329,7 +329,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID: delegationID, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 3 }); } @@ -348,14 +348,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); _setUpCompleteDelegatorRegistration( validationID, delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 + 2 ); _setUpInitializeEndDelegation({ validationID: validationID, @@ -363,10 +363,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID: delegationID, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 3 }); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 3, DEFAULT_WEIGHT); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); posValidatorManager.resendUpdateDelegation(delegationID); } @@ -386,14 +386,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); _setUpCompleteDelegatorRegistration( validationID, delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 + 2 ); _setUpInitializeEndDelegation({ validationID: validationID, @@ -401,9 +401,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID: delegationID, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 3 }); - _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); + _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 3); } function testCompleteEndDelegationWrongNonce() public { @@ -423,14 +423,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); _setUpCompleteDelegatorRegistration( validationID, delegationID1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 + 2 ); address delegator2 = address(0x5678567856785678567856785678567856785678); bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ @@ -440,14 +440,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 3 }); _setUpCompleteDelegatorRegistration( validationID, delegationID2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 2 + 3 ); // Initialize end delegation for both delegators @@ -457,7 +457,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID: delegationID1, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 3 + expectedNonce: 4 }); _setUpInitializeEndDelegation({ validationID: validationID, @@ -465,14 +465,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID: delegationID2, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 4 + expectedNonce: 5 }); // Complete ending delegator2 with delegator1's nonce // Note that ending delegator1 with delegator2's nonce is valid bytes memory setValidatorWeightPayload = ValidatorMessages .packSubnetValidatorWeightUpdateMessage( - validationID, 3, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT + validationID, 4, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT ); _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); @@ -497,14 +497,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 + expectedNonce: 2 }); _setUpCompleteDelegatorRegistration( validationID, delegationID1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 + 2 ); address delegator2 = address(0x5678567856785678567856785678567856785678); bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ @@ -514,14 +514,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 3 }); _setUpCompleteDelegatorRegistration( validationID, delegationID2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 2 + 3 ); // Initialize end delegation for both delegators @@ -531,7 +531,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID: delegationID1, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 3 + expectedNonce: 4 }); _setUpInitializeEndDelegation({ validationID: validationID, @@ -539,11 +539,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID: delegationID2, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 4 + expectedNonce: 5 }); // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) - _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); + _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 5); } function testValueToWeight() public view { diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 605aefb87..f9013f1aa 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -151,7 +151,7 @@ abstract contract ValidatorManagerTest is Test { completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); validatorManager.resendEndValidatorMessage(validationID); } @@ -276,7 +276,7 @@ abstract contract ValidatorManagerTest is Test { vm.warp(completionTimestamp); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp);