UNPKG

test-contracts-sovryn

Version:

Smart contracts for the Sovryn protocol and external integrations.

1,087 lines 56.9 kB
{ "_format": "hh-sol-artifact-1", "contractName": "WeightedStaking", "sourceName": "contracts/governance/Staking/WeightedStaking.sol", "abi": [ { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "admin", "type": "address" } ], "name": "AdminAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "admin", "type": "address" } ], "name": "AdminRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes32", "name": "hash", "type": "bytes32" } ], "name": "ContractCodeHashAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes32", "name": "hash", "type": "bytes32" } ], "name": "ContractCodeHashRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "delegator", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "lockedUntil", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "fromDelegate", "type": "address" }, { "indexed": true, "internalType": "address", "name": "toDelegate", "type": "address" } ], "name": "DelegateChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "delegate", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "lockedUntil", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "previousBalance", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newBalance", "type": "uint256" } ], "name": "DelegateStakeChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "previousDate", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newDate", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountStaked", "type": "uint256" } ], "name": "ExtendedStakingDuration", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "until", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "isGovernance", "type": "bool" } ], "name": "StakingWithdrawn", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "staker", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "lockedUntil", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "totalStaked", "type": "uint256" } ], "name": "TokensStaked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "TokensUnlocked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "vesting", "type": "address" }, { "indexed": false, "internalType": "address", "name": "receiver", "type": "address" } ], "name": "VestingTokensWithdrawn", "type": "event" }, { "constant": true, "inputs": [], "name": "DELEGATION_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "DOMAIN_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "MAX_DURATION", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "MAX_VOTING_WEIGHT", "outputs": [ { "internalType": "uint96", "name": "", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "SOVToken", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "WEIGHT_FACTOR", "outputs": [ { "internalType": "uint96", "name": "", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_admin", "type": "address" } ], "name": "addAdmin", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "admins", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "allUnlocked", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "date", "type": "uint256" }, { "internalType": "uint256", "name": "startDate", "type": "uint256" } ], "name": "computeWeightByDate", "outputs": [ { "internalType": "uint96", "name": "weight", "type": "uint96" } ], "payable": false, "stateMutability": "pure", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint32", "name": "", "type": "uint32" } ], "name": "delegateStakingCheckpoints", "outputs": [ { "internalType": "uint32", "name": "fromBlock", "type": "uint32" }, { "internalType": "uint96", "name": "stake", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "delegates", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "feeSharing", "outputs": [ { "internalType": "contract IFeeSharingProxy", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "date", "type": "uint256" }, { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } ], "name": "getPriorStakeByDateForDelegatee", "outputs": [ { "internalType": "uint96", "name": "", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "date", "type": "uint256" }, { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } ], "name": "getPriorTotalStakesForDate", "outputs": [ { "internalType": "uint96", "name": "", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint32", "name": "blockNumber", "type": "uint32" }, { "internalType": "uint256", "name": "time", "type": "uint256" } ], "name": "getPriorTotalVotingPower", "outputs": [ { "internalType": "uint96", "name": "totalVotingPower", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "date", "type": "uint256" }, { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } ], "name": "getPriorUserStakeByDate", "outputs": [ { "internalType": "uint96", "name": "", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "blockNumber", "type": "uint256" }, { "internalType": "uint256", "name": "date", "type": "uint256" } ], "name": "getPriorVotes", "outputs": [ { "internalType": "uint96", "name": "votes", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "blockNumber", "type": "uint256" }, { "internalType": "uint256", "name": "date", "type": "uint256" } ], "name": "getPriorWeightedStake", "outputs": [ { "internalType": "uint96", "name": "votes", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "isOwner", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "kickoffTS", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "newStakingContract", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "nonces", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "numDelegateStakingCheckpoints", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "numTotalStakingCheckpoints", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "numUserStakingCheckpoints", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_admin", "type": "address" } ], "name": "removeAdmin", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "_vestingRegistryProxy", "type": "address" } ], "name": "setVestingRegistry", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "timestamp", "type": "uint256" } ], "name": "timestampToLockDate", "outputs": [ { "internalType": "uint256", "name": "lockDate", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint32", "name": "", "type": "uint32" } ], "name": "totalStakingCheckpoints", "outputs": [ { "internalType": "uint32", "name": "fromBlock", "type": "uint32" }, { "internalType": "uint96", "name": "stake", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": false, "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint32", "name": "", "type": "uint32" } ], "name": "userStakingCheckpoints", "outputs": [ { "internalType": "uint32", "name": "fromBlock", "type": "uint32" }, { "internalType": "uint96", "name": "stake", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "vestingCodeHashes", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "vestingRegistryLogic", "outputs": [ { "internalType": "contract VestingRegistryLogic", "name": "", "type": "address" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "vestingWhitelist", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "weightScaling", "outputs": [ { "internalType": "uint96", "name": "", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "date", "type": "uint256" }, { "internalType": "uint256", "name": "startDate", "type": "uint256" }, { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } ], "name": "weightedStakeByDate", "outputs": [ { "internalType": "uint96", "name": "power", "type": "uint96" } ], "payable": false, "stateMutability": "view", "type": "function" } ], "bytecode": "0x60c0604052600a608081905269534f565374616b696e6760b01b60a09081526200002d9160029190620000ae565b506005805460ff19169055600d80546001600160a01b0316600360a01b179055600062000059620000a9565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062000150565b335b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f157805160ff191683800117855562000121565b8280016001018555821562000121579182015b828111156200012157825182559160200191906001019062000104565b506200012f92915062000133565b5090565b620000ab91905b808211156200012f57600081556001016200013a565b61205c80620001606000396000f3fe608060405234801561001057600080fd5b50600436106102315760003560e01c80638da5cb5b11610130578063b1724b46116100b8578063dfb267c21161007c578063dfb267c214610481578063e7a324dc14610494578063e97ffacb1461049c578063f09cfc64146104af578063f2fde38b146104c257610231565b8063b1724b4614610443578063bf626ec11461044b578063cf7b684a14610453578063d27569e714610466578063db27ec181461046e57610231565b806394c2ce58116100ff57806394c2ce58146104055780639929e88614610418578063a58848c514610420578063adae900214610428578063ae81dfe41461043b57610231565b80638da5cb5b146103c25780638dae1b16146103ca5780638f32d59b146103dd5780639436e7d4146103e557610231565b806337e6b1c1116101be5780636b6fde0e116101825780636b6fde0e14610363578063704802751461037657806372ec9795146103895780637ecebe001461039c578063836eebee146103af57610231565b806337e6b1c1146102f6578063429b62e514610309578063450b06011461031c57806362cf8a081461032f57806368cefccc1461034257610231565b806317748adc1161020557806317748adc146102915780631785f53c146102a657806320606b70146102bb5780632522d7ba146102c357806327dd1b00146102d657610231565b8062073f991461023657806303a18fa31461025457806307392cc014610269578063104932cf14610289575b600080fd5b61023e6104d5565b60405161024b9190611c8d565b60405180910390f35b61025c6104db565b60405161024b9190611c9b565b61027c610277366004611735565b6104ea565b60405161024b9190611c7f565b61025c6104ff565b61029961050e565b60405161024b9190611d73565b6102b96102b43660046115c6565b610513565b005b61023e61059b565b6102996102d13660046117a2565b6105b2565b6102e96102e43660046115ec565b610618565b60405161024b9190611c63565b610299610304366004611626565b61063e565b61027c6103173660046115c6565b6106b6565b6102b961032a3660046115c6565b6106cb565b61029961033d366004611753565b610737565b6103556103503660046116d4565b610872565b60405161024b929190611d58565b6103556103713660046116d4565b6108ad565b6102b96103843660046115c6565b6108e8565b61023e610397366004611735565b61095f565b61023e6103aa3660046115c6565b6109aa565b6102996103bd366004611626565b6109bc565b6102e9610a14565b6102996103d8366004611673565b610a23565b61027c610aa5565b6103f86103f3366004611735565b610ac9565b60405161024b9190611d4a565b6103f86104133660046115ec565b610ae1565b61027c610b04565b61025c610b0d565b61027c6104363660046115c6565b610b1c565b6102e9610b31565b61023e610b45565b610299610b4d565b610299610461366004611626565b610b63565b610299610ba0565b6103f861047c3660046115ec565b610ba5565b61035561048f366004611772565b610bc8565b61023e610bfd565b6102996104aa366004611626565b610c09565b6102996104bd366004611753565b610e52565b6102b96104d03660046115c6565b61102c565b60015481565b600d546001600160a01b031681565b60106020526000908152604090205460ff1681565b6011546001600160a01b031681565b600981565b61051b610aa5565b6105405760405162461bcd60e51b815260040161053790611cfa565b60405180910390fd5b6001600160a01b0381166000908152600f602052604090819020805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f90610590908390611c63565b60405180910390a150565b6040516105a790611c4d565b604051809103902081565b6000806105be8361095f565b905063059fa6008101815b81811161060f57610603846105e583868a63ffffffff1661105c565b604051806080016040528060558152602001611e8a605591396110c2565b935062127500016105c9565b50505092915050565b60046020908152600092835260408084209091529082529020546001600160a01b031681565b60008061064a8361095f565b905063059fa6008101815b8181116106ac57600061066a8883868a610a23565b90506001600160601b038116156106a15761069e85826040518060800160405280604c8152602001611fce604c91396110c2565b94505b506212750001610655565b5050509392505050565b600f6020526000908152604090205460ff1681565b6106d3610aa5565b6106ef5760405162461bcd60e51b815260040161053790611cfa565b6001600160a01b0381166107155760405162461bcd60e51b815260040161053790611cba565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818310156107595760405162461bcd60e51b815260040161053790611cea565b81830363059fa6008111156107805760405162461bcd60e51b815260040161053790611d0a565b6000620151808263059fa600036001600160601b03168161079d57fe5b049050610869600a621232106001600160601b031661081d600a6009026107ff621232108788026040518060400160405280601f81526020017f756e646572666c6f77206f6e207765696768742063616c63756c6174696f6e008152506110f5565b6040518060600160405280602d8152602001611edf602d9139611134565b6001600160601b03168161082d57fe5b046040518060400160405280601e81526020017f6f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e00008152506110c2565b95945050505050565b600a60209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b600860209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b6108f0610aa5565b61090c5760405162461bcd60e51b815260040161053790611cfa565b6001600160a01b0381166000908152600f602052604090819020805460ff19166001179055517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33990610590908390611c63565b60006001548210156109835760405162461bcd60e51b815260040161053790611cda565b60006212750060015484038161099557fe5b04905060015462127500820201915050919050565b600c6020526000908152604090205481565b6000806109c88361095f565b905063059fa6008101815b8181116106ac57610a08846109ea8984878b611192565b6040518060800160405280604a8152602001611f49604a91396110c2565b935062127500016109d3565b6000546001600160a01b031690565b600080610a318686856111fa565b90506001600160601b03811615610a97576000610a4e8686610737565b9050600a6001600160601b0316610a7e83836040518060600160405280603d8152602001611f0c603d9139611134565b6001600160601b031681610a8e57fe5b04925050610a9c565b600091505b50949350505050565b600080546001600160a01b0316610aba61144f565b6001600160a01b031614905090565b60076020526000908152604090205463ffffffff1681565b600960209081526000928352604080842090915290825290205463ffffffff1681565b60055460ff1681565b6003546001600160a01b031681565b600e6020526000908152604090205460ff1681565b60055461010090046001600160a01b031681565b63059fa60081565b600d54600160a01b90046001600160601b031681565b600080610b718585856111fa565b90506001600160601b038116158015610b8d5750610b8d611453565b15610b96575060015b90505b9392505050565b600a81565b600b60209081526000928352604080842090915290825290205463ffffffff1681565b600660209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6040516105a790611c58565b6000610c136114d9565b8210610c315760405162461bcd60e51b815260040161053790611d3a565b6001600160a01b038416600090815260096020908152604080832086845290915290205463ffffffff1680610c6a576000915050610b99565b6001600160a01b0385166000908152600860209081526040808320878452825280832063ffffffff600019860181168552925290912054168310610cf6576001600160a01b038516600090815260086020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050610b99565b6001600160a01b0385166000908152600860209081526040808320878452825280832083805290915290205463ffffffff16831015610d39576000915050610b99565b600060001982015b8163ffffffff168163ffffffff161115610e0457600282820363ffffffff16048103610d6b611583565b506001600160a01b03881660009081526008602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415610ddf57602001519450610b999350505050565b805163ffffffff16871115610df657819350610dfd565b6001820392505b5050610d41565b506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b6000610e5c6114d9565b8210610e7a5760405162461bcd60e51b815260040161053790611d2a565b60008381526007602052604090205463ffffffff1680610e9e576000915050611026565b600084815260066020908152604080832063ffffffff600019860181168552925290912054168310610f065760008481526006602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050611026565b600084815260066020908152604080832083805290915290205463ffffffff16831015610f37576000915050611026565b600060001982015b8163ffffffff168163ffffffff161115610ff057600282820363ffffffff16048103610f69611583565b50600087815260066020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415610fcb576020015194506110269350505050565b805163ffffffff16871115610fe257819350610fe9565b6001820392505b5050610f3f565b50600085815260066020908152604080832063ffffffff909416835292905220546001600160601b03600160201b909104169150505b92915050565b611034610aa5565b6110505760405162461bcd60e51b815260040161053790611cfa565b611059816114dd565b50565b6000806110698585610737565b905060006110778685610e52565b9050600a6001600160601b03166110a782846040518060600160405280603b8152602001611f93603b9139611134565b6001600160601b0316816110b757fe5b049695505050505050565b6000838301826001600160601b038087169083161015610a9c5760405162461bcd60e51b81526004016105379190611ca9565b6000836001600160601b0316836001600160601b03161115829061112c5760405162461bcd60e51b81526004016105379190611ca9565b505050900390565b60006001600160601b03841661114c57506000610b99565b8383026001600160601b03808516908087169083168161116857fe5b046001600160601b0316148390610a9c5760405162461bcd60e51b81526004016105379190611ca9565b60008061119f8585610737565b905060006111ae878786610c09565b9050600a6001600160601b03166111de8284604051806080016040528060478152602001611e4360479139611134565b6001600160601b0316816111ee57fe5b04979650505050505050565b60006112046114d9565b82106112225760405162461bcd60e51b815260040161053790611d1a565b61122b8361155e565b6001600160a01b0385166000908152600b6020908152604080832084845290915290205490935063ffffffff1680611267576000915050610b99565b6001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff6000198601811685529252909120541683106112f3576001600160a01b0385166000908152600a6020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050610b99565b6001600160a01b0385166000908152600a60209081526040808320878452825280832083805290915290205463ffffffff16831015611336576000915050610b99565b600060001982015b8163ffffffff168163ffffffff16111561140157600282820363ffffffff16048103611368611583565b506001600160a01b0388166000908152600a602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b031691810191909152908714156113dc57602001519450610b999350505050565b805163ffffffff168711156113f3578193506113fa565b6001820392505b505061133e565b506001600160a01b0386166000908152600a60209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b3390565b60115460405163dbb049d160e01b81526000916001600160a01b03169063dbb049d190611484903390600401611c71565b60206040518083038186803b15801561149c57600080fd5b505afa1580156114b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114d49190810190611717565b905090565b4390565b6001600160a01b0381166115035760405162461bcd60e51b815260040161053790611cca565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008061156a8361095f565b905082811461157c5762127500810192505b5090919050565b604080518082019091526000808252602082015290565b803561102681611e13565b805161102681611e27565b803561102681611e30565b803561102681611e39565b6000602082840312156115d857600080fd5b60006115e4848461159a565b949350505050565b600080604083850312156115ff57600080fd5b600061160b858561159a565b925050602061161c858286016115b0565b9150509250929050565b60008060006060848603121561163b57600080fd5b6000611647868661159a565b9350506020611658868287016115b0565b9250506040611669868287016115b0565b9150509250925092565b6000806000806080858703121561168957600080fd5b6000611695878761159a565b94505060206116a6878288016115b0565b93505060406116b7878288016115b0565b92505060606116c8878288016115b0565b91505092959194509250565b6000806000606084860312156116e957600080fd5b60006116f5868661159a565b9350506020611706868287016115b0565b9250506040611669868287016115bb565b60006020828403121561172957600080fd5b60006115e484846115a5565b60006020828403121561174757600080fd5b60006115e484846115b0565b6000806040838503121561176657600080fd5b600061160b85856115b0565b6000806040838503121561178557600080fd5b600061179185856115b0565b925050602061161c858286016115bb565b600080604083850312156117b557600080fd5b600061160b85856115bb565b6117ca81611dc7565b82525050565b6117ca81611d93565b6117ca81611d9e565b6117ca81611da3565b6117ca81611dce565b60006117ff82611d81565b6118098185611d85565b9350611819818560208601611dd9565b61182281611e09565b9093019392505050565b6000611839602083611d85565b7f76657374696e67207265676973747279206164647265737320696e76616c6964815260200192915050565b6000611872602683611d85565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181526564647265737360d01b602082015260400192915050565b60006118ba604d83611d85565b7f57656967687465645374616b696e673a3a74696d657374616d70546f4c6f636b81527f446174653a2074696d657374616d70206c696573206265666f726520636f6e7460208201526c3930b1ba1031b932b0ba34b7b760991b604082015260600192915050565b600061192f604c83611d85565b7f57656967687465645374616b696e673a3a636f6d70757465576569676874427981527f446174653a2064617465206e6565647320746f2062652062696767657220746860208201526b616e2073746172744461746560a01b604082015260600192915050565b60006119a3604383611d8e565b7f454950373132446f6d61696e28737472696e67206e616d652c75696e7432353681527f20636861696e49642c6164647265737320766572696679696e67436f6e74726160208201526263742960e81b604082015260430192915050565b6000611a0e600c83611d85565b6b1d5b985d5d1a1bdc9a5e995960a21b815260200192915050565b6000611a36604d83611d85565b7f5374616b696e673a3a636f6d707574655765696768744279446174653a72656d81527f61696e696e672074696d652063616e277420626520626967676572207468616e60208201526c1036b0bc10323ab930ba34b7b760991b604082015260600192915050565b6000611aab604b83611d8e565b7f44656c65676174696f6e28616464726573732064656c6567617465652c75696e81527f74323536206c6f636b446174652c75696e74323536206e6f6e63652c75696e7460208201526a323536206578706972792960a81b6040820152604b0192915050565b6000611b1e603d83611d85565b7f57656967687465645374616b696e673a3a6765745072696f725573657253746181527f6b65416e64446174653a206e6f74207965742064657465726d696e6564000000602082015260400192915050565b6000611b7d603f83611d85565b7f57656967687465645374616b696e673a3a6765745072696f72546f74616c537481527f616b6573466f72446174653a206e6f74207965742064657465726d696e656400602082015260400192915050565b6000611bdc604483611d85565b7f57656967687465645374616b696e673a3a6765745072696f725374616b65427981527f44617465466f7244656c6567617465653a206e6f74207965742064657465726d6020820152631a5b995960e21b604082015260600192915050565b6117ca81611db2565b6117ca81611dbb565b600061102682611996565b600061102682611a9e565b6020810161102682846117d0565b6020810161102682846117c1565b6020810161102682846117d9565b6020810161102682846117e2565b6020810161102682846117eb565b60208082528101610b9981846117f4565b602080825281016110268161182c565b6020808252810161102681611865565b60208082528101611026816118ad565b6020808252810161102681611922565b6020808252810161102681611a01565b6020808252810161102681611a29565b6020808252810161102681611b11565b6020808252810161102681611b70565b6020808252810161102681611bcf565b602081016110268284611c3b565b60408101611d668285611c3b565b610b996020830184611c44565b602081016110268284611c44565b5190565b90815260200190565b919050565b600061102682611da6565b151590565b90565b6001600160a01b031690565b63ffffffff1690565b6001600160601b031690565b6000611026825b600061102682611d93565b60005b83811015611df4578181015183820152602001611ddc565b83811115611e03576000848401525b50505050565b601f01601f191690565b611e1c81611d93565b811461105957600080fd5b611e1c81611d9e565b611e1c81611da3565b611e1c81611db256fe57656967687465645374616b696e673a3a5f746f74616c506f776572427944617465466f7244656c6567617465653a206d756c7469706c69636174696f6e206f766572666c6f7757656967687465645374616b696e673a3a6765745072696f72546f74616c566f74696e67506f7765723a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e6d756c7469706c69636174696f6e206f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e57656967687465645374616b696e673a3a77656967687465645374616b654279446174653a206d756c7469706c69636174696f6e206f766572666c6f7757656967687465645374616b696e673a3a6765745072696f72566f7465733a206f766572666c6f77206f6e20746f74616c20766f74696e6720706f77657220636f6d7075746174696f6e57656967687465645374616b696e673a3a5f746f74616c506f7765724279446174653a206d756c7469706c69636174696f6e206f766572666c6f7757656967687465645374616b696e673a3a6765745072696f7257656967687465645374616b653a206f766572666c6f77206f6e20746f74616c2077656967687420636f6d7075746174696f6ea365627a7a723158206f8bd56d11249ac4d39175619cd35253904d21294bcad022903c1e2fad6f9a3a6c6578706572696d656e74616cf564736f6c63430005110040", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102315760003560e01c80638da5cb5b11610130578063b1724b46116100b8578063dfb267c21161007c578063dfb267c214610481578063e7a324dc14610494578063e97ffacb1461049c578063f09cfc64146104af578063f2fde38b146104c257610231565b8063b1724b4614610443578063bf626ec11461044b578063cf7b684a14610453578063d27569e714610466578063db27ec181461046e57610231565b806394c2ce58116100ff57806394c2ce58146104055780639929e88614610418578063a58848c514610420578063adae900214610428578063ae81dfe41461043b57610231565b80638da5cb5b146103c25780638dae1b16146103ca5780638f32d59b146103dd5780639436e7d4146103e557610231565b806337e6b1c1116101be5780636b6fde0e116101825780636b6fde0e14610363578063704802751461037657806372ec9795146103895780637ecebe001461039c578063836eebee146103af57610231565b806337e6b1c1146102f6578063429b62e514610309578063450b06011461031c57806362cf8a081461032f57806368cefccc1461034257610231565b806317748adc1161020557806317748adc146102915780631785f53c146102a657806320606b70146102bb5780632522d7ba146102c357806327dd1b00146102d657610231565b8062073f991461023657806303a18fa31461025457806307392cc014610269578063104932cf14610289575b600080fd5b61023e6104d5565b60405161024b9190611c8d565b60405180910390f35b61025c6104db565b60405161024b9190611c9b565b61027c610277366004611735565b6104ea565b60405161024b9190611c7f565b61025c6104ff565b61029961050e565b60405161024b9190611d73565b6102b96102b43660046115c6565b610513565b005b61023e61059b565b6102996102d13660046117a2565b6105b2565b6102e96102e43660046115ec565b610618565b60405161024b9190611c63565b610299610304366004611626565b61063e565b61027c6103173660046115c6565b6106b6565b6102b961032a3660046115c6565b6106cb565b61029961033d366004611753565b610737565b6103556103503660046116d4565b610872565b60405161024b929190611d58565b6103556103713660046116d4565b6108ad565b6102b96103843660046115c6565b6108e8565b61023e610397366004611735565b61095f565b61023e6103aa3660046115c6565b6109aa565b6102996103bd366004611626565b6109bc565b6102e9610a14565b6102996103d8366004611673565b610a23565b61027c610aa5565b6103f86103f3366004611735565b610ac9565b60405161024b9190611d4a565b6103f86104133660046115ec565b610ae1565b61027c610b04565b61025c610b0d565b61027c6104363660046115c6565b610b1c565b6102e9610b31565b61023e610b45565b610299610b4d565b610299610461366004611626565b610b63565b610299610ba0565b6103f861047c3660046115ec565b610ba5565b61035561048f366004611772565b610bc8565b61023e610bfd565b6102996104aa366004611626565b610c09565b6102996104bd366004611753565b610e52565b6102b96104d03660046115c6565b61102c565b60015481565b600d546001600160a01b031681565b60106020526000908152604090205460ff1681565b6011546001600160a01b031681565b600981565b61051b610aa5565b6105405760405162461bcd60e51b815260040161053790611cfa565b60405180910390fd5b6001600160a01b0381166000908152600f602052604090819020805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f90610590908390611c63565b60405180910390a150565b6040516105a790611c4d565b604051809103902081565b6000806105be8361095f565b905063059fa6008101815b81811161060f57610603846105e583868a63ffffffff1661105c565b604051806080016040528060558152602001611e8a605591396110c2565b935062127500016105c9565b50505092915050565b60046020908152600092835260408084209091529082529020546001600160a01b031681565b60008061064a8361095f565b905063059fa6008101815b8181116106ac57600061066a8883868a610a23565b90506001600160601b038116156106a15761069e85826040518060800160405280604c8152602001611fce604c91396110c2565b94505b506212750001610655565b5050509392505050565b600f6020526000908152604090205460ff1681565b6106d3610aa5565b6106ef5760405162461bcd60e51b815260040161053790611cfa565b6001600160a01b0381166107155760405162461bcd60e51b815260040161053790611cba565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818310156107595760405162461bcd60e51b815260040161053790611cea565b81830363059fa6008111156107805760405162461bcd60e51b815260040161053790611d0a565b6000620151808263059fa600036001600160601b03168161079d57fe5b049050610869600a621232106001600160601b031661081d600a6009026107ff621232108788026040518060400160405280601f81526020017f756e646572666c6f77206f6e207765696768742063616c63756c6174696f6e008152506110f5565b6040518060600160405280602d8152602001611edf602d9139611134565b6001600160601b03168161082d57fe5b046040518060400160405280601e81526020017f6f766572666c6f77206f6e2077656967687420636f6d7075746174696f6e00008152506110c2565b95945050505050565b600a60209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b600860209081526000938452604080852082529284528284209052825290205463ffffffff811690600160201b90046001600160601b031682565b6108f0610aa5565b61090c5760405162461bcd60e51b815260040161053790611cfa565b6001600160a01b0381166000908152600f602052604090819020805460ff19166001179055517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33990610590908390611c63565b60006001548210156109835760405162461bcd60e51b815260040161053790611cda565b60006212750060015484038161099557fe5b04905060015462127500820201915050919050565b600c6020526000908152604090205481565b6000806109c88361095f565b905063059fa6008101815b8181116106ac57610a08846109ea8984878b611192565b6040518060800160405280604a8152602001611f49604a91396110c2565b935062127500016109d3565b6000546001600160a01b031690565b600080610a318686856111fa565b90506001600160601b03811615610a97576000610a4e8686610737565b9050600a6001600160601b0316610a7e83836040518060600160405280603d8152602001611f0c603d9139611134565b6001600160601b031681610a8e57fe5b04925050610a9c565b600091505b50949350505050565b600080546001600160a01b0316610aba61144f565b6001600160a01b031614905090565b60076020526000908152604090205463ffffffff1681565b600960209081526000928352604080842090915290825290205463ffffffff1681565b60055460ff1681565b6003546001600160a01b031681565b600e6020526000908152604090205460ff1681565b60055461010090046001600160a01b031681565b63059fa60081565b600d54600160a01b90046001600160601b031681565b600080610b718585856111fa565b90506001600160601b038116158015610b8d5750610b8d611453565b15610b96575060015b90505b9392505050565b600a81565b600b60209081526000928352604080842090915290825290205463ffffffff1681565b600660209081526000928352604080842090915290825290205463ffffffff811690600160201b90046001600160601b031682565b6040516105a790611c58565b6000610c136114d9565b8210610c315760405162461bcd60e51b815260040161053790611d3a565b6001600160a01b038416600090815260096020908152604080832086845290915290205463ffffffff1680610c6a576000915050610b99565b6001600160a01b0385166000908152600860209081526040808320878452825280832063ffffffff600019860181168552925290912054168310610cf6576001600160a01b038516600090815260086020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050610b99565b6001600160a01b0385166000908152600860209081526040808320878452825280832083805290915290205463ffffffff16831015610d39576000915050610b99565b600060001982015b8163ffffffff168163ffffffff161115610e0457600282820363ffffffff16048103610d6b611583565b506001600160a01b03881660009081526008602090815260408083208a8452825280832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415610ddf57602001519450610b999350505050565b805163ffffffff16871115610df657819350610dfd565b6001820392505b5050610d41565b506001600160a01b0386166000908152600860209081526040808320888452825280832063ffffffff909416835292905220546001600160601b03600160201b909104169150509392505050565b6000610e5c6114d9565b8210610e7a5760405162461bcd60e51b815260040161053790611d2a565b60008381526007602052604090205463ffffffff1680610e9e576000915050611026565b600084815260066020908152604080832063ffffffff600019860181168552925290912054168310610f065760008481526006602090815260408083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050611026565b600084815260066020908152604080832083805290915290205463ffffffff16831015610f37576000915050611026565b600060001982015b8163ffffffff168163ffffffff161115610ff057600282820363ffffffff16048103610f69611583565b50600087815260066020908152604080832063ffffffff858116855290835292819020815180830190925254928316808252600160201b9093046001600160601b03169181019190915290871415610fcb576020015194506110269350505050565b805163ffffffff16871115610fe257819350610fe9565b6001820392505b5050610f3f565b50600085815260066020908152604080832063ffffffff909416835292905220546001600160601b03600160201b909104169150505b92915050565b611034610aa5565b6110505760405162461bcd60e51b815260040161053790611cfa565b611059816114dd565b50565b6000806110698585610737565b905060006110778685610e52565b9050600a6001600160601b03166110a782846040518060600160405280603b8152602001611f93603b9139611134565b6001600160601b0316816110b757fe5b049695505050505050565b6000838301826001600160601b038087169083161015610a9c5760405162461bcd60e51b81526004016105379190611ca9565b6000836001600160601b0316836001600160601b03161115829061112c5760405162461bcd60e51b81526004016105379190611ca9565b505050900390565b60006001600160601b03841661114c57506000610b99565b8383026001600160601b03808516908087169083168161116857fe5b046001600160601b0316148390610a9c5760405162461bcd60e51b81526004016105379190611ca9565b60008061119f8585610737565b905060006111ae878786610c09565b9050600a6001600160601b03166111de8284604051806080016040528060478152602001611e4360479139611134565b6001600160601b0316816111ee57fe5b04979650505050505050565b60006112046114d9565b82106112225760405162461bcd60e51b815260040161053790611d1a565b61122b8361155e565b6001600160a01b0385166000908152600b6020908152604080832084845290915290205490935063ffffffff1680611267576000915050610b99565b6001600160a01b0385166000908152600a60209081526040808320878452825280832063ffffffff6000198601811685529252909120541683106112f3576001600160a01b0385166000908152600a6020908152604080832087845282528083206000199490940163ffffffff1683529290522054600160201b90046001600160601b03169050610b99565b6001600160a01b0385166000908152600