UNPKG

@vaimee/my3sec-contracts

Version:

A set of contracts that implements the My3Sec protocol

1,219 lines 91.4 kB
{ "_format": "hh-sol-artifact-1", "contractName": "My3SecGovernance", "sourceName": "contracts/governance/My3SecGovernance.sol", "abi": [ { "inputs": [ { "internalType": "contract IVotes", "name": "_token", "type": "address" }, { "internalType": "contract TimelockController", "name": "_timelock", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "Empty", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "ProposalCanceled", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "proposer", "type": "address" }, { "indexed": false, "internalType": "address[]", "name": "targets", "type": "address[]" }, { "indexed": false, "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "indexed": false, "internalType": "string[]", "name": "signatures", "type": "string[]" }, { "indexed": false, "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "indexed": false, "internalType": "uint256", "name": "startBlock", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "endBlock", "type": "uint256" }, { "indexed": false, "internalType": "string", "name": "description", "type": "string" } ], "name": "ProposalCreated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "ProposalExecuted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "eta", "type": "uint256" } ], "name": "ProposalQueued", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "oldProposalThreshold", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newProposalThreshold", "type": "uint256" } ], "name": "ProposalThresholdSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "oldQuorumNumerator", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newQuorumNumerator", "type": "uint256" } ], "name": "QuorumNumeratorUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "oldTimelock", "type": "address" }, { "indexed": false, "internalType": "address", "name": "newTimelock", "type": "address" } ], "name": "TimelockChange", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "voter", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "indexed": false, "internalType": "uint8", "name": "support", "type": "uint8" }, { "indexed": false, "internalType": "uint256", "name": "weight", "type": "uint256" }, { "indexed": false, "internalType": "string", "name": "reason", "type": "string" } ], "name": "VoteCast", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "voter", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "indexed": false, "internalType": "uint8", "name": "support", "type": "uint8" }, { "indexed": false, "internalType": "uint256", "name": "weight", "type": "uint256" }, { "indexed": false, "internalType": "string", "name": "reason", "type": "string" }, { "indexed": false, "internalType": "bytes", "name": "params", "type": "bytes" } ], "name": "VoteCastWithParams", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "oldVotingDelay", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newVotingDelay", "type": "uint256" } ], "name": "VotingDelaySet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "oldVotingPeriod", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newVotingPeriod", "type": "uint256" } ], "name": "VotingPeriodSet", "type": "event" }, { "inputs": [], "name": "BALLOT_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "COUNTING_MODE", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "EXTENDED_BALLOT_TYPEHASH", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "uint8", "name": "support", "type": "uint8" } ], "name": "castVote", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "uint8", "name": "support", "type": "uint8" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "castVoteBySig", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "uint8", "name": "support", "type": "uint8" }, { "internalType": "string", "name": "reason", "type": "string" } ], "name": "castVoteWithReason", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "uint8", "name": "support", "type": "uint8" }, { "internalType": "string", "name": "reason", "type": "string" }, { "internalType": "bytes", "name": "params", "type": "bytes" } ], "name": "castVoteWithReasonAndParams", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "uint8", "name": "support", "type": "uint8" }, { "internalType": "string", "name": "reason", "type": "string" }, { "internalType": "bytes", "name": "params", "type": "bytes" }, { "internalType": "uint8", "name": "v", "type": "uint8" }, { "internalType": "bytes32", "name": "r", "type": "bytes32" }, { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "castVoteWithReasonAndParamsBySig", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "internalType": "bytes32", "name": "descriptionHash", "type": "bytes32" } ], "name": "execute", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } ], "name": "getVotes", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "blockNumber", "type": "uint256" }, { "internalType": "bytes", "name": "params", "type": "bytes" } ], "name": "getVotesWithParams", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "hasVoted", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "internalType": "bytes32", "name": "descriptionHash", "type": "bytes32" } ], "name": "hashProposal", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "", "type": "uint256[]" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "onERC1155BatchReceived", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "onERC1155Received", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "onERC721Received", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "proposalDeadline", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "proposalEta", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "proposalSnapshot", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "proposalThreshold", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "proposalVotes", "outputs": [ { "internalType": "uint256", "name": "againstVotes", "type": "uint256" }, { "internalType": "uint256", "name": "forVotes", "type": "uint256" }, { "internalType": "uint256", "name": "abstainVotes", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "internalType": "string", "name": "description", "type": "string" } ], "name": "propose", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "calldatas", "type": "bytes[]" }, { "internalType": "bytes32", "name": "descriptionHash", "type": "bytes32" } ], "name": "queue", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } ], "name": "quorum", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "quorumDenominator", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "blockNumber", "type": "uint256" } ], "name": "quorumNumerator", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "quorumNumerator", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "target", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "relay", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newProposalThreshold", "type": "uint256" } ], "name": "setProposalThreshold", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newVotingDelay", "type": "uint256" } ], "name": "setVotingDelay", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newVotingPeriod", "type": "uint256" } ], "name": "setVotingPeriod", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "proposalId", "type": "uint256" } ], "name": "state", "outputs": [ { "internalType": "enum IGovernor.ProposalState", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "timelock", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token", "outputs": [ { "internalType": "contract IVotes", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "newQuorumNumerator", "type": "uint256" } ], "name": "updateQuorumNumerator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract TimelockController", "name": "newTimelock", "type": "address" } ], "name": "updateTimelock", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "version", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "votingDelay", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "votingPeriod", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x6101606040523480156200001257600080fd5b50604051620045153803806200451583398101604081905262000035916200080f565b806004836201518062093a806000604051806040016040528060118152602001704d793353656320476f7665726e616e636560781b815250806200007e6200016f60201b60201c565b815160209283012081519183019190912060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818801819052818301969096526060810194909452608080850193909352308483018190528151808603909301835260c0948501909152815191909501209052919091526101205260006200011b8282620008f3565b50620001299050836200018a565b6200013482620001cb565b6200013f8162000272565b5050506001600160a01b0316610140526200015a81620002b3565b5062000166816200042b565b505050620009e7565b6040805180820190915260018152603160f81b602082015290565b60045460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a1600455565b60008111620002315760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b60648201526084015b60405180910390fd5b60055460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a1600555565b60065460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600655565b6064811115620003385760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a40162000228565b60006200034462000494565b90508015801590620003565750600954155b15620003d15760096000016040518060400160405280600063ffffffff1681526020016200038f84620004cc60201b620014a61760201c565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b620003ec8260096200053b60201b620015131790919060201c565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b600a54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60095460009015620004c557620004b760096200058e60201b620015491760201c565b6001600160e01b0316905090565b5060085490565b60006001600160e01b03821115620005375760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b606482015260840162000228565b5090565b60008062000578846000016200055c43620005dc60201b620015871760201c565b6200057286620004cc60201b620014a61760201c565b62000643565b6001600160e01b03918216969116945092505050565b80546000908015620005d257620005ba83620005ac600184620009bf565b600091825260209091200190565b5464010000000090046001600160e01b0316620005d5565b60005b9392505050565b600063ffffffff821115620005375760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b606482015260840162000228565b825460009081908015620007985760006200066587620005ac600185620009bf565b60408051808201909152905463ffffffff8082168084526401000000009092046001600160e01b031660208401529192509087161015620006e95760405162461bcd60e51b815260206004820152601760248201527f436865636b706f696e743a20696e76616c6964206b6579000000000000000000604482015260640162000228565b805163ffffffff8088169116036200073757846200070e88620005ac600186620009bf565b80546001600160e01b03929092166401000000000263ffffffff90921691909117905562000787565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216640100000000029216919091179101555b602001519250839150620007ee9050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a8152918220955192519093166401000000000291909316179201919091559050815b935093915050565b6001600160a01b03811681146200080c57600080fd5b50565b600080604083850312156200082357600080fd5b82516200083081620007f6565b60208401519092506200084381620007f6565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200087957607f821691505b6020821081036200089a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620008ee57600081815260208120601f850160051c81016020861015620008c95750805b601f850160051c820191505b81811015620008ea57828155600101620008d5565b5050505b505050565b81516001600160401b038111156200090f576200090f6200084e565b620009278162000920845462000864565b84620008a0565b602080601f8311600181146200095f5760008415620009465750858301515b600019600386901b1c1916600185901b178555620008ea565b600085815260208120601f198616915b8281101562000990578886015182559484019460019091019084016200096f565b5085821015620009af5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b81810381811115620009e157634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c05160e051610100516101205161014051613ac562000a506000396000818161086901528181611fe101526121d5015260006124f4015260006125430152600061251e01526000612477015260006124a1015260006124cb0152613ac56000f3fe60806040526004361061024a5760003560e01c80637b3c71d311610139578063c28bc2fa116100b6578063ea0217cf1161007a578063ea0217cf146107ab578063eb9019d4146107cb578063ece40cc1146107eb578063f23a6e611461080b578063f8ce560a14610837578063fc0c546a1461085757600080fd5b8063c28bc2fa146106cc578063c59057e4146106df578063d33219b4146106ff578063dd4e2ba514610731578063deaaa7cc1461077757600080fd5b8063a890c910116100fd578063a890c9101461062b578063ab58fb8e1461064b578063b58131b01461066b578063bc197c8114610680578063c01f9e37146106ac57600080fd5b80637b3c71d3146105a25780637d5e81e2146105c257806397c3d334146105e25780639a802a6d146105f6578063a7713a701461061657600080fd5b80633932abb1116101c757806354fd4d501161018b57806354fd4d50146104f857806356781388146105225780635f398a141461054257806360c4247f1461056257806370b0f6601461058257600080fd5b80633932abb1146103f75780633bccf4fd1461040c5780633e4f49e61461042c5780634385963214610459578063544ffc9c146104a357600080fd5b8063150b7a021161020e578063150b7a021461032c578063160cbed7146103705780632656227d146103905780632d63f693146103a35780632fe3e261146103c357600080fd5b806301ffc9a71461027257806302a251a3146102a757806303420181146102ca57806306f3f9e6146102ea57806306fdde031461030a57600080fd5b3661026d573061025861088b565b6001600160a01b03161461026b57600080fd5b005b600080fd5b34801561027e57600080fd5b5061029261028d366004612c1a565b6108a4565b60405190151581526020015b60405180910390f35b3480156102b357600080fd5b506102bc6108b5565b60405190815260200161029e565b3480156102d657600080fd5b506102bc6102e5366004612d58565b6108c0565b3480156102f657600080fd5b5061026b610305366004612dfe565b6109b8565b34801561031657600080fd5b5061031f610a4b565b60405161029e9190612e5d565b34801561033857600080fd5b50610357610347366004612e85565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161029e565b34801561037c57600080fd5b506102bc61038b366004613061565b610add565b6102bc61039e366004613061565b610cdd565b3480156103af57600080fd5b506102bc6103be366004612dfe565b610dca565b3480156103cf57600080fd5b506102bc7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561040357600080fd5b506102bc610e01565b34801561041857600080fd5b506102bc6104273660046130f0565b610e0c565b34801561043857600080fd5b5061044c610447366004612dfe565b610e82565b60405161029e9190613154565b34801561046557600080fd5b5061029261047436600461317c565b60008281526007602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b3480156104af57600080fd5b506104dd6104be366004612dfe565b6000908152600760205260409020805460018201546002909201549092565b6040805193845260208401929092529082015260600161029e565b34801561050457600080fd5b506040805180820190915260018152603160f81b602082015261031f565b34801561052e57600080fd5b506102bc61053d3660046131ac565b610e8d565b34801561054e57600080fd5b506102bc61055d3660046131d8565b610eb6565b34801561056e57600080fd5b506102bc61057d366004612dfe565b610f00565b34801561058e57600080fd5b5061026b61059d366004612dfe565b610f97565b3480156105ae57600080fd5b506102bc6105bd36600461325b565b61101e565b3480156105ce57600080fd5b506102bc6105dd3660046132b4565b611070565b3480156105ee57600080fd5b5060646102bc565b34801561060257600080fd5b506102bc610611366004613368565b611087565b34801561062257600080fd5b506102bc61109e565b34801561063757600080fd5b5061026b6106463660046133c0565b6110c8565b34801561065757600080fd5b506102bc610666366004612dfe565b61114f565b34801561067757600080fd5b506102bc6111e9565b34801561068c57600080fd5b5061035761069b3660046133dd565b63bc197c8160e01b95945050505050565b3480156106b857600080fd5b506102bc6106c7366004612dfe565b6111f4565b61026b6106da366004613470565b611223565b3480156106eb57600080fd5b506102bc6106fa366004613061565b611332565b34801561070b57600080fd5b50600a546001600160a01b03165b6040516001600160a01b03909116815260200161029e565b34801561073d57600080fd5b506040805180820190915260208082527f737570706f72743d627261766f2671756f72756d3d666f722c6162737461696e9082015261031f565b34801561078357600080fd5b506102bc7f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b3480156107b757600080fd5b5061026b6107c6366004612dfe565b61136c565b3480156107d757600080fd5b506102bc6107e63660046134b3565b6113f3565b3480156107f757600080fd5b5061026b610806366004612dfe565b611414565b34801561081757600080fd5b506103576108263660046134df565b63f23a6e6160e01b95945050505050565b34801561084357600080fd5b506102bc610852366004612dfe565b61149b565b34801561086357600080fd5b506107197f000000000000000000000000000000000000000000000000000000000000000081565b600061089f600a546001600160a01b031690565b905090565b60006108af826115ec565b92915050565b600061089f60055490565b60008061096461095c7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c6040516108fc929190613547565b60405180910390208b80519060200120604051602001610941959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120611611565b86868661165f565b90506109aa8a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d925061167d915050565b9a9950505050505050505050565b6109c061088b565b6001600160a01b0316336001600160a01b0316146109f95760405162461bcd60e51b81526004016109f090613557565b60405180910390fd5b30610a0261088b565b6001600160a01b031614610a3f5760008036604051610a22929190613547565b604051809103902090505b80610a3860026117e2565b03610a2d57505b610a4881611861565b50565b606060008054610a5a9061358e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a869061358e565b8015610ad35780601f10610aa857610100808354040283529160200191610ad3565b820191906000526020600020905b815481529060010190602001808311610ab657829003601f168201915b5050505050905090565b600080610aec86868686611332565b90506004610af982610e82565b6007811115610b0a57610b0a61313e565b14610b275760405162461bcd60e51b81526004016109f0906135c8565b600a546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa158015610b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b959190613609565b600a5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f42790610bcf908a908a908a906000908b906004016136eb565b602060405180830381865afa158015610bec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c109190613609565b6000838152600b602052604080822092909255600a5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb091610c5b918b918b918b91908b908990600401613739565b600060405180830381600087803b158015610c7557600080fd5b505af1158015610c89573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892828242610cbb91906137a7565b6040805192835260208301919091520160405180910390a15095945050505050565b600080610cec86868686611332565b90506000610cf982610e82565b90506004816007811115610d0f57610d0f61313e565b1480610d2c57506005816007811115610d2a57610d2a61313e565b145b610d485760405162461bcd60e51b81526004016109f0906135c8565b600082815260016020818152604092839020600201805460ff191690921790915590518381527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f910160405180910390a1610da682888888886119ad565b610db38288888888611a4f565b610dc08288888888611a5c565b5095945050505050565b60008181526001602090815260408083208151928301909152546001600160401b0316908190525b6001600160401b031692915050565b600061089f60045490565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff851660608201526000908190610e5a9061095c90608001610941565b9050610e7787828860405180602001604052806000815250611a95565b979650505050505050565b60006108af82611ab8565b600080339050610eae84828560405180602001604052806000815250611a95565b949350505050565b600080339050610e7787828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a925061167d915050565b600954600090808203610f17575050600854919050565b60006009610f266001846137ba565b81548110610f3657610f366137cd565b60009182526020918290206040805180820190915291015463ffffffff8116808352600160201b9091046001600160e01b03169282019290925291508410610f8c57602001516001600160e01b03169392505050565b610eae600985611c02565b610f9f61088b565b6001600160a01b0316336001600160a01b031614610fcf5760405162461bcd60e51b81526004016109f090613557565b30610fd861088b565b6001600160a01b0316146110155760008036604051610ff8929190613547565b604051809103902090505b8061100e60026117e2565b0361100357505b610a4881611cb4565b60008033905061106686828787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a9592505050565b9695505050505050565b600061107e85858585611cf5565b95945050505050565b6000611094848484611fb8565b90505b9392505050565b600954600090156110c1576110b36009611549565b6001600160e01b0316905090565b5060085490565b6110d061088b565b6001600160a01b0316336001600160a01b0316146111005760405162461bcd60e51b81526004016109f090613557565b3061110961088b565b6001600160a01b0316146111465760008036604051611129929190613547565b604051809103902090505b8061113f60026117e2565b0361113457505b610a488161204e565b600a546000828152600b602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c443590602401602060405180830381865afa1580156111ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d09190613609565b9050806001146111e05780611097565b60009392505050565b600061089f60065490565b60008181526001602081815260408084208151928301909152909101546001600160401b031690819052610df2565b61122b61088b565b6001600160a01b0316336001600160a01b03161461125b5760405162461bcd60e51b81526004016109f090613557565b3061126461088b565b6001600160a01b0316146112a15760008036604051611284929190613547565b604051809103902090505b8061129a60026117e2565b0361128f57505b600080856001600160a01b03168585856040516112bf929190613547565b60006040518083038185875af1925050503d80600081146112fc576040519150601f19603f3d011682016040523d82523d6000602084013e611301565b606091505b50915091506113298282604051806060016040528060288152602001613a68602891396120b7565b50505050505050565b60008484848460405160200161134b94939291906137e3565b60408051601f19818403018152919052805160209091012095945050505050565b61137461088b565b6001600160a01b0316336001600160a01b0316146113a45760405162461bcd60e51b81526004016109f090613557565b306113ad61088b565b6001600160a01b0316146113ea57600080366040516113cd929190613547565b604051809103902090505b806113e360026117e2565b036113d857505b610a48816120d0565b6000611097838361140f60408051602081019091526000815290565b611fb8565b61141c61088b565b6001600160a01b0316336001600160a01b03161461144c5760405162461bcd60e51b81526004016109f090613557565b3061145561088b565b6001600160a01b0316146114925760008036604051611475929190613547565b604051809103902090505b8061148b60026117e2565b0361148057505b610a4881612171565b60006108af826121b2565b60006001600160e01b0382111561150f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016109f0565b5090565b6000806115318461152343611587565b61152c866114a6565b61225c565b6001600160e01b0391821693501690505b9250929050565b805460009080156111e057611571836115636001846137ba565b600091825260209091200190565b54600160201b90046001600160e01b0316611097565b600063ffffffff82111561150f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016109f0565b60006001600160e01b03198216636e665ced60e01b14806108af57506108af826123ff565b60006108af61161e61246a565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061167087878787612591565b91509150610dc081612655565b600085815260016020819052604082209061169788610e82565b60078111156116a8576116a861313e565b146117015760405162461bcd60e51b815260206004820152602360248201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460448201526269766560e81b60648201526084016109f0565b604080516020810190915281546001600160401b03169081905260009061172a90889086611fb8565b9050611739888888848861279f565b835160000361178e57866001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda489888489604051611781949392919061382e565b60405180910390a2610e77565b866001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb871289888489896040516117cf959493929190613856565b60405180910390a2979650505050505050565b60006117fd8254600f81810b600160801b909204900b131590565b1561181b57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b60648111156118e45760405162461bcd60e51b815260206004820152604360248201527f476f7665726e6f72566f74657351756f72756d4672616374696f6e3a2071756f60448201527f72756d4e756d657261746f72206f7665722071756f72756d44656e6f6d696e616064820152623a37b960e91b608482015260a4016109f0565b60006118ee61109e565b905080158015906118ff5750600954155b1561196357604080518082019091526000815260099060208101611922846114a6565b6001600160e01b039081169091528254600181018455600093845260209384902083519490930151909116600160201b0263ffffffff909316929092179101555b61196e600983611513565b505060408051828152602081018490527f0553476bf02ef2726e8ce5ced78d63e26e602e4a2257b1f559418e24b4633997910160405180910390a15050565b306119b661088b565b6001600160a01b031614611a485760005b8451811015611a4657306001600160a01b03168582815181106119ec576119ec6137cd565b60200260200101516001600160a01b031603611a3657611a36838281518110611a1757611a176137cd565b602002602001015180519060200120600261291990919063ffffffff16565b611a3f8161389c565b90506119c7565b505b5050505050565b611a488585858585612955565b30611a6561088b565b6001600160a01b031614611a4857600254600f81810b600160801b909204900b1315611a48576000600255611a48565b600061107e85858585611ab360408051602081019091526000815290565b61167d565b600080611ac4836129c9565b90506004816007811115611ada57611ada61313e565b14611ae55792915050565b6000838152600b602052604090205480611b00575092915050565b600a54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa158015611b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6d91906138b5565b15611b7c575060079392505050565b600a54604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e90602401602060405180830381865afa158015611bc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be991906138b5565b15611bf8575060059392505050565b5060029392505050565b6000438210611c535760405162461bcd60e51b815260206004820181905260248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e656460448201526064016109f0565b6000611c5e83611587565b84549091506000611c7186848385612ad8565b90508015611c9e57611c88866115636001846137ba565b54600160201b90046001600160e01b0316611ca1565b60005b6001600160e01b03169695505050505050565b60045460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a1600455565b6000611cff6111e9565b611d0e336107e66001436137ba565b1015611d765760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f723a2070726f706f73657220766f7465732062656c6f7720706044820152701c9bdc1bdcd85b081d1a1c995cda1bdb19607a1b60648201526084016109f0565b6000611d8b8686868680519060200120611332565b90508451865114611dae5760405162461bcd60e51b81526004016109f0906138d7565b8351865114611dcf5760405162461bcd60e51b81526004016109f0906138d7565b6000865111611e205760405162461bcd60e51b815260206004820152601860248201527f476f7665726e6f723a20656d7074792070726f706f73616c000000000000000060448201526064016109f0565b600081815260016020908152604091829020825191820190925281546001600160401b03169081905215611ea05760405162461bcd60e51b815260206004820152602160248201527f476f7665726e6f723a2070726f706f73616c20616c72656164792065786973746044820152607360f81b60648201526084016109f0565b6000611eb2611ead610e01565b612b36565b611ebb43612b36565b611ec59190613918565b90506000611ed4611ead6108b5565b611ede9083613918565b835467ffffffffffffffff19166001600160401b038416178455905060018301805467ffffffffffffffff19166001600160401b0383161790557f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e084338b8b8d516001600160401b03811115611f5657611f56612c9b565b604051908082528060200260200182016040528015611f8957816020015b6060815260200190600190039081611f745790505b508c88888e604051611fa39998979695949392919061393f565b60405180910390a15091979650505050505050565b604051630748d63560e31b81526001600160a01b038481166004830152602482018490526000917f000000000000000000000000000000000000000000000000000000000000000090911690633a46b1a890604401602060405180830381865afa15801561202a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110949190613609565b600a54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b606083156120c6575081611097565b6110978383612b9e565b600081116121305760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b60648201526084016109f0565b60055460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a1600555565b60065460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a1600655565b600060646121bf83610f00565b604051632394e7a360e21b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638e539e8c90602401602060405180830381865afa158015612224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122489190613609565b6122529190613a2e565b6108af9190613a45565b8254600090819080156123a257600061227a876115636001856137ba565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090871610156122fb5760405162461bcd60e51b815260206004820152601760248201527f436865636b706f696e743a20696e76616c6964206b657900000000000000000060448201526064016109f0565b805163ffffffff808816911603612343578461231c886115636001866137ba565b80546001600160e01b0392909216600160201b0263ffffffff909216919091179055612392565b6040805180820190915263ffffffff80881682526001600160e01b0380881660208085019182528b54600181018d5560008d81529190912094519151909216600160201b029216919091179101555b6020015192508391506123f79050565b50506040805180820190915263ffffffff80851682526001600160e01b0380851660208085019182528854600181018a5560008a815291822095519251909316600160201b0291909316179201919091559050815b935093915050565b60006001600160e01b0319821663bf26d89760e01b148061243057506001600160e01b031982166379dd796f60e01b145b8061244b57506001600160e01b03198216630271189760e51b145b806108af57506301ffc9a760e01b6001600160e01b03198316146108af565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156124c357507f000000000000000000000000000000000000000000000000000000000000000046145b156124ed57507f00000000000000000000000000000000000