diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6c1c39fa8..c15551c16 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20Mintable\"}],\"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\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"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: "0x608060405234801561000f575f80fd5b506040516148f43803806148f483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147a78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e13565b6102d6565b005b610128610138366004613e4e565b610761565b61017b61014b366004613e4e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e4e565b6108bd565b6101286101af366004613e79565b61092a565b6101c76101c2366004613e4e565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613eb6565b610a24565b610128610200366004613ecf565b610a4f565b61017b610213366004613f0d565b610c40565b6101c7610226366004613e4e565b610c59565b610128610239366004613e4e565b610c6d565b61012861024c366004613e13565b610cda565b61017b61025f366004613fb8565b610cf5565b610128610272366004613ecf565b610d1a565b61017b610285366004614054565b610f49565b610128610298366004613eb6565b610f5c565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e4e565b611119565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146fb8339815191529184156103285761032582856111e8565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614074565b600481111561036b5761036b614074565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614074565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061471b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061471b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611484565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614074565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856114f8565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061409c565b905061066a86826115d7565b5f61067687858461161f565b5f8c815260058a01602052604090209091506106928282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614227565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614259565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061473b8339815191529291906107a9906140c3565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9614074565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614259565b505050565b6108c68161183c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461190b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361430e565b92915050565b5f610a2e82611925565b9050610a4b81606001516001600160401b03168260400151611cb2565b5050565b5f805160206146fb8339815191525f610a6784611ce8565b90505f80610a788360400151611ec9565b5091509150610a8685612104565b5f8581526004850160205260408120610a9e91613d5b565b5f610aa8836114f8565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614321565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b90614363565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b614074565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a510006143ac565b5f610c63826114f8565b60a0015192915050565b610c7681612104565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b8115610cec57610cea83826111e8565b505b6108b8836121dd565b5f80610d0086612595565b9050610d0e85828686612642565b9150505b949350505050565b5f805160206146fb8339815191525f610d3284611ce8565b90505f80610d438360400151611ec9565b5091509150610d518561183c565b5f8581526005850160205260408120610d6991613d5b565b5f610d73836114f8565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614321565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b90614363565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f614074565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061471b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f079190611cb2565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f55833384612a97565b9392505050565b5f8051602061473b8339815191525f610f7483611ce8565b90505f80610f858360400151612e52565b9150915080610fe75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054611001906140c3565b9050118015611033575060015f83815260078601602052604090205460ff16600581111561103157611031614074565b145b61104f5760405162461bcd60e51b815260040161043b906143c3565b5f828152600585016020526040812061106791613d5b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061473b833981519152929190611161906140c3565b9050118015611193575060015f83815260078301602052604090205460ff16600581111561119157611191614074565b145b6111af5760405162461bcd60e51b815260040161043b906143c3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611233573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125a9190810190614415565b91509150806112bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113249190614259565b8251146113885760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156113fe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061140d8460400151612ff3565b9150915081871461147a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f8051602061477b8339815191526020526040812060030180545f8051602061473b833981519152916001600160401b03909116908190846114c9836144e7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611500613d92565b5f8281525f8051602061477b8339815191526020526040908190208151610100810190925280545f8051602061473b833981519152929190829060ff16600581111561154e5761154e614074565b600581111561155f5761155f614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061477b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116985761165881600161450c565b6116639060086143ac565b5081515f9083908390811061167a5761167a61451f565b60200101906001600160f81b03191690815f1a905350600101611644565b505f5b60048110156116fb576116af81600361450c565b6116ba9060086143ac565b6001901c60f81b826116cd836002614533565b815181106116dd576116dd61451f565b60200101906001600160f81b03191690815f1a90535060010161169b565b505f5b602081101561175d5761171281601f61450c565b61171d9060086143ac565b86901c60f81b8261172f836006614533565b8151811061173f5761173f61451f565b60200101906001600160f81b03191690815f1a9053506001016116fe565b505f5b60088110156117c85761177481600761450c565b61177f9060086143ac565b6001600160401b038616901c60f81b8261179a836026614533565b815181106117aa576117aa61451f565b60200101906001600160f81b03191690815f1a905350600101611760565b505f5b6008811015611833576117df81600761450c565b6117ea9060086143ac565b6001600160401b038516901c60f81b8261180583602e614533565b815181106118155761181561451f565b60200101906001600160f81b03191690815f1a9053506001016117cb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206146fb833981519152929190611884906140c3565b90501180156118b6575060035f83815260038301602052604090205460ff1660048111156118b4576118b4614074565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061471b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b6119136131cb565b61191c82613216565b610a4b8161325c565b61192d613d92565b5f8051602061473b8339815191525f61194584611ce8565b90505f806119568360400151612e52565b9150915080156119bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff1660058111156119ed576119ed614074565b60058111156119fe576119fe614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8557611a85614074565b1480611aa35750600182516005811115611aa157611aa1614074565b145b611b025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1757611b17614074565b03611b3e57505f8381526006860160205260408120600491611b399190613d5b565b611b42565b5060055b6020808301515f90815260088801909152604081205581816005811115611b6b57611b6b614074565b90816005811115611b7e57611b7e614074565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bb257611bb2614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7d57611c7d614074565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613310565b60408051606080820183525f8083526020830181905292820152905f8051602061473b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d849190810190614415565b9150915080611deb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eed5760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015611f3c57611f0481600161450c565b611f0f9060086143ac565b61ffff16868281518110611f2557611f2561451f565b016020015160f81c901b9190911790600101611ef0565b5061ffff811615611f5f5760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015611fba57611f7681600361450c565b611f819060086143ac565b63ffffffff1687611f93836002614533565b81518110611fa357611fa361451f565b016020015160f81c901b9190911790600101611f62565b5063ffffffff8116600314611fe15760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561203657611ff881601f61450c565b6120039060086143ac565b8861200f836006614533565b8151811061201f5761201f61451f565b016020015160f81c901b9190911790600101611fe4565b505f805b60088110156120955761204e81600761450c565b6120599060086143ac565b6001600160401b03168961206e836026614533565b8151811061207e5761207e61451f565b016020015160f81c901b919091179060010161203a565b505f805b60088110156120f4576120ad81600761450c565b6120b89060086143ac565b6001600160401b03168a6120cd83602e614533565b815181106120dd576120dd61451f565b016020015160f81c901b9190911790600101612099565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146fb83398151915292919061214c906140c3565b905011801561217e575060015f83815260038301602052604090205460ff16600481111561217c5761217c614074565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061471b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061477b83398151915260205260408082208151610100810190925280545f8051602061473b83398151915293929190829060ff16600581111561222b5761222b614074565b600581111561223c5761223c614074565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c4576122c4614074565b146123205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461239a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a78160a0015161336f565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123eb576123eb614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b7846124b181611484565b5f61161f565b5f85815260068501602052604090209091506124d38282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612500908590600401614227565b6020604051808303815f875af115801561251c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125409190614259565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146fb833981519152816125ae84613510565b90505f6125ba82610a0e565b83549091506001600160401b038216108015906125e457508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61264b613546565b5f8051602061473b833981519152426001600160401b03851611801561268557506001600160401b038416612683426202a300614533565b115b6126e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561273e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156127ac5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61281c8561336f565b5f806128636040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061357d565b5f828152600586016020526040902091935091506128818282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128ae908590600401614227565b6020604051808303815f875af11580156128ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ee9190614259565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561297057612970614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a3183611484565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f8051602061475b83398151915255565b5f612aa0613546565b5f612aad6101c284613510565b90505f805160206146fb8339815191525f612ac7876114f8565b9050600281516005811115612ade57612ade614074565b14612b3d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612b4e9190614619565b9050612b5a88826115d7565b5f612b6489611484565b90505f898983604051602001612bac9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612bcd8661336f565b5f612bd98b848661161f565b5f8381526004880160205260409020909150612bf58282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c22908590600401614227565b6020604051808303815f875af1158015612c3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c629190614259565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d1157612d11614074565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f5560015f8051602061475b83398151915255565b5f808251602714612e755760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015612ec457612e8c81600161450c565b612e979060086143ac565b61ffff16858281518110612ead57612ead61451f565b016020015160f81c901b9190911790600101612e78565b5061ffff811615612ee75760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015612f4257612efe81600361450c565b612f099060086143ac565b63ffffffff1686612f1b836002614533565b81518110612f2b57612f2b61451f565b016020015160f81c901b9190911790600101612eea565b5063ffffffff8116600214612f695760405162461bcd60e51b815260040161043b906145d2565b5f805b6020811015612fbe57612f8081601f61450c565b612f8b9060086143ac565b87612f97836006614533565b81518110612fa757612fa761451f565b016020015160f81c901b9190911790600101612f6c565b505f86602681518110612fd357612fd361451f565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130165760405162461bcd60e51b815260040161043b90614546565b5f805b60028110156130655761302d81600161450c565b6130389060086143ac565b61ffff1685828151811061304e5761304e61451f565b016020015160f81c901b9190911790600101613019565b5061ffff8116156130885760405162461bcd60e51b815260040161043b9061458f565b5f805b60048110156130e35761309f81600361450c565b6130aa9060086143ac565b63ffffffff16866130bc836002614533565b815181106130cc576130cc61451f565b016020015160f81c901b919091179060010161308b565b5063ffffffff811660041461310a5760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561315f5761312181601f61450c565b61312c9060086143ac565b87613138836006614533565b815181106131485761314861451f565b016020015160f81c901b919091179060010161310d565b505f805b60088110156131be5761317781600761450c565b6131829060086143ac565b6001600160401b031688613197836026614533565b815181106131a7576131a761451f565b016020015160f81c901b9190911790600101613163565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661321457604051631afcd79f60e31b815260040160405180910390fd5b565b61321e6131cb565b61322781613935565b6132596060820135608083013561324460c0850160a08601613f0d565b61325460e0860160c08701614639565b613956565b50565b6132646131cb565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132f05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506139b1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061473b8339815191529060ff165f036133ad575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133f5908361450c565b10613411576001600160401b0384166040830152808252613430565b83826040018181516134239190614619565b6001600160401b03169052505b5f8260200151836040015160646134479190614654565b613451919061467f565b600285015490915060ff90811690821611156134cc5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a12565b5f8051602061475b83398151915280546001190161357757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135e75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365e5761361e81600161450c565b6136299060086143ac565b5081515f908390839081106136405761364061451f565b60200101906001600160f81b03191690815f1a90535060010161360a565b505f5b60048110156136bc5761367581600361450c565b6136809060086143ac565b505f8261368e836002614533565b8151811061369e5761369e61451f565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b602081101561371957845181602081106136db576136db61451f565b1a60f81b826136eb836006614533565b815181106136fb576136fb61451f565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6020811015613779578460200151816020811061373b5761373b61451f565b1a60f81b8261374b836026614533565b8151811061375b5761375b61451f565b60200101906001600160f81b03191690815f1a90535060010161371c565b505f5b60088110156137ed5761379081600761450c565b61379b9060086143ac565b60ff1685604001516001600160401b0316901c60f81b828260466137bf9190614533565b815181106137cf576137cf61451f565b60200101906001600160f81b03191690815f1a90535060010161377c565b505f5b6030811015613858578460800151818151811061380f5761380f61451f565b01602001516001600160f81b0319168261382a83604e614533565b8151811061383a5761383a61451f565b60200101906001600160f81b03191690815f1a9053506001016137f0565b505f5b60088110156138ca5761386f81600761450c565b61387a9060086143ac565b60608601516001600160401b0390811691161c60f81b8261389c83607e614533565b815181106138ac576138ac61451f565b60200101906001600160f81b03191690815f1a90535060010161385b565b506002816040516138db91906146a4565b602060405180830381855afa1580156138f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139199190614259565b94909350915050565b60015f8051602061475b83398151915255565b61393d6131cb565b613945613b74565b61394d613b84565b61325981613b8c565b61395e6131cb565b5f5f805160206146fb833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139c56001600160a01b03841683613bf8565b905080515f141580156139e95750808060200190518101906139e791906146bf565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7c9190614259565b9050613a936001600160a01b038516333086613c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ad7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afb9190614259565b9050818111613b615760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613b6b828261450c565b95945050505050565b613b7c6131cb565b613214613c44565b6132146131cb565b613b946131cb565b80355f8051602061473b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bde60608301604084016146da565b600291909101805460ff191660ff90921691909117905550565b6060610f5583835f613c4c565b6040516001600160a01b038481166024830152838116604483015260648201839052613c3e9186918216906323b872dd9060840161333d565b50505050565b6139226131cb565b606081471015613c715760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613c8c91906146a4565b5f6040518083038185875af1925050503d805f8114613cc6576040519150601f19603f3d011682016040523d82523d5f602084013e613ccb565b606091505b509150915061147a868383606082613ceb57613ce682613d32565b610f55565b8151158015613d0257506001600160a01b0384163b155b15613d2b57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f55565b805115613d425780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d67906140c3565b5f825580601f10613d76575050565b601f0160209004905f5260205f20908101906132599190613dd6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613dea575f8155600101613dd7565b5090565b8015158114613259575f80fd5b803563ffffffff81168114613e0e575f80fd5b919050565b5f805f60608486031215613e25575f80fd5b833592506020840135613e3781613dee565b9150613e4560408501613dfb565b90509250925092565b5f60208284031215613e5e575f80fd5b5035919050565b6001600160a01b0381168114613259575f80fd5b5f80828403610100811215613e8c575f80fd5b60e0811215613e99575f80fd5b5082915060e0830135613eab81613e65565b809150509250929050565b5f60208284031215613ec6575f80fd5b610f5582613dfb565b5f8060408385031215613ee0575f80fd5b613ee983613dfb565b946020939093013593505050565b80356001600160401b0381168114613e0e575f80fd5b5f60208284031215613f1d575f80fd5b610f5582613ef7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f5c57613f5c613f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f8a57613f8a613f26565b604052919050565b5f6001600160401b03821115613faa57613faa613f26565b50601f01601f191660200190565b5f805f8060808587031215613fcb575f80fd5b8435935060208501359250613fe260408601613ef7565b915060608501356001600160401b03811115613ffc575f80fd5b8501601f8101871361400c575f80fd5b803561401f61401a82613f92565b613f62565b818152886020838501011115614033575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614065575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140bc576140bc614088565b5092915050565b600181811c908216806140d757607f821691505b6020821081036140f557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156141205750805b601f840160051c820191505b8181101561413f575f815560010161412c565b5050505050565b81516001600160401b0381111561415f5761415f613f26565b6141738161416d84546140c3565b846140fb565b602080601f8311600181146141a6575f841561418f5750858301515b5f19600386901b1c1916600185901b1785556141fd565b5f85815260208120601f198616915b828110156141d4578886015182559484019460019091019084016141b5565b50858210156141f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561421f578181015183820152602001614207565b50505f910152565b602081525f8251806020840152614245816040850160208701614205565b601f01601f19169190910160400192915050565b5f60208284031215614269575f80fd5b5051919050565b5f60208083525f8454614282816140c3565b806020870152604060018084165f81146142a357600181146142bf576142ec565b60ff19851660408a0152604084151560051b8a010195506142ec565b895f5260205f205f5b858110156142e35781548b82018601529083019088016142c8565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261431c5761431c6142fa565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e614088565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e0e81613dee565b5f8060408385031215614426575f80fd5b82516001600160401b038082111561443c575f80fd5b908401906060828703121561444f575f80fd5b614457613f3a565b8251815260208084015161446a81613e65565b8282015260408401518381111561447f575f80fd5b80850194505087601f850112614493575f80fd5b835192506144a361401a84613f92565b83815288828587010111156144b6575f80fd5b6144c584838301848801614205565b806040840152508195506144da81880161440a565b9450505050509250929050565b5f6001600160401b0380831681810361450257614502614088565b6001019392505050565b81810381811115610a1e57610a1e614088565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e614088565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140bc576140bc614088565b5f60208284031215614649575f80fd5b8135610f5581613e65565b6001600160401b0381811683821602808216919082811461467757614677614088565b505092915050565b5f6001600160401b0380841680614698576146986142fa565b92169190910492915050565b5f82516146b5818460208701614205565b9190910192915050565b5f602082840312156146cf575f80fd5b8151610f5581613dee565b5f602082840312156146ea575f80fd5b813560ff81168114610f55575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614ada380380614ada83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61498d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613fd9565b6102d6565b005b610128610138366004614014565b610761565b61017b61014b366004614014565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004614014565b6108bd565b6101286101af36600461403f565b61092a565b6101c76101c2366004614014565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed36600461407c565b610a24565b610128610200366004614095565b610b1e565b61017b6102133660046140d3565b610d0f565b6101c7610226366004614014565b610d28565b610128610239366004614014565b610d3c565b61012861024c366004613fd9565b610da9565b61017b61025f36600461417e565b610dc4565b610128610272366004614095565b610de9565b61017b61028536600461421a565b6110d4565b61012861029836600461407c565b6110e7565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004614014565b6112a4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206148e1833981519152918415610328576103258285611373565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a61423a565b600481111561036b5761036b61423a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f261423a565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149018339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149018339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461160f565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156105005761050061423a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611683565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614262565b905061066a8682611762565b5f6106768785846117aa565b5f8c815260058a0160205260409020909150610692828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016143ed565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff919061441f565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149218339815191529291906107a990614289565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d961423a565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b8919061441f565b505050565b6108c6816119c7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc8484611a9a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a51000836144d4565b92915050565b5f610a2e82611ab4565b90505f5f805160206148e1833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610ac9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aed919061441f565b9050610afd836040015182611e41565b610b1883606001516001600160401b03168460400151611eb7565b50505050565b5f805160206148e18339815191525f610b3684611eda565b90505f80610b4783604001516120bb565b5091509150610b55856122f6565b5f8581526004850160205260408120610b6d91613f21565b5f610b7783611683565b9050816001600160401b031681608001516001600160401b03161015610baf5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bf45760405162461bcd60e51b815260040161043b90614529565b60015f87815260038701602052604090205460ff166004811115610c1a57610c1a61423a565b14610c835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a51000614572565b5f610d3282611683565b60a0015192915050565b610d45816122f6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b8115610dbb57610db98382611373565b505b6108b8836123cf565b5f80610dcf86612787565b9050610ddd85828686612834565b9150505b949350505050565b5f805160206148e18339815191525f610e0184611eda565b90505f80610e1283604001516120bb565b5091509150610e20856119c7565b5f8581526005850160205260408120610e3891613f21565b5f610e4283611683565b9050816001600160401b031681608001516001600160401b03161015610e7a5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003808701602052604090912001546001600160401b0380841691161115610eb85760405162461bcd60e51b815260040161043b90614529565b60035f87815260038701602052604090205460ff166004811115610ede57610ede61423a565b14610f325760405162461bcd60e51b815260206004820152603160248201525f805160206149018339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610fd69190611eb7565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561105d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611081919061441f565b9050611091826020015182611e41565b836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f6110e0833384612c89565b9392505050565b5f805160206149218339815191525f6110ff83611eda565b90505f806111108360400151613044565b91509150806111725760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526005850160205260408120805461118c90614289565b90501180156111be575060015f83815260078601602052604090205460ff1660058111156111bc576111bc61423a565b145b6111da5760405162461bcd60e51b815260040161043b90614589565b5f82815260058501602052604081206111f291613f21565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149218339815191529291906112ec90614289565b905011801561131e575060015f83815260078301602052604090205460ff16600581111561131c5761131c61423a565b145b61133a5760405162461bcd60e51b815260040161043b90614589565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113e591908101906145db565b91509150806114485760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114af919061441f565b8251146115135760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156115895760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061159884604001516131e5565b915091508187146116055760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206149618339815191526020526040812060030180545f80516020614921833981519152916001600160401b0390911690819084611654836146ad565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61168b613f58565b5f8281525f805160206149618339815191526020526040908190208151610100810190925280545f80516020614921833981519152929190829060ff1660058111156116d9576116d961423a565b60058111156116ea576116ea61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614961833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611823576117e38160016146d2565b6117ee906008614572565b5081515f90839083908110611805576118056146e5565b60200101906001600160f81b03191690815f1a9053506001016117cf565b505f5b60048110156118865761183a8160036146d2565b611845906008614572565b6001901c60f81b826118588360026146f9565b81518110611868576118686146e5565b60200101906001600160f81b03191690815f1a905350600101611826565b505f5b60208110156118e85761189d81601f6146d2565b6118a8906008614572565b86901c60f81b826118ba8360066146f9565b815181106118ca576118ca6146e5565b60200101906001600160f81b03191690815f1a905350600101611889565b505f5b6008811015611953576118ff8160076146d2565b61190a906008614572565b6001600160401b038616901c60f81b826119258360266146f9565b81518110611935576119356146e5565b60200101906001600160f81b03191690815f1a9053506001016118eb565b505f5b60088110156119be5761196a8160076146d2565b611975906008614572565b6001600160401b038516901c60f81b8261199083602e6146f9565b815181106119a0576119a06146e5565b60200101906001600160f81b03191690815f1a905350600101611956565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206148e1833981519152929190611a0f90614289565b9050118015611a41575060035f83815260038301602052604090205460ff166004811115611a3f57611a3f61423a565b145b611a965760405162461bcd60e51b815260206004820152603360248201525f8051602061490183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611aa26133bd565b611aab82613408565b611a968161344e565b611abc613f58565b5f805160206149218339815191525f611ad484611eda565b90505f80611ae58360400151613044565b915091508015611b4a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611b7c57611b7c61423a565b6005811115611b8d57611b8d61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c1457611c1461423a565b1480611c325750600182516005811115611c3057611c3061423a565b145b611c915760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611ca657611ca661423a565b03611ccd57505f8381526006860160205260408120600491611cc89190613f21565b611cd1565b5060055b6020808301515f90815260088801909152604081205581816005811115611cfa57611cfa61423a565b90816005811115611d0d57611d0d61423a565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611d4157611d4161423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e0c57611e0c61423a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206148c183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611e9c575f80fd5b505af1158015611eae573d5f803e3d5ffd5b50505050505050565b5f805160206148c183398151915254611a96906001600160a01b031682846134ef565b60408051606080820183525f8083526020830181905292820152905f805160206149218339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f4f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7691908101906145db565b9150915080611fdd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b82548251146120405760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b0316156120b35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f83516036146120df5760405162461bcd60e51b815260040161043b9061470c565b5f805b600281101561212e576120f68160016146d2565b612101906008614572565b61ffff16868281518110612117576121176146e5565b016020015160f81c901b91909117906001016120e2565b5061ffff8116156121515760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156121ac576121688160036146d2565b612173906008614572565b63ffffffff16876121858360026146f9565b81518110612195576121956146e5565b016020015160f81c901b9190911790600101612154565b5063ffffffff81166003146121d35760405162461bcd60e51b815260040161043b90614798565b5f805b6020811015612228576121ea81601f6146d2565b6121f5906008614572565b886122018360066146f9565b81518110612211576122116146e5565b016020015160f81c901b91909117906001016121d6565b505f805b6008811015612287576122408160076146d2565b61224b906008614572565b6001600160401b0316896122608360266146f9565b81518110612270576122706146e5565b016020015160f81c901b919091179060010161222c565b505f805b60088110156122e65761229f8160076146d2565b6122aa906008614572565b6001600160401b03168a6122bf83602e6146f9565b815181106122cf576122cf6146e5565b016020015160f81c901b919091179060010161228b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206148e183398151915292919061233e90614289565b9050118015612370575060015f83815260038301602052604090205460ff16600481111561236e5761236e61423a565b145b611a965760405162461bcd60e51b815260206004820152603860248201525f8051602061490183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061496183398151915260205260408082208151610100810190925280545f8051602061492183398151915293929190829060ff16600581111561241d5761241d61423a565b600581111561242e5761242e61423a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b6576124b661423a565b146125125760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461258c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6125998160a0015161354e565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125dd576125dd61423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126a9846126a38161160f565b5f6117aa565b5f85815260068501602052604090209091506126c5828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f29085906004016143ed565b6020604051808303815f875af115801561270e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612732919061441f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206148e1833981519152816127a0846136ef565b90505f6127ac82610a0e565b83549091506001600160401b038216108015906127d657508260010154816001600160401b031611155b610de15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61283d613712565b5f80516020614921833981519152426001600160401b03851611801561287757506001600160401b038416612875426202a3006146f9565b115b6128d95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856129305760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526008820160205260409020541561299e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b612a0e8561354e565b5f80612a556040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613749565b5f82815260058601602052604090209193509150612a73828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612aa09085906004016143ed565b6020604051808303815f875af1158015612abc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae0919061441f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612b6257612b6261423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612c238361160f565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610de160015f8051602061494183398151915255565b5f612c92613712565b5f612c9f6101c2846136ef565b90505f805160206148e18339815191525f612cb987611683565b9050600281516005811115612cd057612cd061423a565b14612d2f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612d4091906147df565b9050612d4c8882611762565b5f612d568961160f565b90505f898983604051602001612d9e9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612dbf8661354e565b5f612dcb8b84866117aa565b5f8381526004880160205260409020909150612de7828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e149085906004016143ed565b6020604051808303815f875af1158015612e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e54919061441f565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f0357612f0361423a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506110e060015f8051602061494183398151915255565b5f8082516027146130675760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156130b65761307e8160016146d2565b613089906008614572565b61ffff1685828151811061309f5761309f6146e5565b016020015160f81c901b919091179060010161306a565b5061ffff8116156130d95760405162461bcd60e51b815260040161043b90614755565b5f805b6004811015613134576130f08160036146d2565b6130fb906008614572565b63ffffffff168661310d8360026146f9565b8151811061311d5761311d6146e5565b016020015160f81c901b91909117906001016130dc565b5063ffffffff811660021461315b5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156131b05761317281601f6146d2565b61317d906008614572565b876131898360066146f9565b81518110613199576131996146e5565b016020015160f81c901b919091179060010161315e565b505f866026815181106131c5576131c56146e5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132085760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156132575761321f8160016146d2565b61322a906008614572565b61ffff16858281518110613240576132406146e5565b016020015160f81c901b919091179060010161320b565b5061ffff81161561327a5760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156132d5576132918160036146d2565b61329c906008614572565b63ffffffff16866132ae8360026146f9565b815181106132be576132be6146e5565b016020015160f81c901b919091179060010161327d565b5063ffffffff81166004146132fc5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156133515761331381601f6146d2565b61331e906008614572565b8761332a8360066146f9565b8151811061333a5761333a6146e5565b016020015160f81c901b91909117906001016132ff565b505f805b60088110156133b0576133698160076146d2565b613374906008614572565b6001600160401b0316886133898360266146f9565b81518110613399576133996146e5565b016020015160f81c901b9190911790600101613355565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661340657604051631afcd79f60e31b815260040160405180910390fd5b565b6134106133bd565b61341981613b01565b61344b6060820135608083013561343660c0850160a086016140d3565b61344660e0860160c087016147ff565b613b22565b50565b6134566133bd565b5f805160206148c18339815191526001600160a01b0382166134cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613b7d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149218339815191529060ff165f0361358c575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135d490836146d2565b106135f0576001600160401b038416604083015280825261360f565b838260400181815161360291906147df565b6001600160401b03169052505b5f826020015183604001516064613626919061481a565b6136309190614845565b600285015490915060ff90811690821611156136ab5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e825f805160206148c1833981519152546001600160a01b031690613bde565b5f8051602061494183398151915280546001190161374357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146137b35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561382a576137ea8160016146d2565b6137f5906008614572565b5081515f9083908390811061380c5761380c6146e5565b60200101906001600160f81b03191690815f1a9053506001016137d6565b505f5b6004811015613888576138418160036146d2565b61384c906008614572565b505f8261385a8360026146f9565b8151811061386a5761386a6146e5565b60200101906001600160f81b03191690815f1a90535060010161382d565b505f5b60208110156138e557845181602081106138a7576138a76146e5565b1a60f81b826138b78360066146f9565b815181106138c7576138c76146e5565b60200101906001600160f81b03191690815f1a90535060010161388b565b505f5b60208110156139455784602001518160208110613907576139076146e5565b1a60f81b826139178360266146f9565b81518110613927576139276146e5565b60200101906001600160f81b03191690815f1a9053506001016138e8565b505f5b60088110156139b95761395c8160076146d2565b613967906008614572565b60ff1685604001516001600160401b0316901c60f81b8282604661398b91906146f9565b8151811061399b5761399b6146e5565b60200101906001600160f81b03191690815f1a905350600101613948565b505f5b6030811015613a2457846080015181815181106139db576139db6146e5565b01602001516001600160f81b031916826139f683604e6146f9565b81518110613a0657613a066146e5565b60200101906001600160f81b03191690815f1a9053506001016139bc565b505f5b6008811015613a9657613a3b8160076146d2565b613a46906008614572565b60608601516001600160401b0390811691161c60f81b82613a6883607e6146f9565b81518110613a7857613a786146e5565b60200101906001600160f81b03191690815f1a905350600101613a27565b50600281604051613aa7919061486a565b602060405180830381855afa158015613ac2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ae5919061441f565b94909350915050565b60015f8051602061494183398151915255565b613b096133bd565b613b11613d40565b613b19613d50565b61344b81613d58565b613b2a6133bd565b5f5f805160206148e1833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613b916001600160a01b03841683613dc4565b905080515f14158015613bb5575080806020019051810190613bb39190614885565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c48919061441f565b9050613c5f6001600160a01b038516333086613dd1565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc7919061441f565b9050818111613d2d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613d3782826146d2565b95945050505050565b613d486133bd565b613406613e0a565b6134066133bd565b613d606133bd565b80355f8051602061492183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613daa60608301604084016148a0565b600291909101805460ff191660ff90921691909117905550565b60606110e083835f613e12565b6040516001600160a01b038481166024830152838116604483015260648201839052610b189186918216906323b872dd9060840161351c565b613aee6133bd565b606081471015613e375760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613e52919061486a565b5f6040518083038185875af1925050503d805f8114613e8c576040519150601f19603f3d011682016040523d82523d5f602084013e613e91565b606091505b5091509150611605868383606082613eb157613eac82613ef8565b6110e0565b8151158015613ec857506001600160a01b0384163b155b15613ef157604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b50806110e0565b805115613f085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f2d90614289565b5f825580601f10613f3c575050565b601f0160209004905f5260205f209081019061344b9190613f9c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fb0575f8155600101613f9d565b5090565b801515811461344b575f80fd5b803563ffffffff81168114613fd4575f80fd5b919050565b5f805f60608486031215613feb575f80fd5b833592506020840135613ffd81613fb4565b915061400b60408501613fc1565b90509250925092565b5f60208284031215614024575f80fd5b5035919050565b6001600160a01b038116811461344b575f80fd5b5f80828403610100811215614052575f80fd5b60e081121561405f575f80fd5b5082915060e08301356140718161402b565b809150509250929050565b5f6020828403121561408c575f80fd5b6110e082613fc1565b5f80604083850312156140a6575f80fd5b6140af83613fc1565b946020939093013593505050565b80356001600160401b0381168114613fd4575f80fd5b5f602082840312156140e3575f80fd5b6110e0826140bd565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614122576141226140ec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614150576141506140ec565b604052919050565b5f6001600160401b03821115614170576141706140ec565b50601f01601f191660200190565b5f805f8060808587031215614191575f80fd5b84359350602085013592506141a8604086016140bd565b915060608501356001600160401b038111156141c2575f80fd5b8501601f810187136141d2575f80fd5b80356141e56141e082614158565b614128565b8181528860208385010111156141f9575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561422b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142825761428261424e565b5092915050565b600181811c9082168061429d57607f821691505b6020821081036142bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156142e65750805b601f840160051c820191505b81811015614305575f81556001016142f2565b5050505050565b81516001600160401b03811115614325576143256140ec565b614339816143338454614289565b846142c1565b602080601f83116001811461436c575f84156143555750858301515b5f19600386901b1c1916600185901b1785556143c3565b5f85815260208120601f198616915b8281101561439a5788860151825594840194600190910190840161437b565b50858210156143b757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156143e55781810151838201526020016143cd565b50505f910152565b602081525f825180602084015261440b8160408501602087016143cb565b601f01601f19169190910160400192915050565b5f6020828403121561442f575f80fd5b5051919050565b5f60208083525f845461444881614289565b806020870152604060018084165f81146144695760018114614485576144b2565b60ff19851660408a0152604084151560051b8a010195506144b2565b895f5260205f205f5b858110156144a95781548b820186015290830190880161448e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826144e2576144e26144c0565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e61424e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613fd481613fb4565b5f80604083850312156145ec575f80fd5b82516001600160401b0380821115614602575f80fd5b9084019060608287031215614615575f80fd5b61461d614100565b825181526020808401516146308161402b565b82820152604084015183811115614645575f80fd5b80850194505087601f850112614659575f80fd5b835192506146696141e084614158565b838152888285870101111561467c575f80fd5b61468b848383018488016143cb565b806040840152508195506146a08188016145d0565b9450505050509250929050565b5f6001600160401b038083168181036146c8576146c861424e565b6001019392505050565b81810381811115610a1e57610a1e61424e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e61424e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142825761428261424e565b5f6020828403121561480f575f80fd5b81356110e08161402b565b6001600160401b0381811683821602808216919082811461483d5761483d61424e565b505092915050565b5f6001600160401b038084168061485e5761485e6144c0565b92169190910492915050565b5f825161487b8184602087016143cb565b9190910192915050565b5f60208284031215614895575f80fd5b81516110e081613fb4565b5f602082840312156148b0575f80fd5b813560ff811681146110e0575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go new file mode 100644 index 000000000..75980496a --- /dev/null +++ b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -0,0 +1,296 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package examplerewardcalculator + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ExampleRewardCalculatorMetaData contains all meta data concerning the ExampleRewardCalculator contract. +var ExampleRewardCalculatorMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"rewardBasisPoints_\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SECONDS_IN_YEAR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"rewardBasisPoints\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"}]", + Bin: "0x60a0604052348015600e575f80fd5b5060405161029d38038061029d833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161021a6100835f395f81816079015260d3015261021a5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780639d4ba9db14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014b565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6103e86301e133806100c787876101a9565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961010791906101d1565b61011191906101d1565b61011b91906101ee565b61012591906101ee565b9695505050505050565b803567ffffffffffffffff81168114610146575f80fd5b919050565b5f805f805f60a0868803121561015f575f80fd5b8535945061016f6020870161012f565b935061017d6040870161012f565b94979396509394606081013594506080013592915050565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ca576101ca610195565b5092915050565b80820281158282048414176101e8576101e8610195565b92915050565b5f8261020857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", +} + +// ExampleRewardCalculatorABI is the input ABI used to generate the binding from. +// Deprecated: Use ExampleRewardCalculatorMetaData.ABI instead. +var ExampleRewardCalculatorABI = ExampleRewardCalculatorMetaData.ABI + +// ExampleRewardCalculatorBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ExampleRewardCalculatorMetaData.Bin instead. +var ExampleRewardCalculatorBin = ExampleRewardCalculatorMetaData.Bin + +// DeployExampleRewardCalculator deploys a new Ethereum contract, binding an instance of ExampleRewardCalculator to it. +func DeployExampleRewardCalculator(auth *bind.TransactOpts, backend bind.ContractBackend, rewardBasisPoints_ uint64) (common.Address, *types.Transaction, *ExampleRewardCalculator, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ExampleRewardCalculatorBin), backend, rewardBasisPoints_) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// ExampleRewardCalculator is an auto generated Go binding around an Ethereum contract. +type ExampleRewardCalculator struct { + ExampleRewardCalculatorCaller // Read-only binding to the contract + ExampleRewardCalculatorTransactor // Write-only binding to the contract + ExampleRewardCalculatorFilterer // Log filterer for contract events +} + +// ExampleRewardCalculatorCaller is an auto generated read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ExampleRewardCalculatorFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ExampleRewardCalculatorSession struct { + Contract *ExampleRewardCalculator // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ExampleRewardCalculatorCallerSession struct { + Contract *ExampleRewardCalculatorCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ExampleRewardCalculatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ExampleRewardCalculatorTransactorSession struct { + Contract *ExampleRewardCalculatorTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorRaw is an auto generated low-level Go binding around an Ethereum contract. +type ExampleRewardCalculatorRaw struct { + Contract *ExampleRewardCalculator // Generic contract binding to access the raw methods on +} + +// ExampleRewardCalculatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCallerRaw struct { + Contract *ExampleRewardCalculatorCaller // Generic read-only contract binding to access the raw methods on +} + +// ExampleRewardCalculatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactorRaw struct { + Contract *ExampleRewardCalculatorTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewExampleRewardCalculator creates a new instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculator(address common.Address, backend bind.ContractBackend) (*ExampleRewardCalculator, error) { + contract, err := bindExampleRewardCalculator(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// NewExampleRewardCalculatorCaller creates a new read-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorCaller(address common.Address, caller bind.ContractCaller) (*ExampleRewardCalculatorCaller, error) { + contract, err := bindExampleRewardCalculator(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorCaller{contract: contract}, nil +} + +// NewExampleRewardCalculatorTransactor creates a new write-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorTransactor(address common.Address, transactor bind.ContractTransactor) (*ExampleRewardCalculatorTransactor, error) { + contract, err := bindExampleRewardCalculator(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorTransactor{contract: contract}, nil +} + +// NewExampleRewardCalculatorFilterer creates a new log filterer instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorFilterer(address common.Address, filterer bind.ContractFilterer) (*ExampleRewardCalculatorFilterer, error) { + contract, err := bindExampleRewardCalculator(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorFilterer{contract: contract}, nil +} + +// bindExampleRewardCalculator binds a generic wrapper to an already deployed contract. +func bindExampleRewardCalculator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transact(opts, method, params...) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) SECONDSINYEAR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "SECONDS_IN_YEAR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, startTime, endTime, arg3, arg4) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) RewardBasisPoints(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "rewardBasisPoints") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 417ebce75..24b9a52d7 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndValidation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"includeUptimeProof\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeValidatorRegistration\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendRegisterValidatorMessage\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"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: "0x608060405234801561000f575f80fd5b5060405161452538038061452583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d88061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613a91565b610389565b005b348015610134575f80fd5b50610127610143366004613acc565b61046b565b348015610153575f80fd5b50610127610162366004613b07565b6108f6565b348015610172575f80fd5b506101b1610181366004613b07565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613b07565b610a52565b3480156101ee575f80fd5b506102026101fd366004613b07565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613b1e565b610ad5565b348015610244575f80fd5b50610127610253366004613b37565b610b00565b348015610263575f80fd5b506101b1610272366004613b75565b610cf1565b348015610282575f80fd5b50610202610291366004613b07565b610d0a565b3480156102a1575f80fd5b506101276102b0366004613b07565b610d1e565b3480156102c0575f80fd5b506101276102cf366004613acc565b610d8b565b3480156102df575f80fd5b506101276102ee366004613b37565b610da6565b3480156102fe575f80fd5b5061012761030d366004613b1e565b610fd5565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613b07565b611192565b6101b1610371366004613b07565b611261565b6101b1610384366004613c20565b61126d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611291565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061432c8339815191529184156104bd576104ba82856112a5565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613cb2565b600481111561050057610500613cb2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613cb2565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f8051602061434c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f61064884611541565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613cb2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610767856115b5565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613cda565b90506107ff8682611694565b5f61080b8785846116dc565b5f8c815260058a01602052604090209091506108278282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613e5f565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613e91565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061436c83398151915292919061093e90613d01565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613cb2565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613e91565b505050565b610a5b816118f9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b5f610acf64e8d4a5100083613f46565b92915050565b5f610adf826119c8565b9050610afc81606001516001600160401b03168260400151611d55565b5050565b5f8051602061432c8339815191525f610b1884611d68565b90505f80610b298360400151611f49565b5091509150610b3785612184565b5f8581526004850160205260408120610b4f916139fe565b5f610b59836115b5565b9050816001600160401b031681608001516001600160401b03161015610b915760405162461bcd60e51b81526004016105d090613f59565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bd65760405162461bcd60e51b81526004016105d090613f9b565b60015f87815260038701602052604090205460ff166004811115610bfc57610bfc613cb2565b14610c655760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613fe4565b5f610d14826115b5565b60a0015192915050565b610d2781612184565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b8115610d9d57610d9b83826112a5565b505b610a4d8361225d565b5f8051602061432c8339815191525f610dbe84611d68565b90505f80610dcf8360400151611f49565b5091509150610ddd856118f9565b5f8581526005850160205260408120610df5916139fe565b5f610dff836115b5565b9050816001600160401b031681608001516001600160401b03161015610e375760405162461bcd60e51b81526004016105d090613f59565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e755760405162461bcd60e51b81526004016105d090613f9b565b60035f87815260038701602052604090205460ff166004811115610e9b57610e9b613cb2565b14610eef5760405162461bcd60e51b815260206004820152603160248201525f8051602061434c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f939190611d55565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061436c8339815191525f610fed83611d68565b90505f80610ffe8360400151612615565b91509150806110605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461107a90613d01565b90501180156110ac575060015f83815260078601602052604090205460ff1660058111156110aa576110aa613cb2565b145b6110c85760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058501602052604081206110e0916139fe565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061436c8339815191529291906111da90613d01565b905011801561120c575060015f83815260078301602052604090205460ff16600581111561120a5761120a613cb2565b145b6112285760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b5f610acf8233346127b6565b5f8061127834612b6e565b905061128685828686612c18565b9150505b9392505050565b61129961306d565b6112a2816130b8565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112f0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113179190810190614061565b915091508061137a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e19190613e91565b8251146114455760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156114bb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f806114ca84604001516130fb565b915091508187146115375760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f805160206143ac8339815191526020526040812060030180545f8051602061436c833981519152916001600160401b039091169081908461158683614133565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115bd613a35565b5f8281525f805160206143ac8339815191526020526040908190208151610100810190925280545f8051602061436c833981519152929190829060ff16600581111561160b5761160b613cb2565b600581111561161c5761161c613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206143ac833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175557611715816001614158565b611720906008613fe4565b5081515f908390839081106117375761173761416b565b60200101906001600160f81b03191690815f1a905350600101611701565b505f5b60048110156117b85761176c816003614158565b611777906008613fe4565b6001901c60f81b8261178a83600261417f565b8151811061179a5761179a61416b565b60200101906001600160f81b03191690815f1a905350600101611758565b505f5b602081101561181a576117cf81601f614158565b6117da906008613fe4565b86901c60f81b826117ec83600661417f565b815181106117fc576117fc61416b565b60200101906001600160f81b03191690815f1a9053506001016117bb565b505f5b600881101561188557611831816007614158565b61183c906008613fe4565b6001600160401b038616901c60f81b8261185783602661417f565b815181106118675761186761416b565b60200101906001600160f81b03191690815f1a90535060010161181d565b505f5b60088110156118f05761189c816007614158565b6118a7906008613fe4565b6001600160401b038516901c60f81b826118c283602e61417f565b815181106118d2576118d261416b565b60200101906001600160f81b03191690815f1a905350600101611888565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061432c83398151915292919061194190613d01565b9050118015611973575060035f83815260038301602052604090205460ff16600481111561197157611971613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b6119d0613a35565b5f8051602061436c8339815191525f6119e884611d68565b90505f806119f98360400151612615565b915091508015611a5e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a9057611a90613cb2565b6005811115611aa157611aa1613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b2857611b28613cb2565b1480611b465750600182516005811115611b4457611b44613cb2565b145b611ba55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611bba57611bba613cb2565b03611be157505f8381526006860160205260408120600491611bdc91906139fe565b611be5565b5060055b6020808301515f90815260088801909152604081205581816005811115611c0e57611c0e613cb2565b90816005811115611c2157611c21613cb2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c5557611c55613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2057611d20613cb2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610afc6001600160a01b038216836132d3565b60408051606080820183525f8083526020830181905292820152905f8051602061436c8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ddd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e049190810190614061565b9150915080611e6b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611ece5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611f415760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f8351603614611f6d5760405162461bcd60e51b81526004016105d090614192565b5f805b6002811015611fbc57611f84816001614158565b611f8f906008613fe4565b61ffff16868281518110611fa557611fa561416b565b016020015160f81c901b9190911790600101611f70565b5061ffff811615611fdf5760405162461bcd60e51b81526004016105d0906141db565b5f805b600481101561203a57611ff6816003614158565b612001906008613fe4565b63ffffffff168761201383600261417f565b815181106120235761202361416b565b016020015160f81c901b9190911790600101611fe2565b5063ffffffff81166003146120615760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156120b65761207881601f614158565b612083906008613fe4565b8861208f83600661417f565b8151811061209f5761209f61416b565b016020015160f81c901b9190911790600101612064565b505f805b6008811015612115576120ce816007614158565b6120d9906008613fe4565b6001600160401b0316896120ee83602661417f565b815181106120fe576120fe61416b565b016020015160f81c901b91909117906001016120ba565b505f805b60088110156121745761212d816007614158565b612138906008613fe4565b6001600160401b03168a61214d83602e61417f565b8151811061215d5761215d61416b565b016020015160f81c901b9190911790600101612119565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061432c8339815191529291906121cc90613d01565b90501180156121fe575060015f83815260038301602052604090205460ff1660048111156121fc576121fc613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603860248201525f8051602061434c83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f805160206143ac83398151915260205260408082208151610100810190925280545f8051602061436c83398151915293929190829060ff1660058111156122ab576122ab613cb2565b60058111156122bc576122bc613cb2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561234457612344613cb2565b146123a05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461241a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6124278160a00151613366565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561246b5761246b613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125378461253181611541565b5f6116dc565b5f85815260068501602052604090209091506125538282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612580908590600401613e5f565b6020604051808303815f875af115801561259c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c09190613e91565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146126385760405162461bcd60e51b81526004016105d090614192565b5f805b60028110156126875761264f816001614158565b61265a906008613fe4565b61ffff168582815181106126705761267061416b565b016020015160f81c901b919091179060010161263b565b5061ffff8116156126aa5760405162461bcd60e51b81526004016105d0906141db565b5f805b6004811015612705576126c1816003614158565b6126cc906008613fe4565b63ffffffff16866126de83600261417f565b815181106126ee576126ee61416b565b016020015160f81c901b91909117906001016126ad565b5063ffffffff811660021461272c5760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156127815761274381601f614158565b61274e906008613fe4565b8761275a83600661417f565b8151811061276a5761276a61416b565b016020015160f81c901b919091179060010161272f565b505f866026815181106127965761279661416b565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127bf613507565b5f6127c983610abf565b90505f8051602061432c8339815191525f6127e3876115b5565b90506002815160058111156127fa576127fa613cb2565b146128595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a0015161286a9190614265565b90506128768882611694565b5f61288089611541565b90505f8989836040516020016128c89392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506128e986613366565b5f6128f58b84866116dc565b5f83815260048801602052604090209091506129118282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061293e908590600401613e5f565b6020604051808303815f875af115801561295a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297e9190613e91565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a2d57612a2d613cb2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061128a60015f8051602061438c83398151915255565b5f5f8051602061432c8339815191528282612b8882610abf565b83549091506001600160401b03821610801590612bb257508260010154816001600160401b031611155b612c105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612c21613507565b5f8051602061436c833981519152426001600160401b038516118015612c5b57506001600160401b038416612c59426202a30061417f565b115b612cbd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612d145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612d825760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612de95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612df285613366565b5f80612e396040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613551565b5f82815260058601602052604090209193509150612e578282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e84908590600401613e5f565b6020604051808303815f875af1158015612ea0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ec49190613e91565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612f4657612f46613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561300783611541565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c1060015f8051602061438c83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130b657604051631afcd79f60e31b815260040160405180910390fd5b565b6130c061306d565b6130c9816138f6565b6112a2606082013560808301356130e660c0850160a08601613b75565b6130f660e0860160c08701614285565b613917565b5f808251602e1461311e5760405162461bcd60e51b81526004016105d090614192565b5f805b600281101561316d57613135816001614158565b613140906008613fe4565b61ffff168582815181106131565761315661416b565b016020015160f81c901b9190911790600101613121565b5061ffff8116156131905760405162461bcd60e51b81526004016105d0906141db565b5f805b60048110156131eb576131a7816003614158565b6131b2906008613fe4565b63ffffffff16866131c483600261417f565b815181106131d4576131d461416b565b016020015160f81c901b9190911790600101613193565b5063ffffffff81166004146132125760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156132675761322981601f614158565b613234906008613fe4565b8761324083600661417f565b815181106132505761325061416b565b016020015160f81c901b9190911790600101613215565b505f805b60088110156132c65761327f816007614158565b61328a906008613fe4565b6001600160401b03168861329f83602661417f565b815181106132af576132af61416b565b016020015160f81c901b919091179060010161326b565b5090969095509350505050565b804710156132f65760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461333f576040519150601f19603f3d011682016040523d82523d5f602084013e613344565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061436c8339815191529060ff165f036133a4575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ec9083614158565b10613408576001600160401b0384166040830152808252613427565b838260400181815161341a9190614265565b6001600160401b03169052505b5f82602001518360400151606461343e91906142a0565b61344891906142cb565b600285015490915060ff90811690821611156134c35760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061438c83398151915280546001190161353857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061438c83398151915255565b5f60608260800151516030146135bb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613632576135f2816001614158565b6135fd906008613fe4565b5081515f908390839081106136145761361461416b565b60200101906001600160f81b03191690815f1a9053506001016135de565b505f5b600481101561369057613649816003614158565b613654906008613fe4565b505f8261366283600261417f565b815181106136725761367261416b565b60200101906001600160f81b03191690815f1a905350600101613635565b505f5b60208110156136ed57845181602081106136af576136af61416b565b1a60f81b826136bf83600661417f565b815181106136cf576136cf61416b565b60200101906001600160f81b03191690815f1a905350600101613693565b505f5b602081101561374d578460200151816020811061370f5761370f61416b565b1a60f81b8261371f83602661417f565b8151811061372f5761372f61416b565b60200101906001600160f81b03191690815f1a9053506001016136f0565b505f5b60088110156137c157613764816007614158565b61376f906008613fe4565b60ff1685604001516001600160401b0316901c60f81b82826046613793919061417f565b815181106137a3576137a361416b565b60200101906001600160f81b03191690815f1a905350600101613750565b505f5b603081101561382c57846080015181815181106137e3576137e361416b565b01602001516001600160f81b031916826137fe83604e61417f565b8151811061380e5761380e61416b565b60200101906001600160f81b03191690815f1a9053506001016137c4565b505f5b600881101561389e57613843816007614158565b61384e906008613fe4565b60608601516001600160401b0390811691161c60f81b8261387083607e61417f565b815181106138805761388061416b565b60200101906001600160f81b03191690815f1a90535060010161382f565b506002816040516138af91906142f0565b602060405180830381855afa1580156138ca573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ed9190613e91565b94909350915050565b6138fe61306d565b613906613972565b61390e613982565b6112a28161398a565b61391f61306d565b5f5f8051602061432c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61397a61306d565b6130b66139f6565b6130b661306d565b61399261306d565b80355f8051602061436c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139dc606083016040840161430b565b600291909101805460ff191660ff90921691909117905550565b61353e61306d565b508054613a0a90613d01565b5f825580601f10613a19575050565b601f0160209004905f5260205f20908101906112a29190613a79565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613a8d575f8155600101613a7a565b5090565b5f60e08284031215613aa1575f80fd5b50919050565b80151581146112a2575f80fd5b803563ffffffff81168114613ac7575f80fd5b919050565b5f805f60608486031215613ade575f80fd5b833592506020840135613af081613aa7565b9150613afe60408501613ab4565b90509250925092565b5f60208284031215613b17575f80fd5b5035919050565b5f60208284031215613b2e575f80fd5b61128a82613ab4565b5f8060408385031215613b48575f80fd5b613b5183613ab4565b946020939093013593505050565b80356001600160401b0381168114613ac7575f80fd5b5f60208284031215613b85575f80fd5b61128a82613b5f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bc457613bc4613b8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bf257613bf2613b8e565b604052919050565b5f6001600160401b03821115613c1257613c12613b8e565b50601f01601f191660200190565b5f805f60608486031215613c32575f80fd5b83359250613c4260208501613b5f565b915060408401356001600160401b03811115613c5c575f80fd5b8401601f81018613613c6c575f80fd5b8035613c7f613c7a82613bfa565b613bca565b818152876020838501011115613c93575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613cfa57613cfa613cc6565b5092915050565b600181811c90821680613d1557607f821691505b602082108103613aa157634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613d585750805b601f840160051c820191505b81811015613d77575f8155600101613d64565b5050505050565b81516001600160401b03811115613d9757613d97613b8e565b613dab81613da58454613d01565b84613d33565b602080601f831160018114613dde575f8415613dc75750858301515b5f19600386901b1c1916600185901b178555613e35565b5f85815260208120601f198616915b82811015613e0c57888601518255948401946001909101908401613ded565b5085821015613e2957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613e57578181015183820152602001613e3f565b50505f910152565b602081525f8251806020840152613e7d816040850160208701613e3d565b601f01601f19169190910160400192915050565b5f60208284031215613ea1575f80fd5b5051919050565b5f60208083525f8454613eba81613d01565b806020870152604060018084165f8114613edb5760018114613ef757613f24565b60ff19851660408a0152604084151560051b8a01019550613f24565b895f5260205f205f5b85811015613f1b5781548b8201860152908301908801613f00565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f5457613f54613f32565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613cc6565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146112a2575f80fd5b8051613ac781613aa7565b5f8060408385031215614072575f80fd5b82516001600160401b0380821115614088575f80fd5b908401906060828703121561409b575f80fd5b6140a3613ba2565b825181526020808401516140b681614042565b828201526040840151838111156140cb575f80fd5b80850194505087601f8501126140df575f80fd5b835192506140ef613c7a84613bfa565b8381528882858701011115614102575f80fd5b61411184838301848801613e3d565b80604084015250819550614126818801614056565b9450505050509250929050565b5f6001600160401b0380831681810361414e5761414e613cc6565b6001019392505050565b81810381811115610acf57610acf613cc6565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613cc6565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613cfa57613cfa613cc6565b5f60208284031215614295575f80fd5b813561128a81614042565b6001600160401b038181168382160280821691908281146142c3576142c3613cc6565b505092915050565b5f6001600160401b03808416806142e4576142e4613f32565b92169190910492915050565b5f8251614301818460208701613e3d565b9190910192915050565b5f6020828403121561431b575f80fd5b813560ff8116811461128a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161469838038061469883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61454b8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c04565b610389565b005b348015610134575f80fd5b50610127610143366004613c3f565b61046b565b348015610153575f80fd5b50610127610162366004613c7a565b6108f6565b348015610172575f80fd5b506101b1610181366004613c7a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613c7a565b610a52565b3480156101ee575f80fd5b506102026101fd366004613c7a565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613c91565b610ad5565b348015610244575f80fd5b50610127610253366004613caa565b610bc1565b348015610263575f80fd5b506101b1610272366004613ce8565b610db2565b348015610282575f80fd5b50610202610291366004613c7a565b610dcb565b3480156102a1575f80fd5b506101276102b0366004613c7a565b610ddf565b3480156102c0575f80fd5b506101276102cf366004613c3f565b610e4c565b3480156102df575f80fd5b506101276102ee366004613caa565b610e67565b3480156102fe575f80fd5b5061012761030d366004613c91565b611144565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613c7a565b611301565b6101b1610371366004613c7a565b6113d0565b6101b1610384366004613d93565b6113dc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611400565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061449f8339815191529184156104bd576104ba8285611414565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613e25565b600481111561050057610500613e25565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613e25565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206144bf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206144bf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f610648846116b0565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613e25565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611724565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613e4d565b90506107ff8682611803565b5f61080b87858461184b565b5f8c815260058a01602052604090209091506108278282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613fd2565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190614004565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206144df83398151915292919061093e90613e74565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613e25565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190614004565b505050565b610a5b81611a68565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b5f610acf64e8d4a51000836140b9565b92915050565b5f610adf82611b3b565b90505f5f8051602061449f833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610b7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614004565b9050610bbb83606001516001600160401b03168460400151611ec8565b50505050565b5f8051602061449f8339815191525f610bd984611edb565b90505f80610bea83604001516120bc565b5091509150610bf8856122f7565b5f8581526004850160205260408120610c1091613b71565b5f610c1a83611724565b9050816001600160401b031681608001516001600160401b03161015610c525760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c975760405162461bcd60e51b81526004016105d09061410e565b60015f87815260038701602052604090205460ff166004811115610cbd57610cbd613e25565b14610d265760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000614157565b5f610dd582611724565b60a0015192915050565b610de8816122f7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b8115610e5e57610e5c8382611414565b505b610a4d836123d0565b5f8051602061449f8339815191525f610e7f84611edb565b90505f80610e9083604001516120bc565b5091509150610e9e85611a68565b5f8581526005850160205260408120610eb691613b71565b5f610ec083611724565b9050816001600160401b031681608001516001600160401b03161015610ef85760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003808701602052604090912001546001600160401b0380841691161115610f365760405162461bcd60e51b81526004016105d09061410e565b60035f87815260038701602052604090205460ff166004811115610f5c57610f5c613e25565b14610fb05760405162461bcd60e51b815260206004820152603160248201525f805160206144bf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110549190611ec8565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa1580156110db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ff9190614004565b9050836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f805160206144df8339815191525f61115c83611edb565b90505f8061116d8360400151612788565b91509150806111cf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f828152600585016020526040812080546111e990613e74565b905011801561121b575060015f83815260078601602052604090205460ff16600581111561121957611219613e25565b145b6112375760405162461bcd60e51b81526004016105d09061416e565b5f828152600585016020526040812061124f91613b71565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144df83398151915292919061134990613e74565b905011801561137b575060015f83815260078301602052604090205460ff16600581111561137957611379613e25565b145b6113975760405162461bcd60e51b81526004016105d09061416e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b5f610acf823334612929565b5f806113e734612ce1565b90506113f585828686612d8b565b9150505b9392505050565b6114086131e0565b6114118161322b565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561145f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261148691908101906141d4565b91509150806114e95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561152c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115509190614004565b8251146115b45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b03161561162a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f80611639846040015161326e565b915091508187146116a65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061451f8339815191526020526040812060030180545f805160206144df833981519152916001600160401b03909116908190846116f5836142a6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61172c613ba8565b5f8281525f8051602061451f8339815191526020526040908190208151610100810190925280545f805160206144df833981519152929190829060ff16600581111561177a5761177a613e25565b600581111561178b5761178b613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061451f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118c4576118848160016142cb565b61188f906008614157565b5081515f908390839081106118a6576118a66142de565b60200101906001600160f81b03191690815f1a905350600101611870565b505f5b6004811015611927576118db8160036142cb565b6118e6906008614157565b6001901c60f81b826118f98360026142f2565b81518110611909576119096142de565b60200101906001600160f81b03191690815f1a9053506001016118c7565b505f5b60208110156119895761193e81601f6142cb565b611949906008614157565b86901c60f81b8261195b8360066142f2565b8151811061196b5761196b6142de565b60200101906001600160f81b03191690815f1a90535060010161192a565b505f5b60088110156119f4576119a08160076142cb565b6119ab906008614157565b6001600160401b038616901c60f81b826119c68360266142f2565b815181106119d6576119d66142de565b60200101906001600160f81b03191690815f1a90535060010161198c565b505f5b6008811015611a5f57611a0b8160076142cb565b611a16906008614157565b6001600160401b038516901c60f81b82611a3183602e6142f2565b81518110611a4157611a416142de565b60200101906001600160f81b03191690815f1a9053506001016119f7565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061449f833981519152929190611ab090613e74565b9050118015611ae2575060035f83815260038301602052604090205460ff166004811115611ae057611ae0613e25565b145b611b375760405162461bcd60e51b815260206004820152603360248201525f805160206144bf83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b611b43613ba8565b5f805160206144df8339815191525f611b5b84611edb565b90505f80611b6c8360400151612788565b915091508015611bd15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c0357611c03613e25565b6005811115611c1457611c14613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c9b57611c9b613e25565b1480611cb95750600182516005811115611cb757611cb7613e25565b145b611d185760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611d2d57611d2d613e25565b03611d5457505f8381526006860160205260408120600491611d4f9190613b71565b611d58565b5060055b6020808301515f90815260088801909152604081205581816005811115611d8157611d81613e25565b90816005811115611d9457611d94613e25565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611dc857611dc8613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e9357611e93613e25565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611b376001600160a01b03821683613446565b60408051606080820183525f8083526020830181905292820152905f805160206144df8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7791908101906141d4565b9150915080611fde5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b82548251146120415760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b0316156120b45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f83516036146120e05760405162461bcd60e51b81526004016105d090614305565b5f805b600281101561212f576120f78160016142cb565b612102906008614157565b61ffff16868281518110612118576121186142de565b016020015160f81c901b91909117906001016120e3565b5061ffff8116156121525760405162461bcd60e51b81526004016105d09061434e565b5f805b60048110156121ad576121698160036142cb565b612174906008614157565b63ffffffff16876121868360026142f2565b81518110612196576121966142de565b016020015160f81c901b9190911790600101612155565b5063ffffffff81166003146121d45760405162461bcd60e51b81526004016105d090614391565b5f805b6020811015612229576121eb81601f6142cb565b6121f6906008614157565b886122028360066142f2565b81518110612212576122126142de565b016020015160f81c901b91909117906001016121d7565b505f805b6008811015612288576122418160076142cb565b61224c906008614157565b6001600160401b0316896122618360266142f2565b81518110612271576122716142de565b016020015160f81c901b919091179060010161222d565b505f805b60088110156122e7576122a08160076142cb565b6122ab906008614157565b6001600160401b03168a6122c083602e6142f2565b815181106122d0576122d06142de565b016020015160f81c901b919091179060010161228c565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061449f83398151915292919061233f90613e74565b9050118015612371575060015f83815260038301602052604090205460ff16600481111561236f5761236f613e25565b145b611b375760405162461bcd60e51b815260206004820152603860248201525f805160206144bf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061451f83398151915260205260408082208151610100810190925280545f805160206144df83398151915293929190829060ff16600581111561241e5761241e613e25565b600581111561242f5761242f613e25565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b7576124b7613e25565b146125135760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461258d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b61259a8160a001516134d9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125de576125de613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126aa846126a4816116b0565b5f61184b565b5f85815260068501602052604090209091506126c68282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f3908590600401613fd2565b6020604051808303815f875af115801561270f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127339190614004565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146127ab5760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156127fa576127c28160016142cb565b6127cd906008614157565b61ffff168582815181106127e3576127e36142de565b016020015160f81c901b91909117906001016127ae565b5061ffff81161561281d5760405162461bcd60e51b81526004016105d09061434e565b5f805b6004811015612878576128348160036142cb565b61283f906008614157565b63ffffffff16866128518360026142f2565b81518110612861576128616142de565b016020015160f81c901b9190911790600101612820565b5063ffffffff811660021461289f5760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156128f4576128b681601f6142cb565b6128c1906008614157565b876128cd8360066142f2565b815181106128dd576128dd6142de565b016020015160f81c901b91909117906001016128a2565b505f86602681518110612909576129096142de565b016020015191976001600160f81b03199092161515965090945050505050565b5f61293261367a565b5f61293c83610abf565b90505f8051602061449f8339815191525f61295687611724565b905060028151600581111561296d5761296d613e25565b146129cc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516129dd91906143d8565b90506129e98882611803565b5f6129f3896116b0565b90505f898983604051602001612a3b9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612a5c866134d9565b5f612a688b848661184b565b5f8381526004880160205260409020909150612a848282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab1908590600401613fd2565b6020604051808303815f875af1158015612acd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af19190614004565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ba057612ba0613e25565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506113f960015f805160206144ff83398151915255565b5f5f8051602061449f8339815191528282612cfb82610abf565b83549091506001600160401b03821610801590612d2557508260010154816001600160401b031611155b612d835760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612d9461367a565b5f805160206144df833981519152426001600160401b038516118015612dce57506001600160401b038416612dcc426202a3006142f2565b115b612e305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612e875760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612ef55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612f5c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612f65856134d9565b5f80612fac6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136c4565b5f82815260058601602052604090209193509150612fca8282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ff7908590600401613fd2565b6020604051808303815f875af1158015613013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130379190614004565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156130b9576130b9613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561317a836116b0565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612d8360015f805160206144ff83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322957604051631afcd79f60e31b815260040160405180910390fd5b565b6132336131e0565b61323c81613a69565b6114116060820135608083013561325960c0850160a08601613ce8565b61326960e0860160c087016143f8565b613a8a565b5f808251602e146132915760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156132e0576132a88160016142cb565b6132b3906008614157565b61ffff168582815181106132c9576132c96142de565b016020015160f81c901b9190911790600101613294565b5061ffff8116156133035760405162461bcd60e51b81526004016105d09061434e565b5f805b600481101561335e5761331a8160036142cb565b613325906008614157565b63ffffffff16866133378360026142f2565b81518110613347576133476142de565b016020015160f81c901b9190911790600101613306565b5063ffffffff81166004146133855760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156133da5761339c81601f6142cb565b6133a7906008614157565b876133b38360066142f2565b815181106133c3576133c36142de565b016020015160f81c901b9190911790600101613388565b505f805b6008811015613439576133f28160076142cb565b6133fd906008614157565b6001600160401b0316886134128360266142f2565b81518110613422576134226142de565b016020015160f81c901b91909117906001016133de565b5090969095509350505050565b804710156134695760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146134b2576040519150601f19603f3d011682016040523d82523d5f602084013e6134b7565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144df8339815191529060ff165f03613517575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061355f90836142cb565b1061357b576001600160401b038416604083015280825261359a565b838260400181815161358d91906143d8565b6001600160401b03169052505b5f8260200151836040015160646135b19190614413565b6135bb919061443e565b600285015490915060ff90811690821611156136365760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206144ff8339815191528054600119016136ab57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206144ff83398151915255565b5f606082608001515160301461372e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137a5576137658160016142cb565b613770906008614157565b5081515f90839083908110613787576137876142de565b60200101906001600160f81b03191690815f1a905350600101613751565b505f5b6004811015613803576137bc8160036142cb565b6137c7906008614157565b505f826137d58360026142f2565b815181106137e5576137e56142de565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b60208110156138605784518160208110613822576138226142de565b1a60f81b826138328360066142f2565b81518110613842576138426142de565b60200101906001600160f81b03191690815f1a905350600101613806565b505f5b60208110156138c05784602001518160208110613882576138826142de565b1a60f81b826138928360266142f2565b815181106138a2576138a26142de565b60200101906001600160f81b03191690815f1a905350600101613863565b505f5b6008811015613934576138d78160076142cb565b6138e2906008614157565b60ff1685604001516001600160401b0316901c60f81b8282604661390691906142f2565b81518110613916576139166142de565b60200101906001600160f81b03191690815f1a9053506001016138c3565b505f5b603081101561399f5784608001518181518110613956576139566142de565b01602001516001600160f81b0319168261397183604e6142f2565b81518110613981576139816142de565b60200101906001600160f81b03191690815f1a905350600101613937565b505f5b6008811015613a11576139b68160076142cb565b6139c1906008614157565b60608601516001600160401b0390811691161c60f81b826139e383607e6142f2565b815181106139f3576139f36142de565b60200101906001600160f81b03191690815f1a9053506001016139a2565b50600281604051613a229190614463565b602060405180830381855afa158015613a3d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a609190614004565b94909350915050565b613a716131e0565b613a79613ae5565b613a81613af5565b61141181613afd565b613a926131e0565b5f5f8051602061449f833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613aed6131e0565b613229613b69565b6132296131e0565b613b056131e0565b80355f805160206144df83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b4f606083016040840161447e565b600291909101805460ff191660ff90921691909117905550565b6136b16131e0565b508054613b7d90613e74565b5f825580601f10613b8c575050565b601f0160209004905f5260205f20908101906114119190613bec565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c00575f8155600101613bed565b5090565b5f60e08284031215613c14575f80fd5b50919050565b8015158114611411575f80fd5b803563ffffffff81168114613c3a575f80fd5b919050565b5f805f60608486031215613c51575f80fd5b833592506020840135613c6381613c1a565b9150613c7160408501613c27565b90509250925092565b5f60208284031215613c8a575f80fd5b5035919050565b5f60208284031215613ca1575f80fd5b6113f982613c27565b5f8060408385031215613cbb575f80fd5b613cc483613c27565b946020939093013593505050565b80356001600160401b0381168114613c3a575f80fd5b5f60208284031215613cf8575f80fd5b6113f982613cd2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d3757613d37613d01565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d6557613d65613d01565b604052919050565b5f6001600160401b03821115613d8557613d85613d01565b50601f01601f191660200190565b5f805f60608486031215613da5575f80fd5b83359250613db560208501613cd2565b915060408401356001600160401b03811115613dcf575f80fd5b8401601f81018613613ddf575f80fd5b8035613df2613ded82613d6d565b613d3d565b818152876020838501011115613e06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e6d57613e6d613e39565b5092915050565b600181811c90821680613e8857607f821691505b602082108103613c1457634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613ecb5750805b601f840160051c820191505b81811015613eea575f8155600101613ed7565b5050505050565b81516001600160401b03811115613f0a57613f0a613d01565b613f1e81613f188454613e74565b84613ea6565b602080601f831160018114613f51575f8415613f3a5750858301515b5f19600386901b1c1916600185901b178555613fa8565b5f85815260208120601f198616915b82811015613f7f57888601518255948401946001909101908401613f60565b5085821015613f9c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613fca578181015183820152602001613fb2565b50505f910152565b602081525f8251806020840152613ff0816040850160208701613fb0565b601f01601f19169190910160400192915050565b5f60208284031215614014575f80fd5b5051919050565b5f60208083525f845461402d81613e74565b806020870152604060018084165f811461404e576001811461406a57614097565b60ff19851660408a0152604084151560051b8a01019550614097565b895f5260205f205f5b8581101561408e5781548b8201860152908301908801614073565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826140c7576140c76140a5565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613e39565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611411575f80fd5b8051613c3a81613c1a565b5f80604083850312156141e5575f80fd5b82516001600160401b03808211156141fb575f80fd5b908401906060828703121561420e575f80fd5b614216613d15565b82518152602080840151614229816141b5565b8282015260408401518381111561423e575f80fd5b80850194505087601f850112614252575f80fd5b83519250614262613ded84613d6d565b8381528882858701011115614275575f80fd5b61428484838301848801613fb0565b806040840152508195506142998188016141c9565b9450505050509250929050565b5f6001600160401b038083168181036142c1576142c1613e39565b6001019392505050565b81810381811115610acf57610acf613e39565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613e39565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613e6d57613e6d613e39565b5f60208284031215614408575f80fd5b81356113f9816141b5565b6001600160401b0381811683821602808216919082811461443657614436613e39565b505092915050565b5f6001600160401b0380841680614457576144576140a5565b92169190910492915050565b5f8251614474818460208701613fb0565b9190910192915050565b5f6020828403121561448e575f80fd5b813560ff811681146113f9575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 046dce5c1..27145e00f 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -123,4 +123,9 @@ contract ERC20TokenStakingManager is function _unlock(uint256 value, address to) internal virtual override { _getERC20StakingManagerStorage()._token.safeTransfer(to, value); } + + function _reward(address account, uint256 amount) internal virtual override { + ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); + $._token.mint(account, amount); + } } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 8763d0e7f..9b1443a84 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -82,4 +82,9 @@ contract NativeTokenStakingManager is function _unlock(uint256 value, address to) internal virtual override { payable(to).sendValue(value); } + + // solhint-disable-next-line no-empty-blocks + function _reward(address account, uint256 amount) internal virtual override { + // TODO: call the native minter precompile to mint `amount` for `account` + } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 20e61e03a..302c1da6d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -98,6 +98,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function completeEndValidation(uint32 messageIndex) external { Validator memory validator = _completeEndValidation(messageIndex); + + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + uint256 rewardAmount = $._rewardCalculator.calculateReward( + validator.weight, validator.startedAt, validator.endedAt, 0, 0 + ); + + _reward(validator.owner, rewardAmount); + _unlock(validator.startingWeight, validator.owner); } @@ -356,7 +364,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Delegator memory delegator = $._delegatorStakes[delegationID]; _unlock(delegator.weight, delegator.owner); - // TODO: issue rewards + + uint256 rewardAmount = $._rewardCalculator.calculateReward( + delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 + ); + _reward(delegator.owner, rewardAmount); emit DelegationEnded(delegationID, validationID, nonce); } @@ -378,4 +390,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: delegation registration not pending" ); } + + function _reward(address account, uint256 amount) internal virtual; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index ea5ddebdb..b6970f91e 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -9,7 +9,7 @@ import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; -import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; @@ -23,11 +23,13 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ERC20TokenStakingManager public app; IERC20Mintable public token; + ExampleRewardCalculator public rewardCalculator; function setUp() public virtual { // Construct the object under test app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); + rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -38,7 +40,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - rewardCalculator: IRewardCalculator(address(0)) + rewardCalculator: rewardCalculator }), token ); @@ -84,6 +86,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (account, amount))); } + function _expectRewardIssuance(address account, uint256 amount) internal override { + vm.expectCall(address(token), abi.encodeCall(IERC20Mintable.mint, (account, amount))); + } + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return token.balanceOf(account); } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 467ed85f8..536e299a5 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -10,6 +10,7 @@ import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; // TODO: Remove this once all unit tests implemented @@ -30,13 +31,25 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - rewardCalculator: IRewardCalculator(address(0)) + rewardCalculator: IRewardCalculator(new ExampleRewardCalculator(DEFAULT_REWARD_RATE)) }) ); validatorManager = app; posValidatorManager = app; } + function testCompleteEndValidation() public override { + // TODO: get native token staking rewards working, then remove this + // method and let the implementation in PosValidatorManagerTests do the + // test, and remove the `virtual` modifier from that implementation. + } + + function testCompleteEndDelegation() public override { + // TODO: get native token staking rewards working, then remove this + // method and let the implementation in PosValidatorManagerTests do the + // test, and remove the `virtual` modifier from that implementation. + } + // Helpers function _initializeValidatorRegistration( bytes32 nodeID, @@ -69,6 +82,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(account, amount, ""); } + function _expectRewardIssuance(address account, uint256 amount) internal override {} + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return account.balance; } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 5e99fa2bc..7629c6343 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -21,6 +21,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = uint64(4000); address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); + uint64 public constant DEFAULT_REWARD_RATE = uint64(10); PoSValidatorManager public posValidatorManager; @@ -371,14 +372,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.resendEndDelegation(delegationID); } - function testCompleteEndDelegation() public { + function testCompleteEndDelegation() public virtual { + uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + + uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, + registrationExpiry: uint64(registrationExpiry), blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + registrationTimestamp: uint64(registrationExpiry) }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, @@ -388,32 +393,34 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpCompleteDelegatorRegistration({ + validationID: validationID, + delegationID: delegationID, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); _setUpInitializeEndDelegation({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, - endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + endDelegationTimestamp: uint64(registrationExpiry), expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); address delegator = DEFAULT_DELEGATOR_ADDRESS; uint256 balanceBefore = _getStakeAssetBalance(delegator); + uint256 expectedReward = DEFAULT_DELEGATOR_WEIGHT * DEFAULT_REWARD_RATE / 365; _expectStakeUnlock(delegator, DEFAULT_DELEGATOR_WEIGHT); + _expectRewardIssuance(delegator, expectedReward); _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); uint256 balanceChange = _getStakeAssetBalance(delegator) - balanceBefore; require( - balanceChange >= DEFAULT_DELEGATOR_WEIGHT, - "delegator should have received their stake back" + balanceChange == DEFAULT_DELEGATOR_WEIGHT + expectedReward, + "delegator should have received their stake back and been rewarded" ); } @@ -557,25 +564,35 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); } - function testCompleteEndValidation() public override { + function testCompleteEndValidation() public virtual override { + uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + + uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, + registrationExpiry: uint64(registrationExpiry), blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: uint64(registrationExpiry) }); uint256 balanceBefore = _getStakeAssetBalance(address(this)); + uint256 expectedReward = DEFAULT_WEIGHT * DEFAULT_REWARD_RATE / 365 - 1; + _expectStakeUnlock(address(this), DEFAULT_WEIGHT); + _expectRewardIssuance(address(this), expectedReward); _testCompleteEndValidation(validationID); uint256 balanceChange = _getStakeAssetBalance(address(this)) - balanceBefore; - require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); + require( + balanceChange == DEFAULT_WEIGHT + expectedReward, + "validator should have received their stake back and been rewarded" + ); } function testValueToWeight() public view { @@ -713,6 +730,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _getStakeAssetBalance(address account) internal virtual returns (uint256); function _expectStakeUnlock(address account, uint256 amount) internal virtual; + function _expectRewardIssuance(address account, uint256 amount) internal virtual; function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { return abi.encodePacked("PoSValidatorManager: ", errorMessage); diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 2b91a7405..a4cbc1338 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -16,7 +16,7 @@ export ARCH=$(uname -m) [ $ARCH = x86_64 ] && ARCH=amd64 echo "ARCH set to $ARCH" -DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" +DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 ExampleRewardCalculator TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" PROXY_LIST="TransparentUpgradeableProxy ProxyAdmin" diff --git a/tests/flows/governance/validator_set_sig.go b/tests/flows/governance/validator_set_sig.go index 8a3d60960..2901f1f9b 100644 --- a/tests/flows/governance/validator_set_sig.go +++ b/tests/flows/governance/validator_set_sig.go @@ -85,7 +85,7 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { // Construct a ValidatorSetSig message with mock ERC20 as the target contract // and mint 100 tokens as the TxPayload - callData, err := erc20ABI.Pack("mint", big.NewInt(100)) + callData, err := erc20ABI.Pack("mint", validatorSetSigContractAddress, big.NewInt(100)) Expect(err).Should(BeNil()) vssMessage1 := validatorsetsig.ValidatorSetSigMessage{ @@ -99,7 +99,7 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { // Construct a second ValidatorSetSig message with mock ERC20 as the target contract // and mint 50 tokens as the TxPayload - callData2, err := erc20ABI.Pack("mint", big.NewInt(50)) + callData2, err := erc20ABI.Pack("mint", validatorSetSigContractAddress, big.NewInt(50)) Expect(err).Should(BeNil()) vssMessage2 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress, @@ -111,13 +111,18 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { } // Create a message for the case where validatorSetSig contract and targetContract are on the same chain. + // Construct a ValidatorSetSig message with mock ERC20 as the target contract + // and mint 100 tokens as the TxPayload + callData3, err := erc20ABI.Pack("mint", validatorSetSigContractAddress2, big.NewInt(100)) + Expect(err).Should(BeNil()) + vssMessage3 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress2, TargetContractAddress: exampleERC20ContractAddressB, TargetBlockchainID: subnetB.BlockchainID, Nonce: big.NewInt(0), Value: big.NewInt(0), - Payload: callData, + Payload: callData3, } // Create chain config file with off-chain validatorsetsig message diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 367121ca0..2280e8e38 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -12,7 +12,6 @@ import ( poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" . "github.com/onsi/gomega" @@ -143,6 +142,13 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) + rewardCalculatorAddress, _ := utils.DeployExampleRewardCalculator( + ctx, + fundedKey, + subnetAInfo, + uint64(10), + ) + tx, err = posValidatorManager.Initialize( opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ @@ -154,7 +160,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, ) Expect(err).Should(BeNil()) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 31dde39f1..6a543aa2b 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -18,6 +18,7 @@ import ( predicateutils "github.com/ava-labs/subnet-evm/predicate" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/ERC20TokenStakingManager" + examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/staking/ExampleRewardCalculator" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" @@ -61,6 +62,12 @@ func DeployAndInitializeNativeTokenStakingManager( senderKey, subnet, ) + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + subnet, + uint64(10), + ) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( @@ -74,7 +81,7 @@ func DeployAndInitializeNativeTokenStakingManager( MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, ) Expect(err).Should(BeNil()) @@ -121,6 +128,12 @@ func DeployAndInitializeERC20TokenStakingManager( ) erc20Address, erc20 := DeployExampleERC20(ctx, senderKey, subnet) + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + subnet, + uint64(10), + ) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( @@ -134,7 +147,7 @@ func DeployAndInitializeERC20TokenStakingManager( MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, erc20Address, ) @@ -193,6 +206,27 @@ func DeployAndInitializePoAValidatorManager( return validatorManagerAddress, validatorManager } +func DeployExampleRewardCalculator( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + rewardBasisPoints uint64, +) (common.Address, *examplerewardcalculator.ExampleRewardCalculator) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, calculator, err := examplerewardcalculator.DeployExampleRewardCalculator( + opts, + subnet.RPCClient, + rewardBasisPoints, + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + return address, calculator +} + // // Function call utils //