diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index cc5cc1ed5..d8fef8f34 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -31,11 +31,12 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MinimumDelegationFeeRate *big.Int + RewardCalculator common.Address } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. @@ -47,8 +48,8 @@ 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: "0x608060405234801561000f575f80fd5b506040516148ac3803806148ac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61475f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610246578063a3a65e4814610259578063b771b3bc1461026c578063ba3a4b9714610292578063bee0a03f146102a5575f80fd5b806366435abf146101fa57806376f786211461020d578063872fda641461022057806398f3e2b414610233575f80fd5b80632e2194d8116100d95780632e2194d814610196578063467ef06f146101c15780635297fae6146101d457806362065856146101e7575f80fd5b80630118acc41461010a5780630322ed981461011f5780630cdd09851461013257806327f39ca814610183575b5f80fd5b61011d610118366004613dd2565b6102b8565b005b61011d61012d366004613e0d565b610722565b610170610140366004613e0d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61011d610191366004613e38565b6108f2565b6101a96101a4366004613e0d565b6109d6565b6040516001600160401b03909116815260200161017a565b61011d6101cf366004613e75565b6109ec565b61011d6101e2366004613e8e565b610a17565b6101706101f5366004613ecc565b610be7565b6101a9610208366004613e0d565b610c00565b61011d61021b366004613dd2565b610c14565b61017061022e366004613f77565b610c34565b61011d610241366004613e8e565b610c59565b610170610254366004614013565b610e67565b61011d610267366004613e75565b610e7a565b61027a6005600160991b0181565b6040516001600160a01b03909116815260200161017a565b61011d6102a0366004613e0d565b611037565b61011d6102b3366004613e0d565b6112c4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146b383398151915291841561030a5761030782856113d3565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561033c5761033c614033565b600481111561034d5761034d614033565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103d4576103d4614033565b146104265760405162461bcd60e51b815260206004820152602a60248201525f805160206146d38339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461048b5760405162461bcd60e51b815260206004820152603360248201525f805160206146d38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161041d565b5f6104958461166f565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104e2576104e2614033565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105b4856116f1565b905082606001516001600160401b03168160a001516001600160401b03161161062b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161041d565b5f83606001518260a00151610640919061405b565b905061064c86826117d0565b5f6005600160991b0163ee5b48eb610665898786611818565b6040518263ffffffff1660e01b815260040161068191906140a4565b6020604051808303815f875af115801561069d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c191906140d6565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061473383398151915260205260408082208151610100810190925280545f805160206146f383398151915293929190829060ff16600581111561077057610770614033565b600581111561078157610781614033565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561080657610806614033565b1461086b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb6108908584608001515f611818565b6040518263ffffffff1660e01b81526004016108ac91906140a4565b6020604051808303815f875af11580156108c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ec91906140d6565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061093b575080546001600160401b03808416911610155b156109595760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109848484611a35565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109e664e8d4a5100083614101565b92915050565b5f6109f682611a4f565b9050610a1381606001516001600160401b03168260400151611dc2565b5050565b5f805160206146b38339815191525f610a2f84611df8565b90505f80610a408360400151611fd9565b50915091505f610a4f836116f1565b9050816001600160401b031681608001516001600160401b03161015610a875760405162461bcd60e51b815260040161041d90614114565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610acc5760405162461bcd60e51b815260040161041d90614156565b60015f87815260038701602052604090205460ff166004811115610af257610af2614033565b14610b5b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161041d565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109e66001600160401b03831664e8d4a5100061419f565b5f610c0a826116f1565b60a0015192915050565b8115610c2657610c2483826113d3565b505b610c2f83612214565b505050565b5f80610c3f866125b2565b9050610c4d8582868661265f565b9150505b949350505050565b5f805160206146b38339815191525f610c7184611df8565b90505f80610c828360400151611fd9565b50915091505f610c91836116f1565b9050816001600160401b031681608001516001600160401b03161015610cc95760405162461bcd60e51b815260040161041d90614114565b5f8681526003808701602052604090912001546001600160401b0380841691161115610d075760405162461bcd60e51b815260040161041d90614156565b60035f87815260038701602052604090205460ff166004811115610d2d57610d2d614033565b14610d815760405162461bcd60e51b815260206004820152603160248201525f805160206146d38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161041d565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610e259190611dc2565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610e73833384612aa5565b9392505050565b5f805160206146f38339815191525f610e9283611df8565b90505f80610ea38360400151612e17565b9150915080610f055760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161041d565b5f82815260058501602052604081208054610f1f906141b6565b9050118015610f51575060015f83815260068601602052604090205460ff166005811115610f4f57610f4f614033565b145b610f6d5760405162461bcd60e51b815260040161041d906141ee565b5f8281526005850160205260408120610f8591613d1a565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f805160206146b383398151915293929190829060ff16600481111561109857611098614033565b60048111156110a9576110a9614033565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561113057611130614033565b148061114e575060038151600481111561114c5761114c614033565b145b6111a25760405162461bcd60e51b815260206004820152603260248201525f805160206146d3833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161041d565b5f6111b082604001516116f1565b905080608001516001600160401b03165f036112345760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb611261846040015184608001518560a00151611818565b6040518263ffffffff1660e01b815260040161127d91906140a4565b6020604051808303815f875af1158015611299573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112bd91906140d6565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206146f383398151915292919061130c906141b6565b905011801561133e575060015f83815260068301602052604090205460ff16600581111561133c5761133c614033565b145b61135a5760405162461bcd60e51b815260040161041d906141ee565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916113939190600401614235565b6020604051808303815f875af11580156113af573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2f91906140d6565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561141e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261144591908101906142ca565b91509150806114a85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161041d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150f91906140d6565b8251146115735760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161041d565b60208201516001600160a01b0316156115e95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161041d565b5f806115f88460400151612fb8565b915091508187146116655760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161041d565b9695505050505050565b5f8181525f805160206147338339815191526020526040812060030180545f805160206146f3833981519152916001600160401b0390911690836116b28361439c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6116f9613d51565b5f8281525f805160206147338339815191526020526040908190208151610100810190925280545f805160206146f3833981519152929190829060ff16600581111561174757611747614033565b600581111561175857611758614033565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614733833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611891576118518160016143c1565b61185c90600861419f565b5081515f90839083908110611873576118736143d4565b60200101906001600160f81b03191690815f1a90535060010161183d565b505f5b60048110156118f4576118a88160036143c1565b6118b390600861419f565b6001901c60f81b826118c68360026143e8565b815181106118d6576118d66143d4565b60200101906001600160f81b03191690815f1a905350600101611894565b505f5b60208110156119565761190b81601f6143c1565b61191690600861419f565b86901c60f81b826119288360066143e8565b81518110611938576119386143d4565b60200101906001600160f81b03191690815f1a9053506001016118f7565b505f5b60088110156119c15761196d8160076143c1565b61197890600861419f565b6001600160401b038616901c60f81b826119938360266143e8565b815181106119a3576119a36143d4565b60200101906001600160f81b03191690815f1a905350600101611959565b505f5b6008811015611a2c576119d88160076143c1565b6119e390600861419f565b6001600160401b038516901c60f81b826119fe83602e6143e8565b81518110611a0e57611a0e6143d4565b60200101906001600160f81b03191690815f1a9053506001016119c4565b50949350505050565b611a3d613190565b611a46826131db565b610a1381613221565b611a57613d51565b5f805160206146f38339815191525f611a6f84611df8565b90505f80611a808360400151612e17565b915091508015611ae55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161041d565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611b1757611b17614033565b6005811115611b2857611b28614033565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611baf57611baf614033565b1480611bcd5750600182516005811115611bcb57611bcb614033565b145b611c2c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161041d565b600382516005811115611c4157611c41614033565b03611c4e57506004611c52565b5060055b6020808301515f90815260078801909152604081205581816005811115611c7b57611c7b614033565b90816005811115611c8e57611c8e614033565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611cc257611cc2614033565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d8d57611d8d614033565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a13906001600160a01b031682846132d5565b60408051606080820183525f8083526020830181905292820152905f805160206146f38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e6d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e9491908101906142ca565b9150915080611efb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161041d565b8254825114611f5e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161041d565b60208201516001600160a01b031615611fd15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161041d565b509392505050565b5f805f8351603614611ffd5760405162461bcd60e51b815260040161041d906143fb565b5f805b600281101561204c576120148160016143c1565b61201f90600861419f565b61ffff16868281518110612035576120356143d4565b016020015160f81c901b9190911790600101612000565b5061ffff81161561206f5760405162461bcd60e51b815260040161041d90614444565b5f805b60048110156120ca576120868160036143c1565b61209190600861419f565b63ffffffff16876120a38360026143e8565b815181106120b3576120b36143d4565b016020015160f81c901b9190911790600101612072565b5063ffffffff81166003146120f15760405162461bcd60e51b815260040161041d90614487565b5f805b60208110156121465761210881601f6143c1565b61211390600861419f565b8861211f8360066143e8565b8151811061212f5761212f6143d4565b016020015160f81c901b91909117906001016120f4565b505f805b60088110156121a55761215e8160076143c1565b61216990600861419f565b6001600160401b03168961217e8360266143e8565b8151811061218e5761218e6143d4565b016020015160f81c901b919091179060010161214a565b505f805b6008811015612204576121bd8160076143c1565b6121c890600861419f565b6001600160401b03168a6121dd83602e6143e8565b815181106121ed576121ed6143d4565b016020015160f81c901b91909117906001016121a9565b5091989097509095509350505050565b5f8181525f8051602061473383398151915260205260408082208151610100810190925280545f805160206146f383398151915293929190829060ff16600581111561226257612262614033565b600581111561227357612273614033565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122fb576122fb614033565b146123575760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161041d565b60408101516001600160a01b0316336001600160a01b0316146123d15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161041d565b6123de8160a00151613334565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561242257612422614033565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124ee846124e88161166f565b5f611818565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061251d9085906004016140a4565b6020604051808303815f875af1158015612539573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061255d91906140d6565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146b3833981519152816125cb846134d5565b90505f6125d7826109d6565b83549091506001600160401b0382161080159061260157508260010154816001600160401b031611155b610c515760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161041d565b5f61266861350b565b5f805160206146f3833981519152426001600160401b0385161180156126a257506001600160401b0384166126a0426202a3006143e8565b115b6127045760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161041d565b8561275b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161041d565b5f868152600782016020526040902054156127c95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161041d565b82516030146128305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161041d565b61283985613334565b5f806128806040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613542565b5f8281526005860160205260409020919350915061289e8282614512565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128cb9085906004016140a4565b6020604051808303815f875af11580156128e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061290b91906140d6565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff1916600183600581111561298d5761298d614033565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c5160015f8051602061471383398151915255565b5f612aae61350b565b5f612abb6101a4846134d5565b90505f805160206146b38339815191525f612ad5876116f1565b9050600281516005811115612aec57612aec614033565b14612b4b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161041d565b5f838260a00151612b5c91906145d1565b9050612b6888826117d0565b5f612b728961166f565b90505f898983604051602001612bba9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612bdb86613334565b5f6005600160991b0163ee5b48eb612bf48d8688611818565b6040518263ffffffff1660e01b8152600401612c1091906140a4565b6020604051808303815f875af1158015612c2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c5091906140d6565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612cd857612cd8614033565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610e7360015f8051602061471383398151915255565b5f808251602714612e3a5760405162461bcd60e51b815260040161041d906143fb565b5f805b6002811015612e8957612e518160016143c1565b612e5c90600861419f565b61ffff16858281518110612e7257612e726143d4565b016020015160f81c901b9190911790600101612e3d565b5061ffff811615612eac5760405162461bcd60e51b815260040161041d90614444565b5f805b6004811015612f0757612ec38160036143c1565b612ece90600861419f565b63ffffffff1686612ee08360026143e8565b81518110612ef057612ef06143d4565b016020015160f81c901b9190911790600101612eaf565b5063ffffffff8116600214612f2e5760405162461bcd60e51b815260040161041d90614487565b5f805b6020811015612f8357612f4581601f6143c1565b612f5090600861419f565b87612f5c8360066143e8565b81518110612f6c57612f6c6143d4565b016020015160f81c901b9190911790600101612f31565b505f86602681518110612f9857612f986143d4565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612fdb5760405162461bcd60e51b815260040161041d906143fb565b5f805b600281101561302a57612ff28160016143c1565b612ffd90600861419f565b61ffff16858281518110613013576130136143d4565b016020015160f81c901b9190911790600101612fde565b5061ffff81161561304d5760405162461bcd60e51b815260040161041d90614444565b5f805b60048110156130a8576130648160036143c1565b61306f90600861419f565b63ffffffff16866130818360026143e8565b81518110613091576130916143d4565b016020015160f81c901b9190911790600101613050565b5063ffffffff81166004146130cf5760405162461bcd60e51b815260040161041d90614487565b5f805b6020811015613124576130e681601f6143c1565b6130f190600861419f565b876130fd8360066143e8565b8151811061310d5761310d6143d4565b016020015160f81c901b91909117906001016130d2565b505f805b60088110156131835761313c8160076143c1565b61314790600861419f565b6001600160401b03168861315c8360266143e8565b8151811061316c5761316c6143d4565b016020015160f81c901b9190911790600101613128565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166131d957604051631afcd79f60e31b815260040160405180910390fd5b565b6131e3613190565b6131ec816138fa565b61321e6060820135608083013561320960c0850160a08601613ecc565b61321960e0860160c087016145f1565b61391b565b50565b613229613190565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132b55760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161041d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610c2f91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613976565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146f38339815191529060ff165f03613372575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ba90836143c1565b106133d6576001600160401b03841660408301528082526133f5565b83826040018181516133e891906145d1565b6001600160401b03169052505b5f82602001518360400151606461340c919061460c565b6134169190614637565b600285015490915060ff90811690821611156134915760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161041d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109e6827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906139d7565b5f8051602061471383398151915280546001190161353c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135ac5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161041d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613623576135e38160016143c1565b6135ee90600861419f565b5081515f90839083908110613605576136056143d4565b60200101906001600160f81b03191690815f1a9053506001016135cf565b505f5b60048110156136815761363a8160036143c1565b61364590600861419f565b505f826136538360026143e8565b81518110613663576136636143d4565b60200101906001600160f81b03191690815f1a905350600101613626565b505f5b60208110156136de57845181602081106136a0576136a06143d4565b1a60f81b826136b08360066143e8565b815181106136c0576136c06143d4565b60200101906001600160f81b03191690815f1a905350600101613684565b505f5b602081101561373e5784602001518160208110613700576137006143d4565b1a60f81b826137108360266143e8565b81518110613720576137206143d4565b60200101906001600160f81b03191690815f1a9053506001016136e1565b505f5b60088110156137b2576137558160076143c1565b61376090600861419f565b60ff1685604001516001600160401b0316901c60f81b8282604661378491906143e8565b81518110613794576137946143d4565b60200101906001600160f81b03191690815f1a905350600101613741565b505f5b603081101561381d57846080015181815181106137d4576137d46143d4565b01602001516001600160f81b031916826137ef83604e6143e8565b815181106137ff576137ff6143d4565b60200101906001600160f81b03191690815f1a9053506001016137b5565b505f5b600881101561388f576138348160076143c1565b61383f90600861419f565b60608601516001600160401b0390811691161c60f81b8261386183607e6143e8565b81518110613871576138716143d4565b60200101906001600160f81b03191690815f1a905350600101613820565b506002816040516138a0919061465c565b602060405180830381855afa1580156138bb573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138de91906140d6565b94909350915050565b60015f8051602061471383398151915255565b613902613190565b61390a613b39565b613912613b49565b61321e81613b51565b613923613190565b5f5f805160206146b3833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f61398a6001600160a01b03841683613bbd565b905080515f141580156139ae5750808060200190518101906139ac9190614677565b155b15610c2f57604051635274afe760e01b81526001600160a01b038416600482015260240161041d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a4191906140d6565b9050613a586001600160a01b038516333086613bca565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ac091906140d6565b9050818111613b265760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161041d565b613b3082826143c1565b95945050505050565b613b41613190565b6131d9613c03565b6131d9613190565b613b59613190565b80355f805160206146f383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613ba36060830160408401614692565b600291909101805460ff191660ff90921691909117905550565b6060610e7383835f613c0b565b6040516001600160a01b0384811660248301528381166044830152606482018390526108ec9186918216906323b872dd90608401613302565b6138e7613190565b606081471015613c305760405163cd78605960e01b815230600482015260240161041d565b5f80856001600160a01b03168486604051613c4b919061465c565b5f6040518083038185875af1925050503d805f8114613c85576040519150601f19603f3d011682016040523d82523d5f602084013e613c8a565b606091505b5091509150611665868383606082613caa57613ca582613cf1565b610e73565b8151158015613cc157506001600160a01b0384163b155b15613cea57604051639996b31560e01b81526001600160a01b038516600482015260240161041d565b5080610e73565b805115613d015780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d26906141b6565b5f825580601f10613d35575050565b601f0160209004905f5260205f209081019061321e9190613d95565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613da9575f8155600101613d96565b5090565b801515811461321e575f80fd5b803563ffffffff81168114613dcd575f80fd5b919050565b5f805f60608486031215613de4575f80fd5b833592506020840135613df681613dad565b9150613e0460408501613dba565b90509250925092565b5f60208284031215613e1d575f80fd5b5035919050565b6001600160a01b038116811461321e575f80fd5b5f80828403610100811215613e4b575f80fd5b60e0811215613e58575f80fd5b5082915060e0830135613e6a81613e24565b809150509250929050565b5f60208284031215613e85575f80fd5b610e7382613dba565b5f8060408385031215613e9f575f80fd5b613ea883613dba565b946020939093013593505050565b80356001600160401b0381168114613dcd575f80fd5b5f60208284031215613edc575f80fd5b610e7382613eb6565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f1b57613f1b613ee5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f4957613f49613ee5565b604052919050565b5f6001600160401b03821115613f6957613f69613ee5565b50601f01601f191660200190565b5f805f8060808587031215613f8a575f80fd5b8435935060208501359250613fa160408601613eb6565b915060608501356001600160401b03811115613fbb575f80fd5b8501601f81018713613fcb575f80fd5b8035613fde613fd982613f51565b613f21565b818152886020838501011115613ff2575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614024575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561407b5761407b614047565b5092915050565b5f5b8381101561409c578181015183820152602001614084565b50505f910152565b602081525f82518060208401526140c2816040850160208701614082565b601f01601f19169190910160400192915050565b5f602082840312156140e6575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261410f5761410f6140ed565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109e6576109e6614047565b600181811c908216806141ca57607f821691505b6020821081036141e857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614247816141b6565b806020870152604060018084165f81146142685760018114614284576142b1565b60ff19851660408a0152604084151560051b8a010195506142b1565b895f5260205f205f5b858110156142a85781548b820186015290830190880161428d565b8a016040019650505b509398975050505050505050565b8051613dcd81613dad565b5f80604083850312156142db575f80fd5b82516001600160401b03808211156142f1575f80fd5b9084019060608287031215614304575f80fd5b61430c613ef9565b8251815260208084015161431f81613e24565b82820152604084015183811115614334575f80fd5b80850194505087601f850112614348575f80fd5b83519250614358613fd984613f51565b838152888285870101111561436b575f80fd5b61437a84838301848801614082565b8060408401525081955061438f8188016142bf565b9450505050509250929050565b5f6001600160401b038083168181036143b7576143b7614047565b6001019392505050565b818103818111156109e6576109e6614047565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109e6576109e6614047565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610c2f57805f5260205f20601f840160051c810160208510156144f35750805b601f840160051c820191505b818110156112bd575f81556001016144ff565b81516001600160401b0381111561452b5761452b613ee5565b61453f8161453984546141b6565b846144ce565b602080601f831160018114614572575f841561455b5750858301515b5f19600386901b1c1916600185901b1785556145c9565b5f85815260208120601f198616915b828110156145a057888601518255948401946001909101908401614581565b50858210156145bd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0381811683821601908082111561407b5761407b614047565b5f60208284031215614601575f80fd5b8135610e7381613e24565b6001600160401b0381811683821602808216919082811461462f5761462f614047565b505092915050565b5f6001600160401b0380841680614650576146506140ed565b92169190910492915050565b5f825161466d818460208701614082565b9190910192915050565b5f60208284031215614687575f80fd5b8151610e7381613dad565b5f602082840312156146a2575f80fd5b813560ff81168114610e73575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_RATE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"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\":\"minimumDelegationFeeRate\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"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\":\"delegationFeeRate\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"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\":\"DelegationFeeRateSet\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationFeeRate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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: "0x608060405234801561000f575f80fd5b50604051614aca380380614aca83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61497d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806376f786211161009e578063a3a65e481161006e578063a3a65e481461025a578063b771b3bc1461026d578063ba3a4b9714610293578063bee0a03f146102a6578063d25738dd146102b9575f80fd5b806376f786211461020e57806384f8d7791461022157806398f3e2b4146102345780639e1bc4ef14610247575f80fd5b80632e2194d8116100e45780632e2194d814610197578063467ef06f146101c25780635297fae6146101d557806362065856146101e857806366435abf146101fb575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d57806325d5c73f1461018e575b5f80fd5b610128610123366004613fe6565b6102cc565b005b610128610138366004614021565b610736565b61017b61014b366004614021565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61017b61270f81565b6101aa6101a5366004614021565b610906565b6040516001600160401b039091168152602001610185565b6101286101d0366004614038565b61091c565b6101286101e3366004614051565b610947565b61017b6101f636600461408f565b610b17565b6101aa610209366004614021565b610b30565b61012861021c366004613fe6565b610b44565b61017b61022f36600461413a565b610b64565b610128610242366004614051565b610b95565b61017b6102553660046141df565b610da4565b610128610268366004614038565b610db7565b61027b6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102a1366004614021565b610f74565b6101286102b4366004614021565b611201565b6101286102c7366004614213565b611310565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206148d183398151915291841561031e5761031b82856113f4565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561035057610350614251565b600481111561036157610361614251565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103e8576103e8614251565b1461043a5760405162461bcd60e51b815260206004820152602a60248201525f805160206148f18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461049f5760405162461bcd60e51b815260206004820152603360248201525f805160206148f18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610431565b5f6104a984611690565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156104f6576104f6614251565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105c885611712565b905082606001516001600160401b03168160a001516001600160401b03161161063f5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610431565b5f83606001518260a001516106549190614279565b905061066086826117f1565b5f6005600160991b0163ee5b48eb610679898786611839565b6040518263ffffffff1660e01b815260040161069591906142c2565b6020604051808303815f875af11580156106b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d591906142f4565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061495183398151915260205260408082208151610100810190925280545f8051602061491183398151915293929190829060ff16600581111561078457610784614251565b600581111561079557610795614251565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561081a5761081a614251565b1461087f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610431565b6005600160991b016001600160a01b031663ee5b48eb6108a48584608001515f611839565b6040518263ffffffff1660e01b81526004016108c091906142c2565b6020604051808303815f875af11580156108dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090091906142f4565b50505050565b5f61091664e8d4a510008361431f565b92915050565b5f61092682611a56565b905061094381606001516001600160401b03168260400151611dc9565b5050565b5f805160206148d18339815191525f61095f84611dff565b90505f806109708360400151611fe0565b50915091505f61097f83611712565b9050816001600160401b031681608001516001600160401b031610156109b75760405162461bcd60e51b815260040161043190614332565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b9092041611156109fc5760405162461bcd60e51b815260040161043190614374565b60015f87815260068701602052604090205460ff166004811115610a2257610a22614251565b14610a8b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610431565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109166001600160401b03831664e8d4a510006143bd565b5f610b3a82611712565b60a0015192915050565b8115610b5657610b5483826113f4565b505b610b5f8361221b565b505050565b5f80610b6f876125b9565b90505f610b7e8783888761266e565b9050610b8a8186612ab4565b979650505050505050565b5f805160206148d18339815191525f610bad84611dff565b90505f80610bbe8360400151611fe0565b50915091505f610bcd83611712565b9050816001600160401b031681608001516001600160401b03161015610c055760405162461bcd60e51b815260040161043190614332565b5f8681526006860160205260409020600301546001600160401b0380841691161115610c435760405162461bcd60e51b815260040161043190614374565b60035f87815260068701602052604090205460ff166004811115610c6957610c69614251565b14610cbd5760405162461bcd60e51b815260206004820152603160248201525f805160206148f18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610431565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610d6291611dc9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610db0833384612bae565b9392505050565b5f805160206149118339815191525f610dcf83611dff565b90505f80610de08360400151612f20565b9150915080610e425760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610431565b5f82815260058501602052604081208054610e5c906143d4565b9050118015610e8e575060015f83815260068601602052604090205460ff166005811115610e8c57610e8c614251565b145b610eaa5760405162461bcd60e51b81526004016104319061440c565b5f8281526005850160205260408120610ec291613f2e565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206148d183398151915293929190829060ff166004811115610fd557610fd5614251565b6004811115610fe657610fe6614251565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561106d5761106d614251565b148061108b575060038151600481111561108957611089614251565b145b6110df5760405162461bcd60e51b815260206004820152603260248201525f805160206148f1833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610431565b5f6110ed8260400151611712565b905080608001516001600160401b03165f036111715760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610431565b6005600160991b016001600160a01b031663ee5b48eb61119e846040015184608001518560a00151611839565b6040518263ffffffff1660e01b81526004016111ba91906142c2565b6020604051808303815f875af11580156111d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fa91906142f4565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614911833981519152929190611249906143d4565b905011801561127b575060015f83815260068301602052604090205460ff16600581111561127957611279614251565b145b6112975760405162461bcd60e51b81526004016104319061440c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916112d09190600401614453565b6020604051808303815f875af11580156112ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5f91906142f4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611359575080546001600160401b03808416911610155b156113775760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113a284846130c1565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561143f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261146691908101906144e8565b91509150806114c95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610431565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561150c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153091906142f4565b8251146115945760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610431565b60208201516001600160a01b03161561160a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610431565b5f8061161984604001516130db565b915091508187146116865760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610431565b9695505050505050565b5f8181525f805160206149518339815191526020526040812060030180545f80516020614911833981519152916001600160401b0390911690836116d3836145ba565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b61171a613f65565b5f8281525f805160206149518339815191526020526040908190208151610100810190925280545f80516020614911833981519152929190829060ff16600581111561176857611768614251565b600581111561177957611779614251565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614951833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118b2576118728160016145df565b61187d9060086143bd565b5081515f90839083908110611894576118946145f2565b60200101906001600160f81b03191690815f1a90535060010161185e565b505f5b6004811015611915576118c98160036145df565b6118d49060086143bd565b6001901c60f81b826118e7836002614606565b815181106118f7576118f76145f2565b60200101906001600160f81b03191690815f1a9053506001016118b5565b505f5b60208110156119775761192c81601f6145df565b6119379060086143bd565b86901c60f81b82611949836006614606565b81518110611959576119596145f2565b60200101906001600160f81b03191690815f1a905350600101611918565b505f5b60088110156119e25761198e8160076145df565b6119999060086143bd565b6001600160401b038616901c60f81b826119b4836026614606565b815181106119c4576119c46145f2565b60200101906001600160f81b03191690815f1a90535060010161197a565b505f5b6008811015611a4d576119f98160076145df565b611a049060086143bd565b6001600160401b038516901c60f81b82611a1f83602e614606565b81518110611a2f57611a2f6145f2565b60200101906001600160f81b03191690815f1a9053506001016119e5565b50949350505050565b611a5e613f65565b5f805160206149118339815191525f611a7684611dff565b90505f80611a878360400151612f20565b915091508015611aec5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610431565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611b1e57611b1e614251565b6005811115611b2f57611b2f614251565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611bb657611bb6614251565b1480611bd45750600182516005811115611bd257611bd2614251565b145b611c335760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610431565b600382516005811115611c4857611c48614251565b03611c5557506004611c59565b5060055b6020808301515f90815260078801909152604081205581816005811115611c8257611c82614251565b90816005811115611c9557611c95614251565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611cc957611cc9614251565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d9457611d94614251565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610943906001600160a01b031682846132b3565b60408051606080820183525f8083526020830181905292820152905f805160206149118339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e74573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e9b91908101906144e8565b9150915080611f025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610431565b8254825114611f655760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610431565b60208201516001600160a01b031615611fd85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610431565b509392505050565b5f805f83516036146120045760405162461bcd60e51b815260040161043190614619565b5f805b60028110156120535761201b8160016145df565b6120269060086143bd565b61ffff1686828151811061203c5761203c6145f2565b016020015160f81c901b9190911790600101612007565b5061ffff8116156120765760405162461bcd60e51b815260040161043190614662565b5f805b60048110156120d15761208d8160036145df565b6120989060086143bd565b63ffffffff16876120aa836002614606565b815181106120ba576120ba6145f2565b016020015160f81c901b9190911790600101612079565b5063ffffffff81166003146120f85760405162461bcd60e51b8152600401610431906146a5565b5f805b602081101561214d5761210f81601f6145df565b61211a9060086143bd565b88612126836006614606565b81518110612136576121366145f2565b016020015160f81c901b91909117906001016120fb565b505f805b60088110156121ac576121658160076145df565b6121709060086143bd565b6001600160401b031689612185836026614606565b81518110612195576121956145f2565b016020015160f81c901b9190911790600101612151565b505f805b600881101561220b576121c48160076145df565b6121cf9060086143bd565b6001600160401b03168a6121e483602e614606565b815181106121f4576121f46145f2565b016020015160f81c901b91909117906001016121b0565b5091989097509095509350505050565b5f8181525f8051602061495183398151915260205260408082208151610100810190925280545f8051602061491183398151915293929190829060ff16600581111561226957612269614251565b600581111561227a5761227a614251565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561230257612302614251565b1461235e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610431565b60408101516001600160a01b0316336001600160a01b0316146123d85760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610431565b6123e58160a00151613312565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561242957612429614251565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124f5846124ef81611690565b5f611839565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125249085906004016142c2565b6020604051808303815f875af1158015612540573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256491906142f4565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206148d1833981519152816125d2846134b3565b90505f6125de82610906565b83549091506001600160401b0382161080159061260857508260010154816001600160401b031611155b6126665760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610431565b949350505050565b5f6126776134e9565b5f80516020614911833981519152426001600160401b0385161180156126b157506001600160401b0384166126af426202a300614606565b115b6127135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610431565b8561276a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610431565b5f868152600782016020526040902054156127d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610431565b825160301461283f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610431565b61284885613312565b5f8061288f6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613520565b5f828152600586016020526040902091935091506128ad8282614730565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128da9085906004016142c2565b6020604051808303815f875af11580156128f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291a91906142f4565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff1916600183600581111561299c5761299c614251565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061266660015f8051602061493183398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f805160206148d1833981519152908210801590612af6575061270f8211155b612b5b5760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526f65676174696f6e20666565207261746560801b6064820152608401610431565b5f838152600582016020526040908190208390555183907ff3223a6425b3bc1637a7b768f8603f32daab5b3bb83d29c4cd6ab12fa288fbed90612ba19085815260200190565b60405180910390a2505050565b5f612bb76134e9565b5f612bc46101a5846134b3565b90505f805160206148d18339815191525f612bde87611712565b9050600281516005811115612bf557612bf5614251565b14612c545760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610431565b5f838260a00151612c6591906147ef565b9050612c7188826117f1565b5f612c7b89611690565b90505f898983604051602001612cc39392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612ce486613312565b5f6005600160991b0163ee5b48eb612cfd8d8688611839565b6040518263ffffffff1660e01b8152600401612d1991906142c2565b6020604051808303815f875af1158015612d35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d5991906142f4565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068a01909152902081518154829060ff19166001836004811115612de157612de1614251565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610db060015f8051602061493183398151915255565b5f808251602714612f435760405162461bcd60e51b815260040161043190614619565b5f805b6002811015612f9257612f5a8160016145df565b612f659060086143bd565b61ffff16858281518110612f7b57612f7b6145f2565b016020015160f81c901b9190911790600101612f46565b5061ffff811615612fb55760405162461bcd60e51b815260040161043190614662565b5f805b600481101561301057612fcc8160036145df565b612fd79060086143bd565b63ffffffff1686612fe9836002614606565b81518110612ff957612ff96145f2565b016020015160f81c901b9190911790600101612fb8565b5063ffffffff81166002146130375760405162461bcd60e51b8152600401610431906146a5565b5f805b602081101561308c5761304e81601f6145df565b6130599060086143bd565b87613065836006614606565b81518110613075576130756145f2565b016020015160f81c901b919091179060010161303a565b505f866026815181106130a1576130a16145f2565b016020015191976001600160f81b03199092161515965090945050505050565b6130c96138d8565b6130d282613923565b6109438161396f565b5f808251602e146130fe5760405162461bcd60e51b815260040161043190614619565b5f805b600281101561314d576131158160016145df565b6131209060086143bd565b61ffff16858281518110613136576131366145f2565b016020015160f81c901b9190911790600101613101565b5061ffff8116156131705760405162461bcd60e51b815260040161043190614662565b5f805b60048110156131cb576131878160036145df565b6131929060086143bd565b63ffffffff16866131a4836002614606565b815181106131b4576131b46145f2565b016020015160f81c901b9190911790600101613173565b5063ffffffff81166004146131f25760405162461bcd60e51b8152600401610431906146a5565b5f805b60208110156132475761320981601f6145df565b6132149060086143bd565b87613220836006614606565b81518110613230576132306145f2565b016020015160f81c901b91909117906001016131f5565b505f805b60088110156132a65761325f8160076145df565b61326a9060086143bd565b6001600160401b03168861327f836026614606565b8151811061328f5761328f6145f2565b016020015160f81c901b919091179060010161324b565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052610b5f91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a23565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149118339815191529060ff165f03613350575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061339890836145df565b106133b4576001600160401b03841660408301528082526133d3565b83826040018181516133c691906147ef565b6001600160401b03169052505b5f8260200151836040015160646133ea919061480f565b6133f4919061483a565b600285015490915060ff908116908216111561346f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610431565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610916827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a84565b5f8051602061493183398151915280546001190161351a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461358a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610431565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613601576135c18160016145df565b6135cc9060086143bd565b5081515f908390839081106135e3576135e36145f2565b60200101906001600160f81b03191690815f1a9053506001016135ad565b505f5b600481101561365f576136188160036145df565b6136239060086143bd565b505f82613631836002614606565b81518110613641576136416145f2565b60200101906001600160f81b03191690815f1a905350600101613604565b505f5b60208110156136bc578451816020811061367e5761367e6145f2565b1a60f81b8261368e836006614606565b8151811061369e5761369e6145f2565b60200101906001600160f81b03191690815f1a905350600101613662565b505f5b602081101561371c57846020015181602081106136de576136de6145f2565b1a60f81b826136ee836026614606565b815181106136fe576136fe6145f2565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6008811015613790576137338160076145df565b61373e9060086143bd565b60ff1685604001516001600160401b0316901c60f81b828260466137629190614606565b81518110613772576137726145f2565b60200101906001600160f81b03191690815f1a90535060010161371f565b505f5b60308110156137fb57846080015181815181106137b2576137b26145f2565b01602001516001600160f81b031916826137cd83604e614606565b815181106137dd576137dd6145f2565b60200101906001600160f81b03191690815f1a905350600101613793565b505f5b600881101561386d576138128160076145df565b61381d9060086143bd565b60608601516001600160401b0390811691161c60f81b8261383f83607e614606565b8151811061384f5761384f6145f2565b60200101906001600160f81b03191690815f1a9053506001016137fe565b5060028160405161387e919061485f565b602060405180830381855afa158015613899573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138bc91906142f4565b94909350915050565b60015f8051602061493183398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661392157604051631afcd79f60e31b815260040160405180910390fd5b565b61392b6138d8565b61393481613be6565b61396c6060820135608083013561395160c0850160a0860161408f565b60c0850135613967610100870160e0880161487a565b613c07565b50565b6139776138d8565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613a035760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610431565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613a376001600160a01b03841683613d48565b905080515f14158015613a5b575080806020019051810190613a599190614895565b155b15610b5f57604051635274afe760e01b81526001600160a01b0384166004820152602401610431565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613aca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613aee91906142f4565b9050613b056001600160a01b038516333086613d55565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613b49573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b6d91906142f4565b9050818111613bd35760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610431565b613bdd82826145df565b95945050505050565b613bee6138d8565b613bf6613d8e565b613bfe613d9e565b61396c81613da6565b613c0f6138d8565b5f82118015613c1f575061270f82105b613c915760405162461bcd60e51b815260206004820152603860248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201527f696d756d2064656c65676174696f6e20666565207261746500000000000000006064820152608401610431565b5f805160206148d183398151915294909455507f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01919091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02805467ffffffffffffffff19166001600160401b039092169190911790557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480546001600160a01b0319166001600160a01b03909216919091179055565b6060610db083835f613e12565b6040516001600160a01b0384811660248301528381166044830152606482018390526109009186918216906323b872dd906084016132e0565b613d966138d8565b613921613ea1565b6139216138d8565b613dae6138d8565b80355f8051602061491183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613df860608301604084016148b0565b600291909101805460ff191660ff90921691909117905550565b606081471015613e375760405163cd78605960e01b8152306004820152602401610431565b5f80856001600160a01b03168486604051613e52919061485f565b5f6040518083038185875af1925050503d805f8114613e8c576040519150601f19603f3d011682016040523d82523d5f602084013e613e91565b606091505b5091509150611686868383613ea9565b6138c56138d8565b606082613ebe57613eb982613f05565b610db0565b8151158015613ed557506001600160a01b0384163b155b15613efe57604051639996b31560e01b81526001600160a01b0385166004820152602401610431565b5080610db0565b805115613f155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f3a906143d4565b5f825580601f10613f49575050565b601f0160209004905f5260205f209081019061396c9190613fa9565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fbd575f8155600101613faa565b5090565b801515811461396c575f80fd5b803563ffffffff81168114613fe1575f80fd5b919050565b5f805f60608486031215613ff8575f80fd5b83359250602084013561400a81613fc1565b915061401860408501613fce565b90509250925092565b5f60208284031215614031575f80fd5b5035919050565b5f60208284031215614048575f80fd5b610db082613fce565b5f8060408385031215614062575f80fd5b61406b83613fce565b946020939093013593505050565b80356001600160401b0381168114613fe1575f80fd5b5f6020828403121561409f575f80fd5b610db082614079565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156140de576140de6140a8565b60405290565b604051601f8201601f191681016001600160401b038111828210171561410c5761410c6140a8565b604052919050565b5f6001600160401b0382111561412c5761412c6140a8565b50601f01601f191660200190565b5f805f805f60a0868803121561414e575f80fd5b853594506020860135935061416560408701614079565b92506060860135915060808601356001600160401b03811115614186575f80fd5b8601601f81018813614196575f80fd5b80356141a96141a482614114565b6140e4565b8181528960208385010111156141bd575f80fd5b816020840160208301375f602083830101528093505050509295509295909350565b5f80604083850312156141f0575f80fd5b50508035926020909101359150565b6001600160a01b038116811461396c575f80fd5b5f80828403610120811215614226575f80fd5b61010080821215614235575f80fd5b8493508301359050614246816141ff565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561429957614299614265565b5092915050565b5f5b838110156142ba5781810151838201526020016142a2565b50505f910152565b602081525f82518060208401526142e08160408501602087016142a0565b601f01601f19169190910160400192915050565b5f60208284031215614304575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261432d5761432d61430b565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761091657610916614265565b600181811c908216806143e857607f821691505b60208210810361440657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614465816143d4565b806020870152604060018084165f811461448657600181146144a2576144cf565b60ff19851660408a0152604084151560051b8a010195506144cf565b895f5260205f205f5b858110156144c65781548b82018601529083019088016144ab565b8a016040019650505b509398975050505050505050565b8051613fe181613fc1565b5f80604083850312156144f9575f80fd5b82516001600160401b038082111561450f575f80fd5b9084019060608287031215614522575f80fd5b61452a6140bc565b8251815260208084015161453d816141ff565b82820152604084015183811115614552575f80fd5b80850194505087601f850112614566575f80fd5b835192506145766141a484614114565b8381528882858701011115614589575f80fd5b614598848383018488016142a0565b806040840152508195506145ad8188016144dd565b9450505050509250929050565b5f6001600160401b038083168181036145d5576145d5614265565b6001019392505050565b8181038181111561091657610916614265565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561091657610916614265565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610b5f57805f5260205f20601f840160051c810160208510156147115750805b601f840160051c820191505b818110156111fa575f815560010161471d565b81516001600160401b03811115614749576147496140a8565b61475d8161475784546143d4565b846146ec565b602080601f831160018114614790575f84156147795750858301515b5f19600386901b1c1916600185901b1785556147e7565b5f85815260208120601f198616915b828110156147be5788860151825594840194600190910190840161479f565b50858210156147db57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0381811683821601908082111561429957614299614265565b6001600160401b0381811683821602808216919082811461483257614832614265565b505092915050565b5f6001600160401b03808416806148535761485361430b565b92169190910492915050565b5f82516148708184602087016142a0565b9190910192915050565b5f6020828403121561488a575f80fd5b8135610db0816141ff565b5f602082840312156148a5575f80fd5b8151610db081613fc1565b5f602082840312156148c0575f80fd5b813560ff81168114610db0575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -218,6 +219,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transact return _ERC20TokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// MAXIMUMDELEGATIONFEERATE is a free data retrieval call binding the contract method 0x25d5c73f. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_RATE() view returns(uint256) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMDELEGATIONFEERATE(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_DELEGATION_FEE_RATE") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXIMUMDELEGATIONFEERATE is a free data retrieval call binding the contract method 0x25d5c73f. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_RATE() view returns(uint256) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMDELEGATIONFEERATE() (*big.Int, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMDELEGATIONFEERATE(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMDELEGATIONFEERATE is a free data retrieval call binding the contract method 0x25d5c73f. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_RATE() view returns(uint256) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMDELEGATIONFEERATE() (*big.Int, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMDELEGATIONFEERATE(&_ERC20TokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) @@ -457,23 +489,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x27f39ca8. +// Initialize is a paid mutator transaction binding the contract method 0xd25738dd. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,address) settings, address token) returns() func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) Initialize(opts *bind.TransactOpts, settings PoSValidatorManagerSettings, token common.Address) (*types.Transaction, error) { return _ERC20TokenStakingManager.contract.Transact(opts, "initialize", settings, token) } -// Initialize is a paid mutator transaction binding the contract method 0x27f39ca8. +// Initialize is a paid mutator transaction binding the contract method 0xd25738dd. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,address) settings, address token) returns() func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) Initialize(settings PoSValidatorManagerSettings, token common.Address) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.Initialize(&_ERC20TokenStakingManager.TransactOpts, settings, token) } -// Initialize is a paid mutator transaction binding the contract method 0x27f39ca8. +// Initialize is a paid mutator transaction binding the contract method 0xd25738dd. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,address) settings, address token) returns() func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings, token common.Address) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.Initialize(&_ERC20TokenStakingManager.TransactOpts, settings, token) } @@ -541,25 +573,25 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x84f8d779. // -// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", stakeAmount, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, uint256 delegationFeeRate, bytes blsPublicKey) returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, delegationFeeRate *big.Int, blsPublicKey []byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", stakeAmount, nodeID, registrationExpiry, delegationFeeRate, blsPublicKey) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x84f8d779. // -// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, uint256 delegationFeeRate, bytes blsPublicKey) returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, delegationFeeRate *big.Int, blsPublicKey []byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, delegationFeeRate, blsPublicKey) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x84f8d779. // -// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, uint256 delegationFeeRate, bytes blsPublicKey) returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, delegationFeeRate *big.Int, blsPublicKey []byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, delegationFeeRate, blsPublicKey) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -787,6 +819,151 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegati return event, nil } +// ERC20TokenStakingManagerDelegationFeeRateSetIterator is returned from FilterDelegationFeeRateSet and is used to iterate over the raw logs and unpacked data for DelegationFeeRateSet events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegationFeeRateSetIterator struct { + Event *ERC20TokenStakingManagerDelegationFeeRateSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerDelegationFeeRateSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegationFeeRateSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegationFeeRateSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerDelegationFeeRateSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerDelegationFeeRateSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerDelegationFeeRateSet represents a DelegationFeeRateSet event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegationFeeRateSet struct { + ValidationID [32]byte + DelegationFeeRate *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegationFeeRateSet is a free log retrieval operation binding the contract event 0xf3223a6425b3bc1637a7b768f8603f32daab5b3bb83d29c4cd6ab12fa288fbed. +// +// Solidity: event DelegationFeeRateSet(bytes32 indexed validationID, uint256 delegationFeeRate) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationFeeRateSet(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerDelegationFeeRateSetIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationFeeRateSet", validationIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerDelegationFeeRateSetIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationFeeRateSet", logs: logs, sub: sub}, nil +} + +// WatchDelegationFeeRateSet is a free log subscription operation binding the contract event 0xf3223a6425b3bc1637a7b768f8603f32daab5b3bb83d29c4cd6ab12fa288fbed. +// +// Solidity: event DelegationFeeRateSet(bytes32 indexed validationID, uint256 delegationFeeRate) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationFeeRateSet(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationFeeRateSet, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationFeeRateSet", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerDelegationFeeRateSet) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationFeeRateSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegationFeeRateSet is a log parse operation binding the contract event 0xf3223a6425b3bc1637a7b768f8603f32daab5b3bb83d29c4cd6ab12fa288fbed. +// +// Solidity: event DelegationFeeRateSet(bytes32 indexed validationID, uint256 delegationFeeRate) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationFeeRateSet(log types.Log) (*ERC20TokenStakingManagerDelegationFeeRateSet, error) { + event := new(ERC20TokenStakingManagerDelegationFeeRateSet) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationFeeRateSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ERC20TokenStakingManagerDelegatorAddedIterator is returned from FilterDelegatorAdded and is used to iterate over the raw logs and unpacked data for DelegatorAdded events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorAddedIterator struct { Event *ERC20TokenStakingManagerDelegatorAdded // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index ae5772776..944d607b0 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -31,11 +31,12 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MinimumDelegationFeeRate *big.Int + RewardCalculator common.Address } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. @@ -47,8 +48,8 @@ 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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516144d73803806144d783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61438a8061014d5f395ff3fe6080604052600436106100f9575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc146102c9578063ba3a4b97146102fb578063bee0a03f1461031a578063c599e24f14610339578063f40797d71461034c575f80fd5b806366435abf1461024d57806376f786211461026c57806398f3e2b41461028b578063a3a65e48146102aa575f80fd5b80632e2194d8116100cd5780632e2194d8146101b9578063467ef06f146101f05780635297fae61461020f578063620658561461022e575f80fd5b8062e41792146100fd5780630118acc41461011e5780630322ed981461013d5780630cdd09851461015c575b5f80fd5b348015610108575f80fd5b5061011c610117366004613a4a565b61035f565b005b348015610129575f80fd5b5061011c610138366004613a85565b610441565b348015610148575f80fd5b5061011c610157366004613ac0565b6108ab565b348015610167575f80fd5b506101a6610176366004613ac0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c4575f80fd5b506101d86101d3366004613ac0565b610a7b565b6040516001600160401b0390911681526020016101b0565b3480156101fb575f80fd5b5061011c61020a366004613ad7565b610a91565b34801561021a575f80fd5b5061011c610229366004613af0565b610abc565b348015610239575f80fd5b506101a6610248366004613b2e565b610c8c565b348015610258575f80fd5b506101d8610267366004613ac0565b610ca5565b348015610277575f80fd5b5061011c610286366004613a85565b610cb9565b348015610296575f80fd5b5061011c6102a5366004613af0565b610cd9565b3480156102b5575f80fd5b5061011c6102c4366004613ad7565b610ee7565b3480156102d4575f80fd5b506102e36005600160991b0181565b6040516001600160a01b0390911681526020016101b0565b348015610306575f80fd5b5061011c610315366004613ac0565b6110a4565b348015610325575f80fd5b5061011c610334366004613ac0565b611331565b6101a6610347366004613ac0565b611440565b6101a661035a366004613bd9565b61144c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103a8575080546001600160401b03808416911610155b156103c65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556103f083611470565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206142de833981519152918415610493576104908285611484565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104c5576104c5613c6b565b60048111156104d6576104d6613c6b565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561055d5761055d613c6b565b146105af5760405162461bcd60e51b815260206004820152602a60248201525f805160206142fe8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106145760405162461bcd60e51b815260206004820152603360248201525f805160206142fe8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a6565b5f61061e84611720565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561066b5761066b613c6b565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61073d856117a2565b905082606001516001600160401b03168160a001516001600160401b0316116107b45760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a6565b5f83606001518260a001516107c99190613c93565b90506107d58682611881565b5f6005600160991b0163ee5b48eb6107ee8987866118c9565b6040518263ffffffff1660e01b815260040161080a9190613cdc565b6020604051808303815f875af1158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190613d0e565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061435e83398151915260205260408082208151610100810190925280545f8051602061431e83398151915293929190829060ff1660058111156108f9576108f9613c6b565b600581111561090a5761090a613c6b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561098f5761098f613c6b565b146109f45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a6565b6005600160991b016001600160a01b031663ee5b48eb610a198584608001515f6118c9565b6040518263ffffffff1660e01b8152600401610a359190613cdc565b6020604051808303815f875af1158015610a51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a759190613d0e565b50505050565b5f610a8b64e8d4a5100083613d39565b92915050565b5f610a9b82611ae6565b9050610ab881606001516001600160401b03168260400151611e59565b5050565b5f805160206142de8339815191525f610ad484611e6c565b90505f80610ae5836040015161204d565b50915091505f610af4836117a2565b9050816001600160401b031681608001516001600160401b03161015610b2c5760405162461bcd60e51b81526004016105a690613d4c565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b715760405162461bcd60e51b81526004016105a690613d8e565b60015f87815260038701602052604090205460ff166004811115610b9757610b97613c6b565b14610c005760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a6565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a8b6001600160401b03831664e8d4a51000613dd7565b5f610caf826117a2565b60a0015192915050565b8115610ccb57610cc98382611484565b505b610cd483612288565b505050565b5f805160206142de8339815191525f610cf184611e6c565b90505f80610d02836040015161204d565b50915091505f610d11836117a2565b9050816001600160401b031681608001516001600160401b03161015610d495760405162461bcd60e51b81526004016105a690613d4c565b5f8681526003808701602052604090912001546001600160401b0380841691161115610d875760405162461bcd60e51b81526004016105a690613d8e565b60035f87815260038701602052604090205460ff166004811115610dad57610dad613c6b565b14610e015760405162461bcd60e51b815260206004820152603160248201525f805160206142fe8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a6565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610ea59190611e59565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061431e8339815191525f610eff83611e6c565b90505f80610f108360400151612626565b9150915080610f725760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a6565b5f82815260058501602052604081208054610f8c90613dee565b9050118015610fbe575060015f83815260068601602052604090205460ff166005811115610fbc57610fbc613c6b565b145b610fda5760405162461bcd60e51b81526004016105a690613e20565b5f8281526005850160205260408120610ff2916139b7565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f805160206142de83398151915293929190829060ff16600481111561110557611105613c6b565b600481111561111657611116613c6b565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561119d5761119d613c6b565b14806111bb57506003815160048111156111b9576111b9613c6b565b145b61120f5760405162461bcd60e51b815260206004820152603260248201525f805160206142fe833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105a6565b5f61121d82604001516117a2565b905080608001516001600160401b03165f036112a15760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a6565b6005600160991b016001600160a01b031663ee5b48eb6112ce846040015184608001518560a001516118c9565b6040518263ffffffff1660e01b81526004016112ea9190613cdc565b6020604051808303815f875af1158015611306573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132a9190613d0e565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061431e83398151915292919061137990613dee565b90501180156113ab575060015f83815260068301602052604090205460ff1660058111156113a9576113a9613c6b565b145b6113c75760405162461bcd60e51b81526004016105a690613e20565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114009190600401613e67565b6020604051808303815f875af115801561141c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd49190613d0e565b5f610a8b8233346127c7565b5f8061145734612b36565b905061146585828686612be0565b9150505b9392505050565b611478613026565b61148181613071565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114cf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114f69190810190613f10565b91509150806115595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561159c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c09190613d0e565b8251146116245760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a6565b60208201516001600160a01b03161561169a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a6565b5f806116a984604001516130b4565b915091508187146117165760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a6565b9695505050505050565b5f8181525f8051602061435e8339815191526020526040812060030180545f8051602061431e833981519152916001600160401b03909116908361176383613fe2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6117aa6139ee565b5f8281525f8051602061435e8339815191526020526040908190208151610100810190925280545f8051602061431e833981519152929190829060ff1660058111156117f8576117f8613c6b565b600581111561180957611809613c6b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061435e833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561194257611902816001614007565b61190d906008613dd7565b5081515f908390839081106119245761192461401a565b60200101906001600160f81b03191690815f1a9053506001016118ee565b505f5b60048110156119a557611959816003614007565b611964906008613dd7565b6001901c60f81b8261197783600261402e565b815181106119875761198761401a565b60200101906001600160f81b03191690815f1a905350600101611945565b505f5b6020811015611a07576119bc81601f614007565b6119c7906008613dd7565b86901c60f81b826119d983600661402e565b815181106119e9576119e961401a565b60200101906001600160f81b03191690815f1a9053506001016119a8565b505f5b6008811015611a7257611a1e816007614007565b611a29906008613dd7565b6001600160401b038616901c60f81b82611a4483602661402e565b81518110611a5457611a5461401a565b60200101906001600160f81b03191690815f1a905350600101611a0a565b505f5b6008811015611add57611a89816007614007565b611a94906008613dd7565b6001600160401b038516901c60f81b82611aaf83602e61402e565b81518110611abf57611abf61401a565b60200101906001600160f81b03191690815f1a905350600101611a75565b50949350505050565b611aee6139ee565b5f8051602061431e8339815191525f611b0684611e6c565b90505f80611b178360400151612626565b915091508015611b7c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a6565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611bae57611bae613c6b565b6005811115611bbf57611bbf613c6b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c4657611c46613c6b565b1480611c645750600182516005811115611c6257611c62613c6b565b145b611cc35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a6565b600382516005811115611cd857611cd8613c6b565b03611ce557506004611ce9565b5060055b6020808301515f90815260078801909152604081205581816005811115611d1257611d12613c6b565b90816005811115611d2557611d25613c6b565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611d5957611d59613c6b565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e2457611e24613c6b565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610ab86001600160a01b0382168361328c565b60408051606080820183525f8083526020830181905292820152905f8051602061431e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ee1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f089190810190613f10565b9150915080611f6f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a6565b8254825114611fd25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a6565b60208201516001600160a01b0316156120455760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a6565b509392505050565b5f805f83516036146120715760405162461bcd60e51b81526004016105a690614041565b5f805b60028110156120c057612088816001614007565b612093906008613dd7565b61ffff168682815181106120a9576120a961401a565b016020015160f81c901b9190911790600101612074565b5061ffff8116156120e35760405162461bcd60e51b81526004016105a69061408a565b5f805b600481101561213e576120fa816003614007565b612105906008613dd7565b63ffffffff168761211783600261402e565b815181106121275761212761401a565b016020015160f81c901b91909117906001016120e6565b5063ffffffff81166003146121655760405162461bcd60e51b81526004016105a6906140cd565b5f805b60208110156121ba5761217c81601f614007565b612187906008613dd7565b8861219383600661402e565b815181106121a3576121a361401a565b016020015160f81c901b9190911790600101612168565b505f805b6008811015612219576121d2816007614007565b6121dd906008613dd7565b6001600160401b0316896121f283602661402e565b815181106122025761220261401a565b016020015160f81c901b91909117906001016121be565b505f805b600881101561227857612231816007614007565b61223c906008613dd7565b6001600160401b03168a61225183602e61402e565b815181106122615761226161401a565b016020015160f81c901b919091179060010161221d565b5091989097509095509350505050565b5f8181525f8051602061435e83398151915260205260408082208151610100810190925280545f8051602061431e83398151915293929190829060ff1660058111156122d6576122d6613c6b565b60058111156122e7576122e7613c6b565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561236f5761236f613c6b565b146123cb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a6565b60408101516001600160a01b0316336001600160a01b0316146124455760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a6565b6124528160a0015161331f565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561249657612496613c6b565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125628461255c81611720565b5f6118c9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612591908590600401613cdc565b6020604051808303815f875af11580156125ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d19190613d0e565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146126495760405162461bcd60e51b81526004016105a690614041565b5f805b600281101561269857612660816001614007565b61266b906008613dd7565b61ffff168582815181106126815761268161401a565b016020015160f81c901b919091179060010161264c565b5061ffff8116156126bb5760405162461bcd60e51b81526004016105a69061408a565b5f805b6004811015612716576126d2816003614007565b6126dd906008613dd7565b63ffffffff16866126ef83600261402e565b815181106126ff576126ff61401a565b016020015160f81c901b91909117906001016126be565b5063ffffffff811660021461273d5760405162461bcd60e51b81526004016105a6906140cd565b5f805b60208110156127925761275481601f614007565b61275f906008613dd7565b8761276b83600661402e565b8151811061277b5761277b61401a565b016020015160f81c901b9190911790600101612740565b505f866026815181106127a7576127a761401a565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127d06134c0565b5f6127da83610a7b565b90505f805160206142de8339815191525f6127f4876117a2565b905060028151600581111561280b5761280b613c6b565b1461286a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a6565b5f838260a0015161287b9190614114565b90506128878882611881565b5f61289189611720565b90505f8989836040516020016128d99392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506128fa8661331f565b5f6005600160991b0163ee5b48eb6129138d86886118c9565b6040518263ffffffff1660e01b815260040161292f9190613cdc565b6020604051808303815f875af115801561294b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296f9190613d0e565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff191660018360048111156129f7576129f7613c6b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061146960015f8051602061433e83398151915255565b5f5f805160206142de8339815191528282612b5082610a7b565b83549091506001600160401b03821610801590612b7a57508260010154816001600160401b031611155b612bd85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105a6565b949350505050565b5f612be96134c0565b5f8051602061431e833981519152426001600160401b038516118015612c2357506001600160401b038416612c21426202a30061402e565b115b612c855760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105a6565b85612cdc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a6565b5f86815260078201602052604090205415612d4a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a6565b8251603014612db15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a6565b612dba8561331f565b5f80612e016040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061350a565b5f82815260058601602052604090209193509150612e1f8282614178565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e4c908590600401613cdc565b6020604051808303815f875af1158015612e68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e8c9190613d0e565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612f0e57612f0e613c6b565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612bd860015f8051602061433e83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661306f57604051631afcd79f60e31b815260040160405180910390fd5b565b613079613026565b613082816138af565b6114816060820135608083013561309f60c0850160a08601613b2e565b6130af60e0860160c08701614237565b6138d0565b5f808251602e146130d75760405162461bcd60e51b81526004016105a690614041565b5f805b6002811015613126576130ee816001614007565b6130f9906008613dd7565b61ffff1685828151811061310f5761310f61401a565b016020015160f81c901b91909117906001016130da565b5061ffff8116156131495760405162461bcd60e51b81526004016105a69061408a565b5f805b60048110156131a457613160816003614007565b61316b906008613dd7565b63ffffffff168661317d83600261402e565b8151811061318d5761318d61401a565b016020015160f81c901b919091179060010161314c565b5063ffffffff81166004146131cb5760405162461bcd60e51b81526004016105a6906140cd565b5f805b6020811015613220576131e281601f614007565b6131ed906008613dd7565b876131f983600661402e565b815181106132095761320961401a565b016020015160f81c901b91909117906001016131ce565b505f805b600881101561327f57613238816007614007565b613243906008613dd7565b6001600160401b03168861325883602661402e565b815181106132685761326861401a565b016020015160f81c901b9190911790600101613224565b5090969095509350505050565b804710156132af5760405163cd78605960e01b81523060048201526024016105a6565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146132f8576040519150601f19603f3d011682016040523d82523d5f602084013e6132fd565b606091505b5050905080610cd457604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061431e8339815191529060ff165f0361335d575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133a59083614007565b106133c1576001600160401b03841660408301528082526133e0565b83826040018181516133d39190614114565b6001600160401b03169052505b5f8260200151836040015160646133f79190614252565b613401919061427d565b600285015490915060ff908116908216111561347c5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105a6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061433e8339815191528054600119016134f157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061433e83398151915255565b5f60608260800151516030146135745760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135eb576135ab816001614007565b6135b6906008613dd7565b5081515f908390839081106135cd576135cd61401a565b60200101906001600160f81b03191690815f1a905350600101613597565b505f5b600481101561364957613602816003614007565b61360d906008613dd7565b505f8261361b83600261402e565b8151811061362b5761362b61401a565b60200101906001600160f81b03191690815f1a9053506001016135ee565b505f5b60208110156136a657845181602081106136685761366861401a565b1a60f81b8261367883600661402e565b815181106136885761368861401a565b60200101906001600160f81b03191690815f1a90535060010161364c565b505f5b602081101561370657846020015181602081106136c8576136c861401a565b1a60f81b826136d883602661402e565b815181106136e8576136e861401a565b60200101906001600160f81b03191690815f1a9053506001016136a9565b505f5b600881101561377a5761371d816007614007565b613728906008613dd7565b60ff1685604001516001600160401b0316901c60f81b8282604661374c919061402e565b8151811061375c5761375c61401a565b60200101906001600160f81b03191690815f1a905350600101613709565b505f5b60308110156137e5578460800151818151811061379c5761379c61401a565b01602001516001600160f81b031916826137b783604e61402e565b815181106137c7576137c761401a565b60200101906001600160f81b03191690815f1a90535060010161377d565b505f5b6008811015613857576137fc816007614007565b613807906008613dd7565b60608601516001600160401b0390811691161c60f81b8261382983607e61402e565b815181106138395761383961401a565b60200101906001600160f81b03191690815f1a9053506001016137e8565b5060028160405161386891906142a2565b602060405180830381855afa158015613883573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138a69190613d0e565b94909350915050565b6138b7613026565b6138bf61392b565b6138c761393b565b61148181613943565b6138d8613026565b5f5f805160206142de833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613933613026565b61306f6139af565b61306f613026565b61394b613026565b80355f8051602061431e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561399560608301604084016142bd565b600291909101805460ff191660ff90921691909117905550565b6134f7613026565b5080546139c390613dee565b5f825580601f106139d2575050565b601f0160209004905f5260205f20908101906114819190613a32565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613a46575f8155600101613a33565b5090565b5f60e08284031215613a5a575f80fd5b50919050565b8015158114611481575f80fd5b803563ffffffff81168114613a80575f80fd5b919050565b5f805f60608486031215613a97575f80fd5b833592506020840135613aa981613a60565b9150613ab760408501613a6d565b90509250925092565b5f60208284031215613ad0575f80fd5b5035919050565b5f60208284031215613ae7575f80fd5b61146982613a6d565b5f8060408385031215613b01575f80fd5b613b0a83613a6d565b946020939093013593505050565b80356001600160401b0381168114613a80575f80fd5b5f60208284031215613b3e575f80fd5b61146982613b18565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b7d57613b7d613b47565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bab57613bab613b47565b604052919050565b5f6001600160401b03821115613bcb57613bcb613b47565b50601f01601f191660200190565b5f805f60608486031215613beb575f80fd5b83359250613bfb60208501613b18565b915060408401356001600160401b03811115613c15575f80fd5b8401601f81018613613c25575f80fd5b8035613c38613c3382613bb3565b613b83565b818152876020838501011115613c4c575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613cb357613cb3613c7f565b5092915050565b5f5b83811015613cd4578181015183820152602001613cbc565b50505f910152565b602081525f8251806020840152613cfa816040850160208701613cba565b601f01601f19169190910160400192915050565b5f60208284031215613d1e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613d4757613d47613d25565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a8b57610a8b613c7f565b600181811c90821680613e0257607f821691505b602082108103613a5a57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613e7981613dee565b806020870152604060018084165f8114613e9a5760018114613eb657613ee3565b60ff19851660408a0152604084151560051b8a01019550613ee3565b895f5260205f205f5b85811015613eda5781548b8201860152908301908801613ebf565b8a016040019650505b509398975050505050505050565b6001600160a01b0381168114611481575f80fd5b8051613a8081613a60565b5f8060408385031215613f21575f80fd5b82516001600160401b0380821115613f37575f80fd5b9084019060608287031215613f4a575f80fd5b613f52613b5b565b82518152602080840151613f6581613ef1565b82820152604084015183811115613f7a575f80fd5b80850194505087601f850112613f8e575f80fd5b83519250613f9e613c3384613bb3565b8381528882858701011115613fb1575f80fd5b613fc084838301848801613cba565b80604084015250819550613fd5818801613f05565b9450505050509250929050565b5f6001600160401b03808316818103613ffd57613ffd613c7f565b6001019392505050565b81810381811115610a8b57610a8b613c7f565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a8b57610a8b613c7f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613cb357613cb3613c7f565b601f821115610cd457805f5260205f20601f840160051c810160208510156141595750805b601f840160051c820191505b8181101561132a575f8155600101614165565b81516001600160401b0381111561419157614191613b47565b6141a58161419f8454613dee565b84614134565b602080601f8311600181146141d8575f84156141c15750858301515b5f19600386901b1c1916600185901b17855561422f565b5f85815260208120601f198616915b82811015614206578886015182559484019460019091019084016141e7565b508582101561422357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614247575f80fd5b813561146981613ef1565b6001600160401b0381811683821602808216919082811461427557614275613c7f565b505092915050565b5f6001600160401b038084168061429657614296613d25565b92169190910492915050565b5f82516142b3818460208701613cba565b9190910192915050565b5f602082840312156142cd575f80fd5b813560ff81168114611469575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_RATE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"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\":\"minimumDelegationFeeRate\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"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\":\"delegationFeeRate\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"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\":\"DelegationFeeRateSet\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationFeeRate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516146f23803806146f283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145a58061014d5f395ff3fe608060405260043610610105575f3560e01c806376f7862111610092578063a3a65e4811610062578063a3a65e48146102de578063b771b3bc146102fd578063ba3a4b971461032f578063bee0a03f1461034e578063c599e24f1461036d575f80fd5b806376f786211461026e5780638d3483781461028d57806396a02bb7146102a057806398f3e2b4146102bf575f80fd5b80632e2194d8116100d85780632e2194d8146101bb578063467ef06f146101f25780635297fae614610211578063620658561461023057806366435abf1461024f575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd09851461014957806325d5c73f146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613c7f565b610380565b005b348015610135575f80fd5b50610128610144366004613cba565b6107ea565b348015610154575f80fd5b50610193610163366004613cba565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b5061019361270f81565b3480156101c6575f80fd5b506101da6101d5366004613cba565b6109ba565b6040516001600160401b03909116815260200161019d565b3480156101fd575f80fd5b5061012861020c366004613cd1565b6109d0565b34801561021c575f80fd5b5061012861022b366004613cea565b6109fb565b34801561023b575f80fd5b5061019361024a366004613d28565b610bcb565b34801561025a575f80fd5b506101da610269366004613cba565b610be4565b348015610279575f80fd5b50610128610288366004613c7f565b610bf8565b61019361029b366004613dd3565b610c18565b3480156102ab575f80fd5b506101286102ba366004613e6f565b610c4a565b3480156102ca575f80fd5b506101286102d9366004613cea565b610d2c565b3480156102e9575f80fd5b506101286102f8366004613cd1565b610f3b565b348015610308575f80fd5b506103176005600160991b0181565b6040516001600160a01b03909116815260200161019d565b34801561033a575f80fd5b50610128610349366004613cba565b6110f8565b348015610359575f80fd5b50610128610368366004613cba565b611385565b61019361037b366004613cba565b611494565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206144f98339815191529184156103d2576103cf82856114a0565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561040457610404613e86565b600481111561041557610415613e86565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561049c5761049c613e86565b146104ee5760405162461bcd60e51b815260206004820152602a60248201525f805160206145198339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105535760405162461bcd60e51b815260206004820152603360248201525f805160206145198339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104e5565b5f61055d8461173c565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105aa576105aa613e86565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61067c856117be565b905082606001516001600160401b03168160a001516001600160401b0316116106f35760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104e5565b5f83606001518260a001516107089190613eae565b9050610714868261189d565b5f6005600160991b0163ee5b48eb61072d8987866118e5565b6040518263ffffffff1660e01b81526004016107499190613ef7565b6020604051808303815f875af1158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190613f29565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061457983398151915260205260408082208151610100810190925280545f8051602061453983398151915293929190829060ff16600581111561083857610838613e86565b600581111561084957610849613e86565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108ce576108ce613e86565b146109335760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104e5565b6005600160991b016001600160a01b031663ee5b48eb6109588584608001515f6118e5565b6040518263ffffffff1660e01b81526004016109749190613ef7565b6020604051808303815f875af1158015610990573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b49190613f29565b50505050565b5f6109ca64e8d4a5100083613f54565b92915050565b5f6109da82611b04565b90506109f781606001516001600160401b03168260400151611e77565b5050565b5f805160206144f98339815191525f610a1384611e8a565b90505f80610a24836040015161206b565b50915091505f610a33836117be565b9050816001600160401b031681608001516001600160401b03161015610a6b5760405162461bcd60e51b81526004016104e590613f67565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ab05760405162461bcd60e51b81526004016104e590613fa9565b60015f87815260068701602052604090205460ff166004811115610ad657610ad6613e86565b14610b3f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104e5565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ca6001600160401b03831664e8d4a51000613ff2565b5f610bee826117be565b60a0015192915050565b8115610c0a57610c0883826114a0565b505b610c13836122a6565b505050565b5f80610c2334612644565b90505f610c32878388876126e6565b9050610c3e8186612b2c565b9150505b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c93575080546001600160401b03808416911610155b15610cb15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610cdb83612c26565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f805160206144f98339815191525f610d4484611e8a565b90505f80610d55836040015161206b565b50915091505f610d64836117be565b9050816001600160401b031681608001516001600160401b03161015610d9c5760405162461bcd60e51b81526004016104e590613f67565b5f8681526006860160205260409020600301546001600160401b0380841691161115610dda5760405162461bcd60e51b81526004016104e590613fa9565b60035f87815260068701602052604090205460ff166004811115610e0057610e00613e86565b14610e545760405162461bcd60e51b815260206004820152603160248201525f805160206145198339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104e5565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ef991611e77565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206145398339815191525f610f5383611e8a565b90505f80610f648360400151612c3a565b9150915080610fc65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104e5565b5f82815260058501602052604081208054610fe090614009565b9050118015611012575060015f83815260068601602052604090205460ff16600581111561101057611010613e86565b145b61102e5760405162461bcd60e51b81526004016104e59061403b565b5f828152600585016020526040812061104691613bc7565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206144f983398151915293929190829060ff16600481111561115957611159613e86565b600481111561116a5761116a613e86565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111f1576111f1613e86565b148061120f575060038151600481111561120d5761120d613e86565b145b6112635760405162461bcd60e51b815260206004820152603260248201525f80516020614519833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104e5565b5f61127182604001516117be565b905080608001516001600160401b03165f036112f55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104e5565b6005600160991b016001600160a01b031663ee5b48eb611322846040015184608001518560a001516118e5565b6040518263ffffffff1660e01b815260040161133e9190613ef7565b6020604051808303815f875af115801561135a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061137e9190613f29565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145398339815191529291906113cd90614009565b90501180156113ff575060015f83815260068301602052604090205460ff1660058111156113fd576113fd613e86565b145b61141b5760405162461bcd60e51b81526004016104e59061403b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114549190600401614082565b6020604051808303815f875af1158015611470573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c139190613f29565b5f6109ca823334612ddb565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114eb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611512919081019061412b565b91509150806115755760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104e5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115dc9190613f29565b8251146116405760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104e5565b60208201516001600160a01b0316156116b65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104e5565b5f806116c5846040015161314a565b915091508187146117325760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104e5565b9695505050505050565b5f8181525f805160206145798339815191526020526040812060030180545f80516020614539833981519152916001600160401b03909116908361177f836141fd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6117c6613bfe565b5f8281525f805160206145798339815191526020526040908190208151610100810190925280545f80516020614539833981519152929190829060ff16600581111561181457611814613e86565b600581111561182557611825613e86565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614579833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561195e5761191e816001614222565b611929906008613ff2565b5081515f9083908390811061194057611940614235565b60200101906001600160f81b03191690815f1a90535060010161190a565b505f5b60048110156119c157611975816003614222565b611980906008613ff2565b6001901c60f81b82611993836002614249565b815181106119a3576119a3614235565b60200101906001600160f81b03191690815f1a905350600101611961565b505f5b6020811015611a23576119d881601f614222565b6119e3906008613ff2565b86901c60f81b826119f5836006614249565b81518110611a0557611a05614235565b60200101906001600160f81b03191690815f1a9053506001016119c4565b505f5b6008811015611a8e57611a3a816007614222565b611a45906008613ff2565b6001600160401b038616901c60f81b82611a60836026614249565b81518110611a7057611a70614235565b60200101906001600160f81b03191690815f1a905350600101611a26565b505f5b6008811015611af957611aa5816007614222565b611ab0906008613ff2565b6001600160401b038516901c60f81b82611acb83602e614249565b81518110611adb57611adb614235565b60200101906001600160f81b03191690815f1a905350600101611a91565b5090505b9392505050565b611b0c613bfe565b5f805160206145398339815191525f611b2484611e8a565b90505f80611b358360400151612c3a565b915091508015611b9a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104e5565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611bcc57611bcc613e86565b6005811115611bdd57611bdd613e86565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c6457611c64613e86565b1480611c825750600182516005811115611c8057611c80613e86565b145b611ce15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104e5565b600382516005811115611cf657611cf6613e86565b03611d0357506004611d07565b5060055b6020808301515f90815260078801909152604081205581816005811115611d3057611d30613e86565b90816005811115611d4357611d43613e86565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611d7757611d77613e86565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e4257611e42613e86565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6109f76001600160a01b03821683613322565b60408051606080820183525f8083526020830181905292820152905f805160206145398339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611eff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f26919081019061412b565b9150915080611f8d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104e5565b8254825114611ff05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104e5565b60208201516001600160a01b0316156120635760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104e5565b509392505050565b5f805f835160361461208f5760405162461bcd60e51b81526004016104e59061425c565b5f805b60028110156120de576120a6816001614222565b6120b1906008613ff2565b61ffff168682815181106120c7576120c7614235565b016020015160f81c901b9190911790600101612092565b5061ffff8116156121015760405162461bcd60e51b81526004016104e5906142a5565b5f805b600481101561215c57612118816003614222565b612123906008613ff2565b63ffffffff1687612135836002614249565b8151811061214557612145614235565b016020015160f81c901b9190911790600101612104565b5063ffffffff81166003146121835760405162461bcd60e51b81526004016104e5906142e8565b5f805b60208110156121d85761219a81601f614222565b6121a5906008613ff2565b886121b1836006614249565b815181106121c1576121c1614235565b016020015160f81c901b9190911790600101612186565b505f805b6008811015612237576121f0816007614222565b6121fb906008613ff2565b6001600160401b031689612210836026614249565b8151811061222057612220614235565b016020015160f81c901b91909117906001016121dc565b505f805b60088110156122965761224f816007614222565b61225a906008613ff2565b6001600160401b03168a61226f83602e614249565b8151811061227f5761227f614235565b016020015160f81c901b919091179060010161223b565b5091989097509095509350505050565b5f8181525f8051602061457983398151915260205260408082208151610100810190925280545f8051602061453983398151915293929190829060ff1660058111156122f4576122f4613e86565b600581111561230557612305613e86565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561238d5761238d613e86565b146123e95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104e5565b60408101516001600160a01b0316336001600160a01b0316146124635760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104e5565b6124708160a001516133b5565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156124b4576124b4613e86565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125808461257a8161173c565b5f6118e5565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125af908590600401613ef7565b6020604051808303815f875af11580156125cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ef9190613f29565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206144f9833981519152828261265e826109ba565b83549091506001600160401b0382161080159061268857508260010154816001600160401b031611155b610c425760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104e5565b5f6126ef613556565b5f80516020614539833981519152426001600160401b03851611801561272957506001600160401b038416612727426202a300614249565b115b61278b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104e5565b856127e25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104e5565b5f868152600782016020526040902054156128505760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104e5565b82516030146128b75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104e5565b6128c0856133b5565b5f806129076040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061358d565b5f828152600586016020526040902091935091506129258282614373565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612952908590600401613ef7565b6020604051808303815f875af115801561296e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129929190613f29565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612a1457612a14613e86565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c4260015f8051602061455983398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f805160206144f9833981519152908210801590612b6e575061270f8211155b612bd35760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526f65676174696f6e20666565207261746560801b60648201526084016104e5565b5f838152600582016020526040908190208390555183907ff3223a6425b3bc1637a7b768f8603f32daab5b3bb83d29c4cd6ab12fa288fbed90612c199085815260200190565b60405180910390a2505050565b612c2e613945565b612c3781613990565b50565b5f808251602714612c5d5760405162461bcd60e51b81526004016104e59061425c565b5f805b6002811015612cac57612c74816001614222565b612c7f906008613ff2565b61ffff16858281518110612c9557612c95614235565b016020015160f81c901b9190911790600101612c60565b5061ffff811615612ccf5760405162461bcd60e51b81526004016104e5906142a5565b5f805b6004811015612d2a57612ce6816003614222565b612cf1906008613ff2565b63ffffffff1686612d03836002614249565b81518110612d1357612d13614235565b016020015160f81c901b9190911790600101612cd2565b5063ffffffff8116600214612d515760405162461bcd60e51b81526004016104e5906142e8565b5f805b6020811015612da657612d6881601f614222565b612d73906008613ff2565b87612d7f836006614249565b81518110612d8f57612d8f614235565b016020015160f81c901b9190911790600101612d54565b505f86602681518110612dbb57612dbb614235565b016020015191976001600160f81b03199092161515965090945050505050565b5f612de4613556565b5f612dee836109ba565b90505f805160206144f98339815191525f612e08876117be565b9050600281516005811115612e1f57612e1f613e86565b14612e7e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104e5565b5f838260a00151612e8f9190614432565b9050612e9b888261189d565b5f612ea58961173c565b90505f898983604051602001612eed9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612f0e866133b5565b5f6005600160991b0163ee5b48eb612f278d86886118e5565b6040518263ffffffff1660e01b8152600401612f439190613ef7565b6020604051808303815f875af1158015612f5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f839190613f29565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068a01909152902081518154829060ff1916600183600481111561300b5761300b613e86565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611afd60015f8051602061455983398151915255565b5f808251602e1461316d5760405162461bcd60e51b81526004016104e59061425c565b5f805b60028110156131bc57613184816001614222565b61318f906008613ff2565b61ffff168582815181106131a5576131a5614235565b016020015160f81c901b9190911790600101613170565b5061ffff8116156131df5760405162461bcd60e51b81526004016104e5906142a5565b5f805b600481101561323a576131f6816003614222565b613201906008613ff2565b63ffffffff1686613213836002614249565b8151811061322357613223614235565b016020015160f81c901b91909117906001016131e2565b5063ffffffff81166004146132615760405162461bcd60e51b81526004016104e5906142e8565b5f805b60208110156132b65761327881601f614222565b613283906008613ff2565b8761328f836006614249565b8151811061329f5761329f614235565b016020015160f81c901b9190911790600101613264565b505f805b6008811015613315576132ce816007614222565b6132d9906008613ff2565b6001600160401b0316886132ee836026614249565b815181106132fe576132fe614235565b016020015160f81c901b91909117906001016132ba565b5090969095509350505050565b804710156133455760405163cd78605960e01b81523060048201526024016104e5565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461338e576040519150601f19603f3d011682016040523d82523d5f602084013e613393565b606091505b5050905080610c1357604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145398339815191529060ff165f036133f3575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061343b9083614222565b10613457576001600160401b0384166040830152808252613476565b83826040018181516134699190614432565b6001600160401b03169052505b5f82602001518360400151606461348d9190614452565b613497919061447d565b600285015490915060ff90811690821611156135125760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104e5565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061455983398151915280546001190161358757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135f75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104e5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561366e5761362e816001614222565b613639906008613ff2565b5081515f9083908390811061365057613650614235565b60200101906001600160f81b03191690815f1a90535060010161361a565b505f5b60048110156136cc57613685816003614222565b613690906008613ff2565b505f8261369e836002614249565b815181106136ae576136ae614235565b60200101906001600160f81b03191690815f1a905350600101613671565b505f5b602081101561372957845181602081106136eb576136eb614235565b1a60f81b826136fb836006614249565b8151811061370b5761370b614235565b60200101906001600160f81b03191690815f1a9053506001016136cf565b505f5b6020811015613789578460200151816020811061374b5761374b614235565b1a60f81b8261375b836026614249565b8151811061376b5761376b614235565b60200101906001600160f81b03191690815f1a90535060010161372c565b505f5b60088110156137fd576137a0816007614222565b6137ab906008613ff2565b60ff1685604001516001600160401b0316901c60f81b828260466137cf9190614249565b815181106137df576137df614235565b60200101906001600160f81b03191690815f1a90535060010161378c565b505f5b6030811015613868578460800151818151811061381f5761381f614235565b01602001516001600160f81b0319168261383a83604e614249565b8151811061384a5761384a614235565b60200101906001600160f81b03191690815f1a905350600101613800565b505f5b60088110156138da5761387f816007614222565b61388a906008613ff2565b60608601516001600160401b0390811691161c60f81b826138ac83607e614249565b815181106138bc576138bc614235565b60200101906001600160f81b03191690815f1a90535060010161386b565b506002816040516138eb91906144a2565b602060405180830381855afa158015613906573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139299190613f29565b94909350915050565b60015f8051602061455983398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661398e57604051631afcd79f60e31b815260040160405180910390fd5b565b613998613945565b6139a1816139d9565b612c37606082013560808301356139be60c0850160a08601613d28565b60c08501356139d4610100870160e088016144bd565b6139fa565b6139e1613945565b6139e9613b3b565b6139f1613b4b565b612c3781613b53565b613a02613945565b5f82118015613a12575061270f82105b613a845760405162461bcd60e51b815260206004820152603860248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201527f696d756d2064656c65676174696f6e206665652072617465000000000000000060648201526084016104e5565b5f805160206144f983398151915294909455507f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01919091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02805467ffffffffffffffff19166001600160401b039092169190911790557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480546001600160a01b0319166001600160a01b03909216919091179055565b613b43613945565b61398e613bbf565b61398e613945565b613b5b613945565b80355f8051602061453983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613ba560608301604084016144d8565b600291909101805460ff191660ff90921691909117905550565b613932613945565b508054613bd390614009565b5f825580601f10613be2575050565b601f0160209004905f5260205f2090810190612c379190613c42565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c56575f8155600101613c43565b5090565b8015158114612c37575f80fd5b803563ffffffff81168114613c7a575f80fd5b919050565b5f805f60608486031215613c91575f80fd5b833592506020840135613ca381613c5a565b9150613cb160408501613c67565b90509250925092565b5f60208284031215613cca575f80fd5b5035919050565b5f60208284031215613ce1575f80fd5b611afd82613c67565b5f8060408385031215613cfb575f80fd5b613d0483613c67565b946020939093013593505050565b80356001600160401b0381168114613c7a575f80fd5b5f60208284031215613d38575f80fd5b611afd82613d12565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d7757613d77613d41565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613da557613da5613d41565b604052919050565b5f6001600160401b03821115613dc557613dc5613d41565b50601f01601f191660200190565b5f805f8060808587031215613de6575f80fd5b84359350613df660208601613d12565b92506040850135915060608501356001600160401b03811115613e17575f80fd5b8501601f81018713613e27575f80fd5b8035613e3a613e3582613dad565b613d7d565b818152886020838501011115613e4e575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f6101008284031215613e80575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ece57613ece613e9a565b5092915050565b5f5b83811015613eef578181015183820152602001613ed7565b50505f910152565b602081525f8251806020840152613f15816040850160208701613ed5565b601f01601f19169190910160400192915050565b5f60208284031215613f39575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f6257613f62613f40565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ca576109ca613e9a565b600181811c9082168061401d57607f821691505b602082108103613e8057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461409481614009565b806020870152604060018084165f81146140b557600181146140d1576140fe565b60ff19851660408a0152604084151560051b8a010195506140fe565b895f5260205f205f5b858110156140f55781548b82018601529083019088016140da565b8a016040019650505b509398975050505050505050565b6001600160a01b0381168114612c37575f80fd5b8051613c7a81613c5a565b5f806040838503121561413c575f80fd5b82516001600160401b0380821115614152575f80fd5b9084019060608287031215614165575f80fd5b61416d613d55565b825181526020808401516141808161410c565b82820152604084015183811115614195575f80fd5b80850194505087601f8501126141a9575f80fd5b835192506141b9613e3584613dad565b83815288828587010111156141cc575f80fd5b6141db84838301848801613ed5565b806040840152508195506141f0818801614120565b9450505050509250929050565b5f6001600160401b0380831681810361421857614218613e9a565b6001019392505050565b818103818111156109ca576109ca613e9a565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109ca576109ca613e9a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610c1357805f5260205f20601f840160051c810160208510156143545750805b601f840160051c820191505b8181101561137e575f8155600101614360565b81516001600160401b0381111561438c5761438c613d41565b6143a08161439a8454614009565b8461432f565b602080601f8311600181146143d3575f84156143bc5750858301515b5f19600386901b1c1916600185901b17855561442a565b5f85815260208120601f198616915b82811015614401578886015182559484019460019091019084016143e2565b508582101561441e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115613ece57613ece613e9a565b6001600160401b0381811683821602808216919082811461447557614475613e9a565b505092915050565b5f6001600160401b038084168061449657614496613f40565b92169190910492915050565b5f82516144b3818460208701613ed5565b9190910192915050565b5f602082840312156144cd575f80fd5b8135611afd8161410c565b5f602082840312156144e8575f80fd5b813560ff81168114611afd575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -218,6 +219,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transa return _NativeTokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// MAXIMUMDELEGATIONFEERATE is a free data retrieval call binding the contract method 0x25d5c73f. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_RATE() view returns(uint256) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMDELEGATIONFEERATE(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_DELEGATION_FEE_RATE") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXIMUMDELEGATIONFEERATE is a free data retrieval call binding the contract method 0x25d5c73f. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_RATE() view returns(uint256) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMDELEGATIONFEERATE() (*big.Int, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMDELEGATIONFEERATE(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMDELEGATIONFEERATE is a free data retrieval call binding the contract method 0x25d5c73f. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_RATE() view returns(uint256) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMDELEGATIONFEERATE() (*big.Int, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMDELEGATIONFEERATE(&_NativeTokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) @@ -457,23 +489,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x00e41792. +// Initialize is a paid mutator transaction binding the contract method 0x96a02bb7. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) Initialize(opts *bind.TransactOpts, settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.contract.Transact(opts, "initialize", settings) } -// Initialize is a paid mutator transaction binding the contract method 0x00e41792. +// Initialize is a paid mutator transaction binding the contract method 0x96a02bb7. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } -// Initialize is a paid mutator transaction binding the contract method 0x00e41792. +// Initialize is a paid mutator transaction binding the contract method 0x96a02bb7. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } @@ -541,25 +573,25 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8d348378. // -// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, uint256 delegationFeeRate, bytes blsPublicKey) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, nodeID [32]byte, registrationExpiry uint64, delegationFeeRate *big.Int, blsPublicKey []byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", nodeID, registrationExpiry, delegationFeeRate, blsPublicKey) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8d348378. // -// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, uint256 delegationFeeRate, bytes blsPublicKey) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, delegationFeeRate *big.Int, blsPublicKey []byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, delegationFeeRate, blsPublicKey) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8d348378. // -// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, uint256 delegationFeeRate, bytes blsPublicKey) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, delegationFeeRate *big.Int, blsPublicKey []byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, delegationFeeRate, blsPublicKey) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -787,6 +819,151 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelega return event, nil } +// NativeTokenStakingManagerDelegationFeeRateSetIterator is returned from FilterDelegationFeeRateSet and is used to iterate over the raw logs and unpacked data for DelegationFeeRateSet events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegationFeeRateSetIterator struct { + Event *NativeTokenStakingManagerDelegationFeeRateSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerDelegationFeeRateSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegationFeeRateSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegationFeeRateSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerDelegationFeeRateSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerDelegationFeeRateSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerDelegationFeeRateSet represents a DelegationFeeRateSet event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegationFeeRateSet struct { + ValidationID [32]byte + DelegationFeeRate *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegationFeeRateSet is a free log retrieval operation binding the contract event 0xf3223a6425b3bc1637a7b768f8603f32daab5b3bb83d29c4cd6ab12fa288fbed. +// +// Solidity: event DelegationFeeRateSet(bytes32 indexed validationID, uint256 delegationFeeRate) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationFeeRateSet(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerDelegationFeeRateSetIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationFeeRateSet", validationIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerDelegationFeeRateSetIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationFeeRateSet", logs: logs, sub: sub}, nil +} + +// WatchDelegationFeeRateSet is a free log subscription operation binding the contract event 0xf3223a6425b3bc1637a7b768f8603f32daab5b3bb83d29c4cd6ab12fa288fbed. +// +// Solidity: event DelegationFeeRateSet(bytes32 indexed validationID, uint256 delegationFeeRate) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationFeeRateSet(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationFeeRateSet, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationFeeRateSet", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerDelegationFeeRateSet) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationFeeRateSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegationFeeRateSet is a log parse operation binding the contract event 0xf3223a6425b3bc1637a7b768f8603f32daab5b3bb83d29c4cd6ab12fa288fbed. +// +// Solidity: event DelegationFeeRateSet(bytes32 indexed validationID, uint256 delegationFeeRate) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationFeeRateSet(log types.Log) (*NativeTokenStakingManagerDelegationFeeRateSet, error) { + event := new(NativeTokenStakingManagerDelegationFeeRateSet) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationFeeRateSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // NativeTokenStakingManagerDelegatorAddedIterator is returned from FilterDelegatorAdded and is used to iterate over the raw logs and unpacked data for DelegatorAdded events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorAddedIterator struct { Event *NativeTokenStakingManagerDelegatorAdded // Event containing the contract specifics and raw log diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 33f8efe5f..3f2466d92 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -88,16 +88,21 @@ contract ERC20TokenStakingManager is * @param stakeAmount The amount to be staked. * @param nodeID The node ID of the validator being registered. * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. + * @param delegationFeeRate The fee charged to delegators by the validator. * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, + uint256 delegationFeeRate, bytes memory blsPublicKey - ) external returns (bytes32 validationID) { + ) external returns (bytes32) { uint64 weight = _processStake(stakeAmount); - return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); + bytes32 validationID = + _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); + _setDelegationFeeRate(validationID, delegationFeeRate); + return validationID; } /** diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 8763d0e7f..5d9b76d1b 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -51,15 +51,20 @@ contract NativeTokenStakingManager is * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. * @param registrationExpiry The Unix timestamp after which the registration is no longer valid on the P-Chain. + * @param delegationFeeRate The fee rate in basis points charged by this validator for delegations. * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, + uint256 delegationFeeRate, bytes memory blsPublicKey ) external payable returns (bytes32) { uint64 weight = _processStake(msg.value); - return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); + bytes32 validationID = + _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); + _setDelegationFeeRate(validationID, delegationFeeRate); + return validationID; } /** diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 5d4f9541b..5a1bcc6a3 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -27,8 +27,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _maximumStakeAmount; /// @notice The minimum amount of time a validator must be staked for. uint64 _minimumStakeDuration; + /// @notice The minimum fee rate in basis points charged to the delegators by the validator. + uint256 _minimumDelegationFeeRate; /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; + /// @notice Maps the validationID to the delegation fee rate. + mapping(bytes32 validationID => uint256) _validatorDelegationFeeRates; /// @notice Maps the delegationID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; } @@ -39,6 +43,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bytes32 private constant _POS_VALIDATOR_MANAGER_STORAGE_LOCATION = 0x4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00; + // The maximum delegation fee rate in basis points. This is 99.99% + uint256 public constant MAXIMUM_DELEGATION_FEE_RATE = 1e4 - 1; + // solhint-disable ordering function _getPoSValidatorManagerStorage() private @@ -61,6 +68,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager settings.minimumStakeAmount, settings.maximumStakeAmount, settings.minimumStakeDuration, + settings.minimumDelegationFeeRate, settings.rewardCalculator ); } @@ -70,8 +78,13 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 minimumStakeAmount, uint256 maximumStakeAmount, uint64 minimumStakeDuration, + uint256 minimumDelegationFeeRate, IRewardCalculator rewardCalculator ) internal onlyInitializing { + require( + minimumDelegationFeeRate > 0 && minimumDelegationFeeRate < MAXIMUM_DELEGATION_FEE_RATE, + "PoSValidatorManager: invalid minimum delegation fee rate" + ); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; @@ -92,6 +105,18 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _initializeEndValidation(validationID); } + // This should only be called from inside the initializeValidatorRegistration functions + // of the child contracts. + function _setDelegationFeeRate(bytes32 validationID, uint256 feeRate) internal { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + require( + feeRate >= $._minimumDelegationFeeRate && feeRate <= MAXIMUM_DELEGATION_FEE_RATE, + "PoSValidatorManager: invalid delegation fee rate" + ); + $._validatorDelegationFeeRates[validationID] = feeRate; + emit DelegationFeeRateSet(validationID, feeRate); + } + function completeEndValidation(uint32 messageIndex) external { Validator memory validator = _completeEndValidation(messageIndex); _unlock(validator.startingWeight, validator.owner); diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 7fb576e82..ce08f7e41 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -97,6 +97,7 @@ abstract contract ValidatorManager is /** * @notice Begins the validator registration process, and sets the initial weight for the validator. * @param nodeID The node ID of the validator being registered. + * @param weight The weight of the validator being registered. * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. * @param blsPublicKey The BLS public key of the validator. */ diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 2d59cfb83..13f0ac438 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -10,14 +10,17 @@ import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; interface IERC20TokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. + * @param stakeAmount The amount of the ERC20 token to stake. * @param nodeID The node ID of the validator being registered. * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. + * @param delegationFeeRate The fee rate in basis points charged by this validator for delegations. * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, + uint256 delegationFeeRate, bytes memory blsPublicKey ) external returns (bytes32 validationID); diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index 947d146bc..3676fe0b7 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -12,11 +12,13 @@ interface INativeTokenStakingManager is IPoSValidatorManager { * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. + * @param delegationFeeRate The fee rate in basis points charged by this validator for delegations. * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, + uint256 delegationFeeRate, bytes memory blsPublicKey ) external payable returns (bytes32 validationID); diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index e5c7ed2b0..1749ccedf 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -21,6 +21,7 @@ struct PoSValidatorManagerSettings { uint256 minimumStakeAmount; uint256 maximumStakeAmount; uint64 minimumStakeDuration; + uint256 minimumDelegationFeeRate; IRewardCalculator rewardCalculator; } @@ -36,6 +37,13 @@ struct Delegator { } interface IPoSValidatorManager is IValidatorManager { + /** + * @notice Event emitted when a validator's delegation fee is set. This is only emitted at the start of a validation + * @param validationID The ID of the validation period + * @param delegationFeeRate Fee rate in basis points charged by this validator its delegators. + */ + event DelegationFeeRateSet(bytes32 indexed validationID, uint256 delegationFeeRate); + /** * @notice Event emitted when a delegator registration is initiated * @param delegationID The ID of the delegation diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 36b877a52..b4a862560 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -37,10 +37,12 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeRate: DEFAULT_MINIMUM_DELEGATION_FEE_RATE, rewardCalculator: IRewardCalculator(address(0)) }), token ); + delegationFeeRate = DEFAULT_MINIMUM_DELEGATION_FEE_RATE; validatorManager = app; posValidatorManager = app; } @@ -52,7 +54,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { uint64 weight ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration( - app.weightToValue(weight), nodeID, registrationExpiry, signature + app.weightToValue(weight), nodeID, registrationExpiry, delegationFeeRate, signature ); } diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index dcee84052..d7b428ec4 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -13,7 +13,7 @@ contract ExampleRewardCalculatorTest is Test { uint256 public constant DEFAULT_STAKE_AMOUNT = 1e12; uint64 public constant DEFAULT_START_TIME = 1000; - uint64 public constant DEFAULT_END_TIME = 31537000; // a year + 1000 seonds + uint64 public constant DEFAULT_END_TIME = 31537000; // a year + 1000 seconds uint64 public constant DEFAULT_REWARD_BASIS_POINTS = 42; function setUp() public { diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 467ed85f8..645e8f212 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -30,9 +30,11 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeRate: DEFAULT_MINIMUM_DELEGATION_FEE_RATE, rewardCalculator: IRewardCalculator(address(0)) }) ); + delegationFeeRate = DEFAULT_MINIMUM_DELEGATION_FEE_RATE; validatorManager = app; posValidatorManager = app; } @@ -45,7 +47,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { uint64 weight ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration{value: app.weightToValue(weight)}( - nodeID, registrationExpiry, signature + nodeID, registrationExpiry, delegationFeeRate, signature ); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index a1e7ea65e..0dce1ea45 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -22,6 +22,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); + // This is the rate that will be passed into the child contract `initializeValidatorRegistration` calls + // It is set here to avoid having to pass irrelevant initializers to the parent contract. + uint256 public delegationFeeRate; + PoSValidatorManager public posValidatorManager; event DelegatorAdded( diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 28fdd64c2..8056902d1 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -38,6 +38,7 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_EXPIRY = 1000; uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 2000; + uint256 public constant DEFAULT_MINIMUM_DELEGATION_FEE_RATE = 100; // 1% ValidatorManager public validatorManager; diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 367121ca0..81b507f1c 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -151,10 +151,11 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { SubnetID: subnetAInfo.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour), + MinimumDelegationFeeRate: big.NewInt(0).SetUint64(100), + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 31dde39f1..2e2d222b3 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -71,10 +71,11 @@ func DeployAndInitializeNativeTokenStakingManager( SubnetID: subnet.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour), + MinimumDelegationFeeRate: big.NewInt(0).SetUint64(100), + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) @@ -131,10 +132,11 @@ func DeployAndInitializeERC20TokenStakingManager( SubnetID: subnet.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(1e6), + MaximumStakeAmount: big.NewInt(10e6), + MinimumStakeDuration: uint64(24 * time.Hour), + MinimumDelegationFeeRate: big.NewInt(100), + RewardCalculator: common.Address{}, }, erc20Address, ) @@ -213,6 +215,7 @@ func InitializeNativeValidatorRegistration( opts, nodeID, uint64(time.Now().Add(24*time.Hour).Unix()), + big.NewInt(100), blsPublicKey[:], ) Expect(err).Should(BeNil()) @@ -252,6 +255,7 @@ func InitializeERC20ValidatorRegistration( stakeAmount, nodeID, uint64(time.Now().Add(24*time.Hour).Unix()), + big.NewInt(100), blsPublicKey[:], ) Expect(err).Should(BeNil())