@openzeppelin/contracts-upgradeable
Version:
Secure Smart Contract library for Solidity
1,029 lines • 52.6 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "TimelockControllerUpgradeable",
"sourceName": "contracts/governance/TimelockControllerUpgradeable.sol",
"abi": [
{
"inputs": [],
"name": "AccessControlBadConfirmation",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bytes32",
"name": "neededRole",
"type": "bytes32"
}
],
"name": "AccessControlUnauthorizedAccount",
"type": "error"
},
{
"inputs": [],
"name": "FailedCall",
"type": "error"
},
{
"inputs": [],
"name": "InvalidInitialization",
"type": "error"
},
{
"inputs": [],
"name": "NotInitializing",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "delay",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "minDelay",
"type": "uint256"
}
],
"name": "TimelockInsufficientDelay",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "targets",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payloads",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "values",
"type": "uint256"
}
],
"name": "TimelockInvalidOperationLength",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
}
],
"name": "TimelockUnauthorizedCaller",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "predecessorId",
"type": "bytes32"
}
],
"name": "TimelockUnexecutedPredecessor",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "expectedStates",
"type": "bytes32"
}
],
"name": "TimelockUnexpectedOperationState",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "CallExecuted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "CallSalt",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint256",
"name": "index",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"indexed": false,
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint256",
"name": "delay",
"type": "uint256"
}
],
"name": "CallScheduled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "Cancelled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint64",
"name": "version",
"type": "uint64"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oldDuration",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newDuration",
"type": "uint256"
}
],
"name": "MinDelayChange",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "previousAdminRole",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "newAdminRole",
"type": "bytes32"
}
],
"name": "RoleAdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleGranted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleRevoked",
"type": "event"
},
{
"inputs": [],
"name": "CANCELLER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "EXECUTOR_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PROPOSER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "cancel",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "payload",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "execute",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "payloads",
"type": "bytes[]"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "executeBatch",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "getMinDelay",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "getOperationState",
"outputs": [
{
"internalType": "enum TimelockControllerUpgradeable.OperationState",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleAdmin",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "getTimestamp",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "grantRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasRole",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "hashOperation",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "payloads",
"type": "bytes[]"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
}
],
"name": "hashOperationBatch",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "minDelay",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "proposers",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "executors",
"type": "address[]"
},
{
"internalType": "address",
"name": "admin",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "isOperation",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "isOperationDone",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "isOperationPending",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "isOperationReady",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"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": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "callerConfirmation",
"type": "address"
}
],
"name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "delay",
"type": "uint256"
}
],
"name": "schedule",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "targets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "values",
"type": "uint256[]"
},
{
"internalType": "bytes[]",
"name": "payloads",
"type": "bytes[]"
},
{
"internalType": "bytes32",
"name": "predecessor",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "delay",
"type": "uint256"
}
],
"name": "scheduleBatch",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newDelay",
"type": "uint256"
}
],
"name": "updateDelay",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x608060405234801561000f575f80fd5b50611e168061001d5f395ff3fe6080604052600436106101bd575f3560e01c80638065657f116100f2578063bc197c8111610092578063d547741f11610062578063d547741f14610547578063e38335e514610566578063f23a6e6114610579578063f27a0c92146105a4575f80fd5b8063bc197c81146104a7578063c4c4c7b3146104d2578063c4d252f5146104f1578063d45c443514610510575f80fd5b806391d14854116100cd57806391d1485414610423578063a217fddf14610442578063b08e51c014610455578063b1c5f42714610488575f80fd5b80638065657f146103c55780638f2a0bb0146103e45780638f61f4f514610403575f80fd5b80632ab0f5291161015d57806336568abe1161013857806336568abe1461033c578063584b153e1461035b57806364d623531461037a5780637958004c14610399575f80fd5b80632ab0f529146102df5780632f2ff15d146102fe57806331d507501461031d575f80fd5b8063134008d311610198578063134008d31461024b57806313bc9f201461025e578063150b7a021461027d578063248a9ca3146102c0575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611484565b6105d7565b005b3480156101f4575f80fd5b506102086102033660046114f2565b610698565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b5061023d5f80516020611dc183398151915281565b604051908152602001610214565b6101e7610259366004611519565b6106a8565b348015610269575f80fd5b5061020861027836600461157f565b610747565b348015610288575f80fd5b506102a7610297366004611645565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b3480156102cb575f80fd5b5061023d6102da36600461157f565b61076c565b3480156102ea575f80fd5b506102086102f936600461157f565b61078c565b348015610309575f80fd5b506101e76103183660046116a8565b610794565b348015610328575f80fd5b5061020861033736600461157f565b6107b6565b348015610347575f80fd5b506101e76103563660046116a8565b6107da565b348015610366575f80fd5b5061020861037536600461157f565b610812565b348015610385575f80fd5b506101e761039436600461157f565b610857565b3480156103a4575f80fd5b506103b86103b336600461157f565b6108db565b60405161021491906116e6565b3480156103d0575f80fd5b5061023d6103df366004611519565b61092f565b3480156103ef575f80fd5b506101e76103fe36600461174c565b61096d565b34801561040e575f80fd5b5061023d5f80516020611da183398151915281565b34801561042e575f80fd5b5061020861043d3660046116a8565b610ae6565b34801561044d575f80fd5b5061023d5f81565b348015610460575f80fd5b5061023d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610493575f80fd5b5061023d6104a23660046117f4565b610b1c565b3480156104b2575f80fd5b506102a76104c1366004611922565b63bc197c8160e01b95945050505050565b3480156104dd575f80fd5b506101e76104ec366004611a27565b610b60565b3480156104fc575f80fd5b506101e761050b36600461157f565b610c71565b34801561051b575f80fd5b5061023d61052a36600461157f565b5f9081525f80516020611d61833981519152602052604090205490565b348015610552575f80fd5b506101e76105613660046116a8565b610d2a565b6101e76105743660046117f4565b610d46565b348015610584575f80fd5b506102a7610593366004611a9f565b63f23a6e6160e01b95945050505050565b3480156105af575f80fd5b507f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015461023d565b5f80516020611da18339815191526105ee81610eb4565b5f6105fd89898989898961092f565b90506106098184610ec1565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161064496959493929190611b26565b60405180910390a3831561068d57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161068491815260200190565b60405180910390a25b505050505050505050565b5f6106a282610f80565b92915050565b5f80516020611dc18339815191526106c0815f610ae6565b6106ce576106ce8133610fa4565b5f6106dd88888888888861092f565b90506106e98185610fe1565b6106f58888888861102f565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161072c9493929190611b62565b60405180910390a361073d816110a3565b5050505050505050565b5f60025b610754836108db565b6003811115610765576107656116d2565b1492915050565b5f9081525f80516020611d81833981519152602052604090206001015490565b5f600361074b565b61079d8261076c565b6107a681610eb4565b6107b083836110da565b50505050565b5f806107c1836108db565b60038111156107d2576107d26116d2565b141592915050565b6001600160a01b03811633146108035760405163334bd91960e11b815260040160405180910390fd5b61080d828261117b565b505050565b5f8061081d836108db565b90506001816003811115610833576108336116d2565b14806108505750600281600381111561084e5761084e6116d2565b145b9392505050565b5f80516020611d61833981519152333081146108965760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b600182015460408051918252602082018590527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15060010155565b5f8181525f80516020611d618339815191526020526040812054805f0361090457505f92915050565b600181036109155750600392915050565b428111156109265750600192915050565b50600292915050565b5f86868686868660405160200161094b96959493929190611b26565b6040516020818303038152906040528051906020012090509695505050505050565b5f80516020611da183398151915261098481610eb4565b88871415806109935750888514155b156109c5576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161088d565b5f6109d68b8b8b8b8b8b8b8b610b1c565b90506109e28184610ec1565b5f5b8a811015610a975780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a2157610a21611b93565b9050602002016020810190610a369190611ba7565b8d8d86818110610a4857610a48611b93565b905060200201358c8c87818110610a6157610a61611b93565b9050602002810190610a739190611bc0565b8c8b604051610a8796959493929190611b26565b60405180910390a36001016109e4565b508315610ad957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ad091815260200190565b60405180910390a25b5050505050505050505050565b5f9182525f80516020611d81833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b3c989796959493929190611c93565b60405160208183030381529060405280519060200120905098975050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ba45750825b90505f826001600160401b03166001148015610bbf5750303b155b905081158015610bcd575080155b15610beb5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c1557845460ff60401b1916600160401b1785555b610c21898989896111f4565b831561068d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610c9b81610eb4565b5f80516020611d61833981519152610cb283610812565b610cee5782610cc16002611208565b610ccb6001611208565b604051635ead8eb560e01b8152600481019390935217602482015260440161088d565b5f838152602082905260408082208290555184917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a2505050565b610d338261076c565b610d3c81610eb4565b6107b0838361117b565b5f80516020611dc1833981519152610d5e815f610ae6565b610d6c57610d6c8133610fa4565b8786141580610d7b5750878414155b15610dad576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161088d565b5f610dbe8a8a8a8a8a8a8a8a610b1c565b9050610dca8185610fe1565b5f5b89811015610e9e575f8b8b83818110610de757610de7611b93565b9050602002016020810190610dfc9190611ba7565b90505f8a8a84818110610e1157610e11611b93565b905060200201359050365f8a8a86818110610e2e57610e2e611b93565b9050602002810190610e409190611bc0565b91509150610e508484848461102f565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610e879493929190611b62565b60405180910390a350505050806001019050610dcc565b50610ea8816110a3565b50505050505050505050565b610ebe8133610fa4565b50565b5f80516020611d61833981519152610ed8836107b6565b15610f095782610ee75f611208565b604051635ead8eb560e01b81526004810192909252602482015260440161088d565b5f610f327f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015490565b905080831015610f5f57604051635433660960e01b8152600481018490526024810182905260440161088d565b610f698342611d32565b5f9485526020929092525060409092209190915550565b5f6001600160e01b03198216630271189760e51b14806106a257506106a28261122a565b610fae8282610ae6565b610fdd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161088d565b5050565b610fea82610747565b610ff95781610ee76002611208565b801580159061100e575061100c8161078c565b155b15610fdd5760405163121534c360e31b81526004810182905260240161088d565b5f80856001600160a01b031685858560405161104c929190611d51565b5f6040518083038185875af1925050503d805f8114611086576040519150601f19603f3d011682016040523d82523d5f602084013e61108b565b606091505b509150915061109a828261125e565b50505050505050565b5f80516020611d618339815191526110ba82610747565b6110c95781610ee76002611208565b5f9182526020526040902060019055565b5f5f80516020611d818339815191526110f38484610ae6565b611172575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556111283390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106a2565b5f9150506106a2565b5f5f80516020611d818339815191526111948484610ae6565b15611172575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106a2565b6111fc61127a565b6107b0848484846112c5565b5f81600381111561121b5761121b6116d2565b600160ff919091161b92915050565b5f6001600160e01b03198216637965db0b60e01b14806106a257506301ffc9a760e01b6001600160e01b03198316146106a2565b6060826112735761126e826113fc565b6106a2565b50806106a2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166112c357604051631afcd79f60e31b815260040160405180910390fd5b565b6112cd61127a565b5f80516020611d618339815191526112e55f306110da565b506001600160a01b03821615611301576112ff5f836110da565b505b5f5b845181101561137c5761133c5f80516020611da183398151915286838151811061132f5761132f611b93565b60200260200101516110da565b506113737ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78386838151811061132f5761132f611b93565b50600101611303565b505f5b83518110156113b4576113ab5f80516020611dc183398151915285838151811061132f5761132f611b93565b5060010161137f565b5060018101859055604080515f8152602081018790527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15050505050565b80511561140c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461143b575f80fd5b919050565b5f8083601f840112611450575f80fd5b5081356001600160401b03811115611466575f80fd5b60208301915083602082850101111561147d575f80fd5b9250929050565b5f805f805f805f60c0888a03121561149a575f80fd5b6114a388611425565b96506020880135955060408801356001600160401b038111156114c4575f80fd5b6114d08a828b01611440565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611502575f80fd5b81356001600160e01b031981168114610850575f80fd5b5f805f805f8060a0878903121561152e575f80fd5b61153787611425565b95506020870135945060408701356001600160401b03811115611558575f80fd5b61156489828a01611440565b979a9699509760608101359660809091013595509350505050565b5f6020828403121561158f575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115d2576115d2611596565b604052919050565b5f82601f8301126115e9575f80fd5b81356001600160401b0381111561160257611602611596565b611615601f8201601f19166020016115aa565b818152846020838601011115611629575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611658575f80fd5b61166185611425565b935061166f60208601611425565b92506040850135915060608501356001600160401b03811115611690575f80fd5b61169c878288016115da565b91505092959194509250565b5f80604083850312156116b9575f80fd5b823591506116c960208401611425565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016004831061170657634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8083601f84011261171c575f80fd5b5081356001600160401b03811115611732575f80fd5b6020830191508360208260051b850101111561147d575f80fd5b5f805f805f805f805f60c08a8c031215611764575f80fd5b89356001600160401b038082111561177a575f80fd5b6117868d838e0161170c565b909b50995060208c013591508082111561179e575f80fd5b6117aa8d838e0161170c565b909950975060408c01359150808211156117c2575f80fd5b506117cf8c828d0161170c565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b03121561180b575f80fd5b88356001600160401b0380821115611821575f80fd5b61182d8c838d0161170c565b909a50985060208b0135915080821115611845575f80fd5b6118518c838d0161170c565b909850965060408b0135915080821115611869575f80fd5b506118768b828c0161170c565b999c989b509699959896976060870135966080013595509350505050565b5f6001600160401b038211156118ac576118ac611596565b5060051b60200190565b5f82601f8301126118c5575f80fd5b813560206118da6118d583611894565b6115aa565b8083825260208201915060208460051b8701019350868411156118fb575f80fd5b602086015b848110156119175780358352918301918301611900565b509695505050505050565b5f805f805f60a08688031215611936575f80fd5b61193f86611425565b945061194d60208701611425565b935060408601356001600160401b0380821115611968575f80fd5b61197489838a016118b6565b94506060880135915080821115611989575f80fd5b61199589838a016118b6565b935060808801359150808211156119aa575f80fd5b506119b7888289016115da565b9150509295509295909350565b5f82601f8301126119d3575f80fd5b813560206119e36118d583611894565b8083825260208201915060208460051b870101935086841115611a04575f80fd5b602086015b8481101561191757611a1a81611425565b8352918301918301611a09565b5f805f8060808587031215611a3a575f80fd5b8435935060208501356001600160401b0380821115611a57575f80fd5b611a63888389016119c4565b94506040870135915080821115611a78575f80fd5b50611a85878288016119c4565b925050611a9460608601611425565b905092959194509250565b5f805f805f60a08688031215611ab3575f80fd5b611abc86611425565b9450611aca60208701611425565b9350604086013592506060860135915060808601356001600160401b03811115611af2575f80fd5b6119b7888289016115da565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f611b4d60a083018688611afe565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f611b89606083018486611afe565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611bb7575f80fd5b61085082611425565b5f808335601e19843603018112611bd5575f80fd5b8301803591506001600160401b03821115611bee575f80fd5b60200191503681900382131561147d575f80fd5b5f838385526020808601955060208560051b830101845f5b87811015611c8657848303601f19018952813536889003601e19018112611c3f575f80fd5b870184810190356001600160401b03811115611c59575f80fd5b803603821315611c67575f80fd5b611c72858284611afe565b9a86019a9450505090830190600101611c1a565b5090979650505050505050565b60a080825281018890525f8960c08301825b8b811015611cd3576001600160a01b03611cbe84611425565b16825260209283019290910190600101611ca5565b5083810360208501528881526001600160fb1b03891115611cf2575f80fd5b8860051b9150818a60208301370182810360209081016040850152611d1a9082018789611c02565b60608401959095525050608001529695505050505050565b808201808211156106a257634e487b7160e01b5f52601160045260245ffd5b818382375f910190815291905056fe9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb360002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63a26469706673582212203028b12e28717c4133385134900a038b3978504723d12d599f168e294575ec6f64736f6c63430008180033",
"deployedBytecode": "0x6080604052600436106101bd575f3560e01c80638065657f116100f2578063bc197c8111610092578063d547741f11610062578063d547741f14610547578063e38335e514610566578063f23a6e6114610579578063f27a0c92146105a4575f80fd5b8063bc197c81146104a7578063c4c4c7b3146104d2578063c4d252f5146104f1578063d45c443514610510575f80fd5b806391d14854116100cd57806391d1485414610423578063a217fddf14610442578063b08e51c014610455578063b1c5f42714610488575f80fd5b80638065657f146103c55780638f2a0bb0146103e45780638f61f4f514610403575f80fd5b80632ab0f5291161015d57806336568abe1161013857806336568abe1461033c578063584b153e1461035b57806364d623531461037a5780637958004c14610399575f80fd5b80632ab0f529146102df5780632f2ff15d146102fe57806331d507501461031d575f80fd5b8063134008d311610198578063134008d31461024b57806313bc9f201461025e578063150b7a021461027d578063248a9ca3146102c0575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611484565b6105d7565b005b3480156101f4575f80fd5b506102086102033660046114f2565b610698565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b5061023d5f80516020611dc183398151915281565b604051908152602001610214565b6101e7610259366004611519565b6106a8565b348015610269575f80fd5b5061020861027836600461157f565b610747565b348015610288575f80fd5b506102a7610297366004611645565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b3480156102cb575f80fd5b5061023d6102da36600461157f565b61076c565b3480156102ea575f80fd5b506102086102f936600461157f565b61078c565b348015610309575f80fd5b506101e76103183660046116a8565b610794565b348015610328575f80fd5b5061020861033736600461157f565b6107b6565b348015610347575f80fd5b506101e76103563660046116a8565b6107da565b348015610366575f80fd5b5061020861037536600461157f565b610812565b348015610385575f80fd5b506101e761039436600461157f565b610857565b3480156103a4575f80fd5b506103b86103b336600461157f565b6108db565b60405161021491906116e6565b3480156103d0575f80fd5b5061023d6103df366004611519565b61092f565b3480156103ef575f80fd5b506101e76103fe36600461174c565b61096d565b34801561040e575f80fd5b5061023d5f80516020611da183398151915281565b34801561042e575f80fd5b5061020861043d3660046116a8565b610ae6565b34801561044d575f80fd5b5061023d5f81565b348015610460575f80fd5b5061023d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610493575f80fd5b5061023d6104a23660046117f4565b610b1c565b3480156104b2575f80fd5b506102a76104c1366004611922565b63bc197c8160e01b95945050505050565b3480156104dd575f80fd5b506101e76104ec366004611a27565b610b60565b3480156104fc575f80fd5b506101e761050b36600461157f565b610c71565b34801561051b575f80fd5b5061023d61052a36600461157f565b5f9081525f80516020611d61833981519152602052604090205490565b348015610552575f80fd5b506101e76105613660046116a8565b610d2a565b6101e76105743660046117f4565b610d46565b348015610584575f80fd5b506102a7610593366004611a9f565b63f23a6e6160e01b95945050505050565b3480156105af575f80fd5b507f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015461023d565b5f80516020611da18339815191526105ee81610eb4565b5f6105fd89898989898961092f565b90506106098184610ec1565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161064496959493929190611b26565b60405180910390a3831561068d57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161068491815260200190565b60405180910390a25b505050505050505050565b5f6106a282610f80565b92915050565b5f80516020611dc18339815191526106c0815f610ae6565b6106ce576106ce8133610fa4565b5f6106dd88888888888861092f565b90506106e98185610fe1565b6106f58888888861102f565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161072c9493929190611b62565b60405180910390a361073d816110a3565b5050505050505050565b5f60025b610754836108db565b6003811115610765576107656116d2565b1492915050565b5f9081525f80516020611d81833981519152602052604090206001015490565b5f600361074b565b61079d8261076c565b6107a681610eb4565b6107b083836110da565b50505050565b5f806107c1836108db565b60038111156107d2576107d26116d2565b141592915050565b6001600160a01b03811633146108035760405163334bd91960e11b815260040160405180910390fd5b61080d828261117b565b505050565b5f8061081d836108db565b90506001816003811115610833576108336116d2565b14806108505750600281600381111561084e5761084e6116d2565b145b9392505050565b5f80516020611d61833981519152333081146108965760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b600182015460408051918252602082018590527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15060010155565b5f8181525f80516020611d618339815191526020526040812054805f0361090457505f92915050565b600181036109155750600392915050565b428111156109265750600192915050565b50600292915050565b5f86868686868660405160200161094b96959493929190611b26565b6040516020818303038152906040528051906020012090509695505050505050565b5f80516020611da183398151915261098481610eb4565b88871415806109935750888514155b156109c5576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161088d565b5f6109d68b8b8b8b8b8b8b8b610b1c565b90506109e28184610ec1565b5f5b8a811015610a975780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a2157610a21611b93565b9050602002016020810190610a369190611ba7565b8d8d86818110610a4857610a48611b93565b905060200201358c8c87818110610a6157610a61611b93565b9050602002810190610a739190611bc0565b8c8b604051610a8796959493929190611b26565b60405180910390a36001016109e4565b508315610ad957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ad091815260200190565b60405180910390a25b5050505050505050505050565b5f9182525f80516020611d81833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b3c989796959493929190611c93565b60405160208183030381529060405280519060200120905098975050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ba45750825b90505f826001600160401b03166001148015610bbf5750303b155b905081158015610bcd575080155b15610beb5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c1557845460ff60401b1916600160401b1785555b610c21898989896111f4565b831561068d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610c9b81610eb4565b5f80516020611d61833981519152610cb283610812565b610cee5782610cc16002611208565b610ccb6001611208565b604051635ead8eb560e01b8152600481019390935217602482015260440161088d565b5f838152602082905260408082208290555184917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a2505050565b610d338261076c565b610d3c81610eb4565b6107b0838361117b565b5f80516020611dc1833981519152610d5e815f610ae6565b610d6c57610d6c8133610fa4565b8786141580610d7b5750878414155b15610dad576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161088d565b5f610dbe8a8a8a8a8a8a8a8a610b1c565b9050610dca8185610fe1565b5f5b89811015610e9e575f8b8b83818110610de757610de7611b93565b9050602002016020810190610dfc9190611ba7565b90505f8a8a84818110610e1157610e11611b93565b905060200201359050365f8a8a86818110610e2e57610e2e611b93565b9050602002810190610e409190611bc0565b91509150610e508484848461102f565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610e879493929190611b62565b60405180910390a350505050806001019050610dcc565b50610ea8816110a3565b50505050505050505050565b610ebe8133610fa4565b50565b5f80516020611d61833981519152610ed8836107b6565b15610f095782610ee75f611208565b604051635ead8eb560e01b81526004810192909252602482015260440161088d565b5f610f327f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015490565b905080831015610f5f57604051635433660960e01b8152600481018490526024810182905260440161088d565b610f698342611d32565b5f9485526020929092525060409092209190915550565b5f6001600160e01b03198216630271189760e51b14806106a257506106a28261122a565b610fae8282610ae6565b610fdd5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161088d565b5050565b610fea82610747565b610ff95781610ee76002611208565b801580159061100e575061100c8161078c565b155b15610fdd5760405163121534c360e31b81526004810182905260240161088d565b5f80856001600160a01b031685858560405161104c929190611d51565b5f6040518083038185875af1925050503d805f8114611086576040519150601f19603f3d011682016040523d82523d5f602084013e61108b565b606091505b509150915061109a828261125e565b50505050505050565b5f80516020611d618339815191526110ba82610747565b6110c95781610ee76002611208565b5f9182526020526040902060019055565b5f5f80516020611d818339815191526110f38484610ae6565b611172575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556111283390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106a2565b5f9150506106a2565b5f5f80516020611d818339815191526111948484610ae6565b15611172575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106a2565b6111fc61127a565b6107b0848484846112c5565b5f81600381111561121b5761121b6116d2565b600160ff919091161b92915050565b5f6001600160e01b03198216637965db0b60e01b14806106a257506301ffc9a760e01b6001600160e01b03198316146106a2565b6060826112735761126e826113fc565b6106a2565b50806106a2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166112c357604051631afcd79f60e31b815260040160405180910390fd5b565b6112cd61127a565b5f80516020611d618339815191526112e55f306110da565b506001600160a01b03821615611301576112ff5f836110da565b505b5f5b845181101561137c5761133c5f80516020611da183398151915286838151811061132f5761132f611b93565b60200260200101516110da565b506113737ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78386838151811061132f5761132f611b93565b50600101611303565b505f5b83518110156113b4576113ab5f80516020611dc183398151915285838151811061132f5761132f611b93565b5060010161137f565b5060018101859055604080515f8152602081018790527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15050505050565b80511561140c5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b038116811461143b575f80fd5b919050565b5f8083601f840112611450575f80fd5b5081356001600160401b03811115611466575f80fd5b60208301915083602082850101111561147d575f80fd5b9250929050565b5f805f805f805f60c0888a03121561149a575f80fd5b6114a388611425565b96506020880135955060408801356001600160401b038111156114c4575f80fd5b6114d08a828b01611440565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611502575f80fd5b81356001600160e01b031981168114610850575f80fd5b5f805f805f8060a0878903121561152e575f80fd5b61153787611425565b95506020870135945060408701356001600160401b03811115611558575f80fd5b61156489828a01611440565b979a9699509760608101359660809091013595509350505050565b5f6020828403121561158f575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115d2576115d2611596565b604052919050565b5f82601f8301126115e9575f80fd5b81356001600160401b0381111561160257611602611596565b611615601f8201601f19166020016115aa565b818152846020838601011115611629575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611658575f80fd5b61166185611425565b935061166f60208601611425565b92506040850135915060608501356001600160401b03811115611690575f80fd5b61169c878288016115da565b91505092959194509250565b5f80604083850312156116b9575f80fd5b823591506116c960208401611425565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016004831061170657634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8083601f84011261171c575f80fd5b5081356001600160401b03811115611732575f80fd5b6020830191508360208260051b850101111561147d575f80fd5b5f805f805f805f805f60c08a8c031215611764575f80fd5b89356001600160401b038082111561177a575f80fd5b6117868d838e0161170c565b909b50995060208c013591508082111561179e575f80fd5b6117aa8d838e0161170c565b909950975060408c01359150808211156117c2575f80fd5b506117cf8c828d0161170c565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b03121561180b575f80fd5b88356001600160401b0380821115611821575f80fd5b61182d8c838d0161170c565b909a50985060208b0135915080821115611845575f80fd5b6118518c838d0161170c565b909850965060408b0135915080821115611869575f80fd5b506118768b828c0161170c565b999c989b509699959896976060870135966080013595509350505050565b5f6001600160401b038211156118ac576118ac611596565b5060051b60200190565b5f82601f8301126118c5575f80fd5b813560206118da6118d583611894565b6115aa565b8083825260208201915060208460051b8701019350868411156118fb575f80fd5b602086015b848110156119175780358352918301918301611900565b509695505050505050