@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": "0x608060405234801561000f575f80fd5b50611e1e8061001d5f395ff3fe6080604052600436106101bd575f3560e01c80638065657f116100f2578063bc197c8111610092578063d547741f11610062578063d547741f14610547578063e38335e514610566578063f23a6e6114610579578063f27a0c92146105a4575f80fd5b8063bc197c81146104a7578063c4c4c7b3146104d2578063c4d252f5146104f1578063d45c443514610510575f80fd5b806391d14854116100cd57806391d1485414610423578063a217fddf14610442578063b08e51c014610455578063b1c5f42714610488575f80fd5b80638065657f146103c55780638f2a0bb0146103e45780638f61f4f514610403575f80fd5b80632ab0f5291161015d57806336568abe1161013857806336568abe1461033c578063584b153e1461035b57806364d623531461037a5780637958004c14610399575f80fd5b80632ab0f529146102df5780632f2ff15d146102fe57806331d507501461031d575f80fd5b8063134008d311610198578063134008d31461024b57806313bc9f201461025e578063150b7a021461027d578063248a9ca3146102c0575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e236600461148c565b6105d7565b005b3480156101f4575f80fd5b506102086102033660046114fa565b610698565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b5061023d5f80516020611dc983398151915281565b604051908152602001610214565b6101e7610259366004611521565b6106a8565b348015610269575f80fd5b50610208610278366004611587565b610747565b348015610288575f80fd5b506102a761029736600461164d565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b3480156102cb575f80fd5b5061023d6102da366004611587565b61076c565b3480156102ea575f80fd5b506102086102f9366004611587565b61078c565b348015610309575f80fd5b506101e76103183660046116b0565b610794565b348015610328575f80fd5b50610208610337366004611587565b6107b6565b348015610347575f80fd5b506101e76103563660046116b0565b6107da565b348015610366575f80fd5b50610208610375366004611587565b610812565b348015610385575f80fd5b506101e7610394366004611587565b610857565b3480156103a4575f80fd5b506103b86103b3366004611587565b6108db565b60405161021491906116ee565b3480156103d0575f80fd5b5061023d6103df366004611521565b61092f565b3480156103ef575f80fd5b506101e76103fe366004611754565b61096d565b34801561040e575f80fd5b5061023d5f80516020611da983398151915281565b34801561042e575f80fd5b5061020861043d3660046116b0565b610ae6565b34801561044d575f80fd5b5061023d5f81565b348015610460575f80fd5b5061023d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610493575f80fd5b5061023d6104a23660046117fc565b610b1c565b3480156104b2575f80fd5b506102a76104c136600461192a565b63bc197c8160e01b95945050505050565b3480156104dd575f80fd5b506101e76104ec366004611a2f565b610b60565b3480156104fc575f80fd5b506101e761050b366004611587565b610c5c565b34801561051b575f80fd5b5061023d61052a366004611587565b5f9081525f80516020611d69833981519152602052604090205490565b348015610552575f80fd5b506101e76105613660046116b0565b610d15565b6101e76105743660046117fc565b610d31565b348015610584575f80fd5b506102a7610593366004611aa7565b63f23a6e6160e01b95945050505050565b3480156105af575f80fd5b507f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015461023d565b5f80516020611da98339815191526105ee81610e9f565b5f6105fd89898989898961092f565b90506106098184610eac565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161064496959493929190611b2e565b60405180910390a3831561068d57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161068491815260200190565b60405180910390a25b505050505050505050565b5f6106a282610f6b565b92915050565b5f80516020611dc98339815191526106c0815f610ae6565b6106ce576106ce8133610f8f565b5f6106dd88888888888861092f565b90506106e98185610fcc565b6106f58888888861101a565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161072c9493929190611b6a565b60405180910390a361073d8161108e565b5050505050505050565b5f60025b610754836108db565b6003811115610765576107656116da565b1492915050565b5f9081525f80516020611d89833981519152602052604090206001015490565b5f600361074b565b61079d8261076c565b6107a681610e9f565b6107b083836110c5565b50505050565b5f806107c1836108db565b60038111156107d2576107d26116da565b141592915050565b6001600160a01b03811633146108035760405163334bd91960e11b815260040160405180910390fd5b61080d8282611166565b505050565b5f8061081d836108db565b90506001816003811115610833576108336116da565b14806108505750600281600381111561084e5761084e6116da565b145b9392505050565b5f80516020611d69833981519152333081146108965760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b600182015460408051918252602082018590527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15060010155565b5f8181525f80516020611d698339815191526020526040812054805f0361090457505f92915050565b600181036109155750600392915050565b428111156109265750600192915050565b50600292915050565b5f86868686868660405160200161094b96959493929190611b2e565b6040516020818303038152906040528051906020012090509695505050505050565b5f80516020611da983398151915261098481610e9f565b88871415806109935750888514155b156109c5576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161088d565b5f6109d68b8b8b8b8b8b8b8b610b1c565b90506109e28184610eac565b5f5b8a811015610a975780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a2157610a21611b9b565b9050602002016020810190610a369190611baf565b8d8d86818110610a4857610a48611b9b565b905060200201358c8c87818110610a6157610a61611b9b565b9050602002810190610a739190611bc8565b8c8b604051610a8796959493929190611b2e565b60405180910390a36001016109e4565b508315610ad957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ad091815260200190565b60405180910390a25b5050505050505050505050565b5f9182525f80516020611d89833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b3c989796959493929190611c9b565b60405160208183030381529060405280519060200120905098975050505050505050565b5f610b696111df565b805490915060ff600160401b82041615906001600160401b03165f81158015610b8f5750825b90505f826001600160401b03166001148015610baa5750303b155b905081158015610bb8575080155b15610bd65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c0057845460ff60401b1916600160401b1785555b610c0c89898989611207565b831561068d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610c8681610e9f565b5f80516020611d69833981519152610c9d83610812565b610cd95782610cac600261121b565b610cb6600161121b565b604051635ead8eb560e01b8152600481019390935217602482015260440161088d565b5f838152602082905260408082208290555184917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a2505050565b610d1e8261076c565b610d2781610e9f565b6107b08383611166565b5f80516020611dc9833981519152610d49815f610ae6565b610d5757610d578133610f8f565b8786141580610d665750878414155b15610d98576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161088d565b5f610da98a8a8a8a8a8a8a8a610b1c565b9050610db58185610fcc565b5f5b89811015610e89575f8b8b83818110610dd257610dd2611b9b565b9050602002016020810190610de79190611baf565b90505f8a8a84818110610dfc57610dfc611b9b565b905060200201359050365f8a8a86818110610e1957610e19611b9b565b9050602002810190610e2b9190611bc8565b91509150610e3b8484848461101a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610e729493929190611b6a565b60405180910390a350505050806001019050610db7565b50610e938161108e565b50505050505050505050565b610ea98133610f8f565b50565b5f80516020611d69833981519152610ec3836107b6565b15610ef45782610ed25f61121b565b604051635ead8eb560e01b81526004810192909252602482015260440161088d565b5f610f1d7f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015490565b905080831015610f4a57604051635433660960e01b8152600481018490526024810182905260440161088d565b610f548342611d3a565b5f9485526020929092525060409092209190915550565b5f6001600160e01b03198216630271189760e51b14806106a257506106a28261123d565b610f998282610ae6565b610fc85760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161088d565b5050565b610fd582610747565b610fe45781610ed2600261121b565b8015801590610ff95750610ff78161078c565b155b15610fc85760405163121534c360e31b81526004810182905260240161088d565b5f80856001600160a01b0316858585604051611037929190611d59565b5f6040518083038185875af1925050503d805f8114611071576040519150601f19603f3d011682016040523d82523d5f602084013e611076565b606091505b50915091506110858282611271565b50505050505050565b5f80516020611d698339815191526110a582610747565b6110b45781610ed2600261121b565b5f9182526020526040902060019055565b5f5f80516020611d898339815191526110de8484610ae6565b61115d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556111133390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106a2565b5f9150506106a2565b5f5f80516020611d8983398151915261117f8484610ae6565b1561115d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106a2565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006106a2565b61120f61128d565b6107b0848484846112b4565b5f81600381111561122e5761122e6116da565b600160ff919091161b92915050565b5f6001600160e01b03198216637965db0b60e01b14806106a257506301ffc9a760e01b6001600160e01b03198316146106a2565b60608261128657611281826113eb565b6106a2565b50806106a2565b611295611414565b6112b257604051631afcd79f60e31b815260040160405180910390fd5b565b6112bc61128d565b5f80516020611d698339815191526112d45f306110c5565b506001600160a01b038216156112f0576112ee5f836110c5565b505b5f5b845181101561136b5761132b5f80516020611da983398151915286838151811061131e5761131e611b9b565b60200260200101516110c5565b506113627ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78386838151811061131e5761131e611b9b565b506001016112f2565b505f5b83518110156113a35761139a5f80516020611dc983398151915285838151811061131e5761131e611b9b565b5060010161136e565b5060018101859055604080515f8152602081018790527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15050505050565b8051156113fb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f61141d6111df565b54600160401b900460ff16919050565b80356001600160a01b0381168114611443575f80fd5b919050565b5f8083601f840112611458575f80fd5b5081356001600160401b0381111561146e575f80fd5b602083019150836020828501011115611485575f80fd5b9250929050565b5f805f805f805f60c0888a0312156114a2575f80fd5b6114ab8861142d565b96506020880135955060408801356001600160401b038111156114cc575f80fd5b6114d88a828b01611448565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f6020828403121561150a575f80fd5b81356001600160e01b031981168114610850575f80fd5b5f805f805f8060a08789031215611536575f80fd5b61153f8761142d565b95506020870135945060408701356001600160401b03811115611560575f80fd5b61156c89828a01611448565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611597575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115da576115da61159e565b604052919050565b5f82601f8301126115f1575f80fd5b81356001600160401b0381111561160a5761160a61159e565b61161d601f8201601f19166020016115b2565b818152846020838601011115611631575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611660575f80fd5b6116698561142d565b93506116776020860161142d565b92506040850135915060608501356001600160401b03811115611698575f80fd5b6116a4878288016115e2565b91505092959194509250565b5f80604083850312156116c1575f80fd5b823591506116d16020840161142d565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016004831061170e57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8083601f840112611724575f80fd5b5081356001600160401b0381111561173a575f80fd5b6020830191508360208260051b8501011115611485575f80fd5b5f805f805f805f805f60c08a8c03121561176c575f80fd5b89356001600160401b0380821115611782575f80fd5b61178e8d838e01611714565b909b50995060208c01359150808211156117a6575f80fd5b6117b28d838e01611714565b909950975060408c01359150808211156117ca575f80fd5b506117d78c828d01611714565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611813575f80fd5b88356001600160401b0380821115611829575f80fd5b6118358c838d01611714565b909a50985060208b013591508082111561184d575f80fd5b6118598c838d01611714565b909850965060408b0135915080821115611871575f80fd5b5061187e8b828c01611714565b999c989b509699959896976060870135966080013595509350505050565b5f6001600160401b038211156118b4576118b461159e565b5060051b60200190565b5f82601f8301126118cd575f80fd5b813560206118e26118dd8361189c565b6115b2565b8083825260208201915060208460051b870101935086841115611903575f80fd5b602086015b8481101561191f5780358352918301918301611908565b509695505050505050565b5f805f805f60a0868803121561193e575f80fd5b6119478661142d565b94506119556020870161142d565b935060408601356001600160401b0380821115611970575f80fd5b61197c89838a016118be565b94506060880135915080821115611991575f80fd5b61199d89838a016118be565b935060808801359150808211156119b2575f80fd5b506119bf888289016115e2565b9150509295509295909350565b5f82601f8301126119db575f80fd5b813560206119eb6118dd8361189c565b8083825260208201915060208460051b870101935086841115611a0c575f80fd5b602086015b8481101561191f57611a228161142d565b8352918301918301611a11565b5f805f8060808587031215611a42575f80fd5b8435935060208501356001600160401b0380821115611a5f575f80fd5b611a6b888389016119cc565b94506040870135915080821115611a80575f80fd5b50611a8d878288016119cc565b925050611a9c6060860161142d565b905092959194509250565b5f805f805f60a08688031215611abb575f80fd5b611ac48661142d565b9450611ad26020870161142d565b9350604086013592506060860135915060808601356001600160401b03811115611afa575f80fd5b6119bf888289016115e2565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b038716815285602082015260a060408201525f611b5560a083018688611b06565b60608301949094525060800152949350505050565b60018060a01b0385168152836020820152606060408201525f611b91606083018486611b06565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611bbf575f80fd5b6108508261142d565b5f808335601e19843603018112611bdd575f80fd5b8301803591506001600160401b03821115611bf6575f80fd5b602001915036819003821315611485575f80fd5b5f838385526020808601955060208560051b830101845f5b87811015611c8e57848303601f19018952813536889003601e19018112611c47575f80fd5b870184810190356001600160401b03811115611c61575f80fd5b803603821315611c6f575f80fd5b611c7a858284611b06565b9a86019a9450505090830190600101611c22565b5090979650505050505050565b60a080825281018890525f8960c08301825b8b811015611cdb576001600160a01b03611cc68461142d565b16825260209283019290910190600101611cad565b5083810360208501528881526001600160fb1b03891115611cfa575f80fd5b8860051b9150818a60208301370182810360209081016040850152611d229082018789611c0a565b60608401959095525050608001529695505050505050565b808201808211156106a257634e487b7160e01b5f52601160045260245ffd5b818382375f910190815291905056fe9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb360002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800b09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1d8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63a2646970667358221220441761ac49bc525b49d85aadd3b81af91f96da5c8e90dd5d6ccfada3f1666ded64736f6c63430008180033",
"deployedBytecode": "0x6080604052600436106101bd575f3560e01c80638065657f116100f2578063bc197c8111610092578063d547741f11610062578063d547741f14610547578063e38335e514610566578063f23a6e6114610579578063f27a0c92146105a4575f80fd5b8063bc197c81146104a7578063c4c4c7b3146104d2578063c4d252f5146104f1578063d45c443514610510575f80fd5b806391d14854116100cd57806391d1485414610423578063a217fddf14610442578063b08e51c014610455578063b1c5f42714610488575f80fd5b80638065657f146103c55780638f2a0bb0146103e45780638f61f4f514610403575f80fd5b80632ab0f5291161015d57806336568abe1161013857806336568abe1461033c578063584b153e1461035b57806364d623531461037a5780637958004c14610399575f80fd5b80632ab0f529146102df5780632f2ff15d146102fe57806331d507501461031d575f80fd5b8063134008d311610198578063134008d31461024b57806313bc9f201461025e578063150b7a021461027d578063248a9ca3146102c0575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e236600461148c565b6105d7565b005b3480156101f4575f80fd5b506102086102033660046114fa565b610698565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b5061023d5f80516020611dc983398151915281565b604051908152602001610214565b6101e7610259366004611521565b6106a8565b348015610269575f80fd5b50610208610278366004611587565b610747565b348015610288575f80fd5b506102a761029736600461164d565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610214565b3480156102cb575f80fd5b5061023d6102da366004611587565b61076c565b3480156102ea575f80fd5b506102086102f9366004611587565b61078c565b348015610309575f80fd5b506101e76103183660046116b0565b610794565b348015610328575f80fd5b50610208610337366004611587565b6107b6565b348015610347575f80fd5b506101e76103563660046116b0565b6107da565b348015610366575f80fd5b50610208610375366004611587565b610812565b348015610385575f80fd5b506101e7610394366004611587565b610857565b3480156103a4575f80fd5b506103b86103b3366004611587565b6108db565b60405161021491906116ee565b3480156103d0575f80fd5b5061023d6103df366004611521565b61092f565b3480156103ef575f80fd5b506101e76103fe366004611754565b61096d565b34801561040e575f80fd5b5061023d5f80516020611da983398151915281565b34801561042e575f80fd5b5061020861043d3660046116b0565b610ae6565b34801561044d575f80fd5b5061023d5f81565b348015610460575f80fd5b5061023d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610493575f80fd5b5061023d6104a23660046117fc565b610b1c565b3480156104b2575f80fd5b506102a76104c136600461192a565b63bc197c8160e01b95945050505050565b3480156104dd575f80fd5b506101e76104ec366004611a2f565b610b60565b3480156104fc575f80fd5b506101e761050b366004611587565b610c5c565b34801561051b575f80fd5b5061023d61052a366004611587565b5f9081525f80516020611d69833981519152602052604090205490565b348015610552575f80fd5b506101e76105613660046116b0565b610d15565b6101e76105743660046117fc565b610d31565b348015610584575f80fd5b506102a7610593366004611aa7565b63f23a6e6160e01b95945050505050565b3480156105af575f80fd5b507f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015461023d565b5f80516020611da98339815191526105ee81610e9f565b5f6105fd89898989898961092f565b90506106098184610eac565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161064496959493929190611b2e565b60405180910390a3831561068d57807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d03878560405161068491815260200190565b60405180910390a25b505050505050505050565b5f6106a282610f6b565b92915050565b5f80516020611dc98339815191526106c0815f610ae6565b6106ce576106ce8133610f8f565b5f6106dd88888888888861092f565b90506106e98185610fcc565b6106f58888888861101a565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161072c9493929190611b6a565b60405180910390a361073d8161108e565b5050505050505050565b5f60025b610754836108db565b6003811115610765576107656116da565b1492915050565b5f9081525f80516020611d89833981519152602052604090206001015490565b5f600361074b565b61079d8261076c565b6107a681610e9f565b6107b083836110c5565b50505050565b5f806107c1836108db565b60038111156107d2576107d26116da565b141592915050565b6001600160a01b03811633146108035760405163334bd91960e11b815260040160405180910390fd5b61080d8282611166565b505050565b5f8061081d836108db565b90506001816003811115610833576108336116da565b14806108505750600281600381111561084e5761084e6116da565b145b9392505050565b5f80516020611d69833981519152333081146108965760405163e2850c5960e01b81526001600160a01b03821660048201526024015b60405180910390fd5b600182015460408051918252602082018590527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15060010155565b5f8181525f80516020611d698339815191526020526040812054805f0361090457505f92915050565b600181036109155750600392915050565b428111156109265750600192915050565b50600292915050565b5f86868686868660405160200161094b96959493929190611b2e565b6040516020818303038152906040528051906020012090509695505050505050565b5f80516020611da983398151915261098481610e9f565b88871415806109935750888514155b156109c5576040516001624fcdef60e01b03198152600481018a9052602481018690526044810188905260640161088d565b5f6109d68b8b8b8b8b8b8b8b610b1c565b90506109e28184610eac565b5f5b8a811015610a975780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610a2157610a21611b9b565b9050602002016020810190610a369190611baf565b8d8d86818110610a4857610a48611b9b565b905060200201358c8c87818110610a6157610a61611b9b565b9050602002810190610a739190611bc8565b8c8b604051610a8796959493929190611b2e565b60405180910390a36001016109e4565b508315610ad957807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610ad091815260200190565b60405180910390a25b5050505050505050505050565b5f9182525f80516020611d89833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8888888888888888604051602001610b3c989796959493929190611c9b565b60405160208183030381529060405280519060200120905098975050505050505050565b5f610b696111df565b805490915060ff600160401b82041615906001600160401b03165f81158015610b8f5750825b90505f826001600160401b03166001148015610baa5750303b155b905081158015610bb8575080155b15610bd65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c0057845460ff60401b1916600160401b1785555b610c0c89898989611207565b831561068d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610c8681610e9f565b5f80516020611d69833981519152610c9d83610812565b610cd95782610cac600261121b565b610cb6600161121b565b604051635ead8eb560e01b8152600481019390935217602482015260440161088d565b5f838152602082905260408082208290555184917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a2505050565b610d1e8261076c565b610d2781610e9f565b6107b08383611166565b5f80516020611dc9833981519152610d49815f610ae6565b610d5757610d578133610f8f565b8786141580610d665750878414155b15610d98576040516001624fcdef60e01b0319815260048101899052602481018590526044810187905260640161088d565b5f610da98a8a8a8a8a8a8a8a610b1c565b9050610db58185610fcc565b5f5b89811015610e89575f8b8b83818110610dd257610dd2611b9b565b9050602002016020810190610de79190611baf565b90505f8a8a84818110610dfc57610dfc611b9b565b905060200201359050365f8a8a86818110610e1957610e19611b9b565b9050602002810190610e2b9190611bc8565b91509150610e3b8484848461101a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b5886868686604051610e729493929190611b6a565b60405180910390a350505050806001019050610db7565b50610e938161108e565b50505050505050505050565b610ea98133610f8f565b50565b5f80516020611d69833981519152610ec3836107b6565b15610ef45782610ed25f61121b565b604051635ead8eb560e01b81526004810192909252602482015260440161088d565b5f610f1d7f9a37c2aa9d186a0969ff8a8267bf4e07e864c2f2768f5040949e28a624fb36015490565b905080831015610f4a57604051635433660960e01b8152600481018490526024810182905260440161088d565b610f548342611d3a565b5f9485526020929092525060409092209190915550565b5f6001600160e01b03198216630271189760e51b14806106a257506106a28261123d565b610f998282610ae6565b610fc85760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161088d565b5050565b610fd582610747565b610fe45781610ed2600261121b565b8015801590610ff95750610ff78161078c565b155b15610fc85760405163121534c360e31b81526004810182905260240161088d565b5f80856001600160a01b0316858585604051611037929190611d59565b5f6040518083038185875af1925050503d805f8114611071576040519150601f19603f3d011682016040523d82523d5f602084013e611076565b606091505b50915091506110858282611271565b50505050505050565b5f80516020611d698339815191526110a582610747565b6110b45781610ed2600261121b565b5f9182526020526040902060019055565b5f5f80516020611d898339815191526110de8484610ae6565b61115d575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556111133390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506106a2565b5f9150506106a2565b5f5f80516020611d8983398151915261117f8484610ae6565b1561115d575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506106a2565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006106a2565b61120f61128d565b6107b0848484846112b4565b5f81600381111561122e5761122e6116da565b600160ff919091161b92915050565b5f6001600160e01b03198216637965db0b60e01b14806106a257506301ffc9a760e01b6001600160e01b03198316146106a2565b60608261128657611281826113eb565b6106a2565b50806106a2565b611295611414565b6112b257604051631afcd79f60e31b815260040160405180910390fd5b565b6112bc61128d565b5f80516020611d698339815191526112d45f306110c5565b506001600160a01b038216156112f0576112ee5f836110c5565b505b5f5b845181101561136b5761132b5f80516020611da983398151915286838151811061131e5761131e611b9b565b60200260200101516110c5565b506113627ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78386838151811061131e5761131e611b9b565b506001016112f2565b505f5b83518110156113a35761139a5f80516020611dc983398151915285838151811061131e5761131e611b9b565b5060010161136e565b5060018101859055604080515f8152602081018790527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a15050505050565b8051156113fb5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f61141d6111df565b54600160401b900460ff16919050565b80356001600160a01b0381168114611443575f80fd5b919050565b5f8083601f840112611458575f80fd5b5081356001600160401b0381111561146e575f80fd5b602083019150836020828501011115611485575f80fd5b9250929050565b5f805f805f805f60c0888a0312156114a2575f80fd5b6114ab8861142d565b96506020880135955060408801356001600160401b038111156114cc575f80fd5b6114d88a828b01611448565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f6020828403121561150a575f80fd5b81356001600160e01b031981168114610850575f80fd5b5f805f805f8060a08789031215611536575f80fd5b61153f8761142d565b95506020870135945060408701356001600160401b03811115611560575f80fd5b61156c89828a01611448565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611597575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156115da576115da61159e565b604052919050565b5f82601f8301126115f1575f80fd5b81356001600160401b0381111561160a5761160a61159e565b61161d601f8201601f19166020016115b2565b818152846020838601011115611631575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611660575f80fd5b6116698561142d565b93506116776020860161142d565b92506040850135915060608501356001600160401b03811115611698575f80fd5b6116a4878288016115e2565b91505092959194509250565b5f80604083850312156116c1575f80fd5b823591506116d16020840161142d565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016004831061170e57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8083601f840112611724575f80fd5b5081356001600160401b0381111561173a575f80fd5b6020830191508360208260051b8501011115611485575f80fd5b5f805f805f805f805f60c08a8c03121561176c575f80fd5b89356001600160401b0380821115611782575f80fd5b61178e8d838e01611714565b909b50995060208c01359150808211156117a6575f80fd5b6117b28d838e01611714565b909950975060408c01359150808211156117ca575f80fd5b506117d78c828d01611714565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611813575f80fd5b88356001600160401b0380821115611829575f80fd5b6118358c838d01611714565b909a50985060208b013591508082111561184d575f80fd5b6118598c838d01611714565b909850965060408b0135915080821115611871575f80fd5b5061187e8b828c01611714565b999c989b509699959896976060870135966080013595509350505050565b5f6001600160401b038211156118b4576118b461159e565b5060051b60200190565b5f82601f8301126118cd575f80fd5b813560206118e26118dd8361189c565b6115b2565b8083825260208201915060208460051b870101935086841115611903575f80fd5b602086015b8481101561191f578035835291830191