@openzeppelin/contracts-upgradeable
Version:
Secure Smart Contract library for Solidity
1,197 lines • 69.8 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "AccessManagerUpgradeable",
"sourceName": "contracts/access/manager/AccessManagerUpgradeable.sol",
"abi": [
{
"inputs": [
{
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
}
],
"name": "AccessManagerAlreadyScheduled",
"type": "error"
},
{
"inputs": [],
"name": "AccessManagerBadConfirmation",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
}
],
"name": "AccessManagerExpired",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "initialAdmin",
"type": "address"
}
],
"name": "AccessManagerInvalidInitialAdmin",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
}
],
"name": "AccessManagerLockedRole",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
}
],
"name": "AccessManagerNotReady",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
}
],
"name": "AccessManagerNotScheduled",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "msgsender",
"type": "address"
},
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
}
],
"name": "AccessManagerUnauthorizedAccount",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes4",
"name": "selector",
"type": "bytes4"
}
],
"name": "AccessManagerUnauthorizedCall",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "msgsender",
"type": "address"
},
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes4",
"name": "selector",
"type": "bytes4"
}
],
"name": "AccessManagerUnauthorizedCancel",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "AccessManagerUnauthorizedConsume",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "AddressEmptyCode",
"type": "error"
},
{
"inputs": [],
"name": "FailedCall",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "balance",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "needed",
"type": "uint256"
}
],
"name": "InsufficientBalance",
"type": "error"
},
{
"inputs": [],
"name": "InvalidInitialization",
"type": "error"
},
{
"inputs": [],
"name": "NotInitializing",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint8",
"name": "bits",
"type": "uint8"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "SafeCastOverflowedUintDowncast",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint64",
"name": "version",
"type": "uint64"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint32",
"name": "nonce",
"type": "uint32"
}
],
"name": "OperationCanceled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint32",
"name": "nonce",
"type": "uint32"
}
],
"name": "OperationExecuted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "uint32",
"name": "nonce",
"type": "uint32"
},
{
"indexed": false,
"internalType": "uint48",
"name": "schedule",
"type": "uint48"
},
{
"indexed": false,
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "OperationScheduled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"indexed": true,
"internalType": "uint64",
"name": "admin",
"type": "uint64"
}
],
"name": "RoleAdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"indexed": false,
"internalType": "uint32",
"name": "delay",
"type": "uint32"
},
{
"indexed": false,
"internalType": "uint48",
"name": "since",
"type": "uint48"
}
],
"name": "RoleGrantDelayChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": false,
"internalType": "uint32",
"name": "delay",
"type": "uint32"
},
{
"indexed": false,
"internalType": "uint48",
"name": "since",
"type": "uint48"
},
{
"indexed": false,
"internalType": "bool",
"name": "newMember",
"type": "bool"
}
],
"name": "RoleGranted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"indexed": true,
"internalType": "uint64",
"name": "guardian",
"type": "uint64"
}
],
"name": "RoleGuardianChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"indexed": false,
"internalType": "string",
"name": "label",
"type": "string"
}
],
"name": "RoleLabel",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "RoleRevoked",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "uint32",
"name": "delay",
"type": "uint32"
},
{
"indexed": false,
"internalType": "uint48",
"name": "since",
"type": "uint48"
}
],
"name": "TargetAdminDelayUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "closed",
"type": "bool"
}
],
"name": "TargetClosed",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "target",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes4",
"name": "selector",
"type": "bytes4"
},
{
"indexed": true,
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
}
],
"name": "TargetFunctionRoleUpdated",
"type": "event"
},
{
"inputs": [],
"name": "ADMIN_ROLE",
"outputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PUBLIC_ROLE",
"outputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes4",
"name": "selector",
"type": "bytes4"
}
],
"name": "canCall",
"outputs": [
{
"internalType": "bool",
"name": "immediate",
"type": "bool"
},
{
"internalType": "uint32",
"name": "delay",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "cancel",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "consumeScheduledOp",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "execute",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "expiration",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "getAccess",
"outputs": [
{
"internalType": "uint48",
"name": "since",
"type": "uint48"
},
{
"internalType": "uint32",
"name": "currentDelay",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "pendingDelay",
"type": "uint32"
},
{
"internalType": "uint48",
"name": "effect",
"type": "uint48"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "getNonce",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
}
],
"name": "getRoleAdmin",
"outputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
}
],
"name": "getRoleGrantDelay",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
}
],
"name": "getRoleGuardian",
"outputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "id",
"type": "bytes32"
}
],
"name": "getSchedule",
"outputs": [
{
"internalType": "uint48",
"name": "",
"type": "uint48"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "getTargetAdminDelay",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes4",
"name": "selector",
"type": "bytes4"
}
],
"name": "getTargetFunctionRole",
"outputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint32",
"name": "executionDelay",
"type": "uint32"
}
],
"name": "grantRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasRole",
"outputs": [
{
"internalType": "bool",
"name": "isMember",
"type": "bool"
},
{
"internalType": "uint32",
"name": "executionDelay",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "caller",
"type": "address"
},
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "hashOperation",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "initialAdmin",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
}
],
"name": "isTargetClosed",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"internalType": "string",
"name": "label",
"type": "string"
}
],
"name": "labelRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "minSetback",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "results",
"type": "bytes[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"internalType": "address",
"name": "callerConfirmation",
"type": "address"
}
],
"name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
},
{
"internalType": "uint48",
"name": "when",
"type": "uint48"
}
],
"name": "schedule",
"outputs": [
{
"internalType": "bytes32",
"name": "operationId",
"type": "bytes32"
},
{
"internalType": "uint32",
"name": "nonce",
"type": "uint32"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"internalType": "uint32",
"name": "newDelay",
"type": "uint32"
}
],
"name": "setGrantDelay",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "admin",
"type": "uint64"
}
],
"name": "setRoleAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "guardian",
"type": "uint64"
}
],
"name": "setRoleGuardian",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "uint32",
"name": "newDelay",
"type": "uint32"
}
],
"name": "setTargetAdminDelay",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bool",
"name": "closed",
"type": "bool"
}
],
"name": "setTargetClosed",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "bytes4[]",
"name": "selectors",
"type": "bytes4[]"
},
{
"internalType": "uint64",
"name": "roleId",
"type": "uint64"
}
],
"name": "setTargetFunctionRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "target",
"type": "address"
},
{
"internalType": "address",
"name": "newAuthority",
"type": "address"
}
],
"name": "updateAuthority",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x608060405234801561000f575f80fd5b50612bab8061001d5f395ff3fe6080604052600436106101e6575f3560e01c80636d5115bd11610108578063b70096131161009d578063d1f856ee1161006d578063d1f856ee146105e9578063d22b598914610608578063d6bb62c614610627578063f801a69814610646578063fe0776f51461067f575f80fd5b8063b70096131461055b578063b7d2b16214610596578063c4d66de8146105b5578063cc1b6c81146105d4575f80fd5b8063a166aa89116100d8578063a166aa89146104b4578063a64d95ce146104e3578063abd9bd2a14610502578063ac9650d81461052f575f80fd5b80636d5115bd1461044457806375b238fc14610463578063853551b81461047657806394c7d7ee14610495575f80fd5b806330cae1871161017e5780634665096d1161014e5780634665096d146103d25780634c1da1e2146103e75780635296295214610406578063530dd45614610425575f80fd5b806330cae187146103445780633adc277a146103635780633ca7c02a146103995780634136a33c146103b3575f80fd5b806318ff183c116101b957806318ff183c1461029a5780631cff79cd146102b957806325c471a0146102cc5780633078f114146102eb575f80fd5b806308d6122d146101ea5780630b0a93ba1461020b57806312be872714610247578063167bd3951461027b575b5f80fd5b3480156101f5575f80fd5b5061020961020436600461246f565b61069e565b005b348015610216575f80fd5b5061022a6102253660046124d1565b6106f0565b6040516001600160401b0390911681526020015b60405180910390f35b348015610252575f80fd5b506102666102613660046124d1565b610727565b60405163ffffffff909116815260200161023e565b348015610286575f80fd5b506102096102953660046124ea565b610771565b3480156102a5575f80fd5b506102096102b4366004612525565b610787565b6102666102c736600461258e565b6107e9565b3480156102d7575f80fd5b506102096102e63660046125f1565b61092a565b3480156102f6575f80fd5b5061030a610305366004612633565b61094c565b60405161023e949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561034f575f80fd5b5061020961035e36600461264d565b6109bf565b34801561036e575f80fd5b5061038261037d36600461267e565b6109d1565b60405165ffffffffffff909116815260200161023e565b3480156103a4575f80fd5b5061022a6001600160401b0381565b3480156103be575f80fd5b506102666103cd36600461267e565b610a13565b3480156103dd575f80fd5b5062093a80610266565b3480156103f2575f80fd5b50610266610401366004612695565b610a3e565b348015610411575f80fd5b5061020961042036600461264d565b610a78565b348015610430575f80fd5b5061022a61043f3660046124d1565b610a8a565b34801561044f575f80fd5b5061022a61045e3660046126c5565b610aba565b34801561046e575f80fd5b5061022a5f81565b348015610481575f80fd5b506102096104903660046126f1565b610b01565b3480156104a0575f80fd5b506102096104af36600461258e565b610b98565b3480156104bf575f80fd5b506104d36104ce366004612695565b610c42565b604051901515815260200161023e565b3480156104ee575f80fd5b506102096104fd36600461270c565b610c79565b34801561050d575f80fd5b5061052161051c366004612734565b610c8b565b60405190815260200161023e565b34801561053a575f80fd5b5061054e610549366004612794565b610cc3565b60405161023e91906127f4565b348015610566575f80fd5b5061057a61057536600461286c565b610da8565b60408051921515835263ffffffff90911660208301520161023e565b3480156105a1575f80fd5b506102096105b0366004612633565b610e29565b3480156105c0575f80fd5b506102096105cf366004612695565b610e40565b3480156105df575f80fd5b5062069780610266565b3480156105f4575f80fd5b5061057a610603366004612633565b610f36565b348015610613575f80fd5b506102096106223660046128b4565b610faf565b348015610632575f80fd5b50610266610641366004612734565b610fc1565b348015610651575f80fd5b506106656106603660046128d0565b611124565b6040805192835263ffffffff90911660208301520161023e565b34801561068a575f80fd5b50610209610699366004612633565b6112c0565b6106a66112e9565b5f5b828110156106e9576106e1858585848181106106c6576106c661293d565b90506020020160208101906106db9190612951565b84611360565b6001016106a8565b5050505050565b5f806106fa6113ec565b6001600160401b039384165f9081526001918201602052604090200154600160401b900490921692915050565b5f806107316113ec565b6001600160401b0384165f90815260018281016020526040909120015490915061076a90600160801b90046001600160701b0316611410565b9392505050565b6107796112e9565b610783828261142e565b5050565b61078f6112e9565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b906024015f604051808303815f87803b1580156107cf575f80fd5b505af11580156107e1573d5f803e3d5ffd5b505050505050565b5f806107f36113ec565b9050335f80610804838989896114a0565b915091508115801561081a575063ffffffff8116155b1561086d57828861082b89896114f1565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b5f61087a848a8a8a610c8b565b90505f63ffffffff83161515806108a05750610895826109d1565b65ffffffffffff1615155b156108b1576108ae82611508565b90505b60038601546108c98b6108c48c8c6114f1565b611619565b87600301819055506109128b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525034925061165b915050565b50600390960195909555509293505050509392505050565b6109326112e9565b610946838361094086610727565b846116fb565b50505050565b5f805f805f6109596113ec565b6001600160401b0388165f90815260018201602090815260408083206001600160a01b038b1684529091529020805465ffffffffffff81169750919250906109b090600160301b90046001600160701b0316611955565b979a9199509750945050505050565b6109c76112e9565b6107838282611976565b5f806109db6113ec565b5f84815260028201602052604090205490915065ffffffffffff166109ff81611a26565b610a095780610a0b565b5f5b949350505050565b5f80610a1d6113ec565b5f93845260020160205250506040902054600160301b900463ffffffff1690565b5f80610a486113ec565b6001600160a01b0384165f9081526020829052604090206001015490915061076a906001600160701b0316611410565b610a806112e9565b6107838282611a54565b5f80610a946113ec565b6001600160401b039384165f908152600191820160205260409020015490921692915050565b5f80610ac46113ec565b6001600160a01b0385165f908152602091825260408082206001600160e01b03198716835290925220546001600160401b03169150505b92915050565b610b096112e9565b6001600160401b0383161580610b2757506001600160401b03838116145b15610b505760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610b8b929190612994565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610bd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfb91906129a7565b6001600160e01b03191614610c2e57604051630641fee960e31b81526001600160a01b0382166004820152602401610864565b6106e9610c3d85838686610c8b565b611508565b5f80610c4c6113ec565b6001600160a01b039093165f9081526020939093525050604090206001015460ff600160701b9091041690565b610c816112e9565b6107838282611b12565b5f84848484604051602001610ca394939291906129c2565b604051602081830303815290604052805190602001209050949350505050565b604080515f815260208101909152606090826001600160401b03811115610cec57610cec612a29565b604051908082528060200260200182016040528015610d1f57816020015b6060815260200190600190039081610d0a5790505b5091505f5b83811015610da057610d7b30868684818110610d4257610d4261293d565b9050602002810190610d549190612a3d565b85604051602001610d6793929190612a7f565b604051602081830303815290604052611c3c565b838281518110610d8d57610d8d61293d565b6020908102919091010152600101610d24565b505092915050565b5f80610db384610c42565b15610dc257505f905080610e21565b306001600160a01b03861603610de657610ddc8484611cae565b5f91509150610e21565b5f610df18585610aba565b90505f80610dff8389610f36565b9150915081610e0f575f80610e19565b63ffffffff811615815b945094505050505b935093915050565b610e316112e9565b610e3b8282611cd2565b505050565b5f610e49611dcd565b805490915060ff600160401b82041615906001600160401b03165f81158015610e6f5750825b90505f826001600160401b03166001148015610e8a5750303b155b905081158015610e98575080155b15610eb65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ee057845460ff60401b1916600160401b1785555b610ee986611df5565b83156107e157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b5f8067fffffffffffffffe196001600160401b03851601610f5c5750600190505f610fa8565b5f80610f68868661094c565b5050915091508165ffffffffffff165f14158015610f9d5750610f89611e09565b65ffffffffffff168265ffffffffffff1611155b93509150610fa89050565b9250929050565b610fb76112e9565b6107838282611e18565b5f80610fcb6113ec565b9050335f610fd986866114f1565b90505f610fe889898989610c8b565b5f81815260028601602052604081205491925065ffffffffffff90911690036110275760405163060a299b60e41b815260048101829052602401610864565b826001600160a01b0316896001600160a01b0316146110c0575f61104b5f85610f36565b5090505f61106561105f6102258c87610aba565b86610f36565b50905081158015611074575080155b156110bd57604051630ff89d4760e21b81526001600160a01b038087166004830152808d1660248301528b1660448201526001600160e01b031985166064820152608401610864565b50505b5f818152600285016020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a39998505050505050505050565b5f805f61112f6113ec565b9050335f61113f828a8a8a6114a0565b9150505f8163ffffffff16611152611e09565b61115c9190612aa4565b905063ffffffff8216158061119257505f8765ffffffffffff1611801561119257508065ffffffffffff168765ffffffffffff16105b156111a357828a61082b8b8b6114f1565b6111bd8765ffffffffffff168265ffffffffffff16611ee0565b96506111cb838b8b8b610c8b565b95506111d686611eef565b836002015f8781526020019081526020015f205f0160069054906101000a900463ffffffff16600101945086846002015f8881526020019081526020015f205f015f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555084846002015f8881526020019081526020015f205f0160066101000a81548163ffffffff021916908363ffffffff1602179055508463ffffffff16867f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b489868e8e8e6040516112ab959493929190612aca565b60405180910390a35050505094509492505050565b6001600160a01b0381163314610e3157604051635f159e6360e01b815260040160405180910390fd5b335f806112f7838236611f49565b9150915081610e3b578063ffffffff165f03611351575f611318813661200c565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b03821660248201529092506044019050610864565b610946610c3d84305f36610c8b565b5f6113696113ec565b6001600160a01b0385165f818152602083815260408083206001600160e01b0319891680855290835292819020805467ffffffffffffffff19166001600160401b03891690811790915590519283529394507f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a350505050565b7f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0090565b5f80611424836001600160701b0316611955565b5090949350505050565b5f6114376113ec565b6001600160a01b0384165f81815260208390526040908190206001018054861515600160701b0260ff60701b1990911617905551919250907f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb13890610b8b90851515815260200190565b5f80306001600160a01b038616036114c6576114bd868585611f49565b915091506114e8565b600483106114e2576114dd868661057587876114f1565b6114bd565b505f9050805b94509492505050565b5f6114ff6004828486612a02565b61076a91612b0f565b5f806115126113ec565b5f84815260028201602052604081205491925065ffffffffffff821691600160301b900463ffffffff16908290036115605760405163060a299b60e41b815260048101869052602401610864565b611568611e09565b65ffffffffffff168265ffffffffffff16111561159b57604051630c65b5bd60e11b815260048101869052602401610864565b6115a482611a26565b156115c557604051631e2975b960e21b815260048101869052602401610864565b5f858152600284016020526040808220805465ffffffffffff191690555163ffffffff83169187917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a3949350505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156116875760405163cf47918160e01b815247600482015260248101839052604401610864565b5f80856001600160a01b031684866040516116a29190612b3d565b5f6040518083038185875af1925050503d805f81146116dc576040519150601f19603f3d011682016040523d82523d5f602084013e6116e1565b606091505b50915091506116f18683836121d6565b9695505050505050565b5f806117056113ec565b905067fffffffffffffffe196001600160401b038716016117445760405163061c6a4360e21b81526001600160401b0387166004820152602401610864565b6001600160401b0386165f90815260018201602090815260408083206001600160a01b038916845290915281205465ffffffffffff1615908115611838578563ffffffff16611791611e09565b61179b9190612aa4565b905060405180604001604052808265ffffffffffff1681526020016117c98763ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b038a165f90815260018601602090815260408083206001600160a01b038d1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff909116179190911790556118e6565b6001600160401b0388165f90815260018401602090815260408083206001600160a01b038b16845290915281205461188391600160301b9091046001600160701b0316908790612232565b6001600160401b038a165f90815260018601602090815260408083206001600160a01b038d168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8716815265ffffffffffff831660208201528315158183015290516001600160a01b038916916001600160401b038b16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a3509695505050505050565b5f805f61196984611964611e09565b6122d8565b9250925092509193909250565b5f61197f6113ec565b90506001600160401b038316158061199f57506001600160401b03838116145b156119c85760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b038381165f81815260018481016020526040808320909101805467ffffffffffffffff19169487169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a3505050565b5f611a2f611e09565b65ffffffffffff16611a4462093a8084612aa4565b65ffffffffffff16111592915050565b5f611a5d6113ec565b90506001600160401b0383161580611a7d57506001600160401b03838116145b15611aa65760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b038381165f8181526001848101602052604080832090910180546fffffffffffffffff00000000000000001916600160401b958816958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a3505050565b5f611b1b6113ec565b905067fffffffffffffffe196001600160401b03841601611b5a5760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b0383165f9081526001828101602052604082200154611b9490600160801b90046001600160701b03168462069780612232565b6001600160401b0386165f81815260018087016020526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890611c2e908690859063ffffffff92909216825265ffffffffffff16602082015260400190565b60405180910390a250505050565b60605f80846001600160a01b031684604051611c589190612b3d565b5f60405180830381855af49150503d805f8114611c90576040519150601f19603f3d011682016040523d82523d5f602084013e611c95565b606091505b5091509150611ca58583836121d6565b95945050505050565b5f80611cb86113ec565b9050611cc48484611619565b600390910154149392505050565b5f80611cdc6113ec565b905067fffffffffffffffe196001600160401b03851601611d1b5760405163061c6a4360e21b81526001600160401b0385166004820152602401610864565b6001600160401b0384165f90815260018201602090815260408083206001600160a01b038716845290915281205465ffffffffffff169003611d60575f915050610afb565b6001600160401b0384165f81815260018301602090815260408083206001600160a01b038816808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a35060019392505050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610afb565b611dfd612324565b611e068161234b565b50565b5f611e1342612388565b905090565b5f611e216113ec565b90505f611e5783620697806001600160a01b0387165f908152602086905260409020600101546001600160701b03169190612232565b6001600160a01b0386165f818152602086815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8816815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101611c2e565b5f82821882841102821861076a565b5f611ef86113ec565b5f83815260028201602052604090205490915065ffffffffffff168015801590611f285750611f2681611a26565b155b15610e3b5760405163813e945960e01b815260048101849052602401610864565b5f806004831015611f5e57505f905080610e21565b306001600160a01b03861603611f8157610ddc30611f7c86866114f1565b611cae565b5f805f611f8e878761200c565b92509250925082158015611fa65750611fa630610c42565b15611fb9575f8094509450505050610e21565b5f80611fc5848b610f36565b9150915081611fde575f80965096505050505050610e21565b611ff48363ffffffff168263ffffffff16611ee0565b63ffffffff8116159b909a5098505050505050505050565b5f8080600484101561202557505f9150819050806121cf565b5f61203086866114f1565b90506001600160e01b031981166310a6aa3760e31b148061206157506001600160e01b031981166330cae18760e01b145b8061207c57506001600160e01b0319811663294b14a960e11b145b8061209757506001600160e01b03198116635326cae760e11b145b806120b257506001600160e01b0319811663d22b598960e01b145b156120c75760015f80935093509350506121cf565b6001600160e01b0319811663063fc60f60e21b14806120f657506001600160e01b0319811663167bd39560e01b145b8061211157506001600160e01b031981166308d6122d60e01b145b15612150575f61212560246004888a612a02565b8101906121329190612695565b90505f61213e82610a3e565b600196505f955093506121cf92505050565b6001600160e01b0319811663012e238d60e51b148061217f57506001600160e01b03198116635be958b160e11b145b156121bb575f61219360246004888a612a02565b8101906121a091906124d1565b905060016121ad82610a8a565b5f94509450945050506121cf565b5f6121c63083610aba565b5f935093509350505b9250925092565b6060826121eb576121e6826123be565b61076a565b815115801561220257506001600160a01b0384163b155b1561222b57604051639996b31560e01b81526001600160a01b0385166004820152602401610864565b508061076a565b5f805f612247866001600160701b0316611410565b90505f6122828563ffffffff168763ffffffff168463ffffffff161161226d575f612277565b6122778885612b58565b63ffffffff16611ee0565b90508063ffffffff16612293611e09565b61229d9190612aa4565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561231357828282612317565b815f805b9250925092509250925092565b61232c6123e7565b61234957604051631afcd79f60e31b815260040160405180910390fd5b565b612353612324565b6001600160a01b03811661237c57604051630409d6d160e11b81525f6004820152602401610864565b6107835f825f806116fb565b5f65ffffffffffff8211156123ba576040516306dfcc6560e41b81526030600482015260248101839052604401610864565b5090565b8051156123ce5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f6123f0611dcd565b54600160401b900460ff16919050565b6001600160a01b0381168114611e06575f80fd5b5f8083601f840112612424575f80fd5b5081356001600160401b0381111561243a575f80fd5b6020830191508360208260051b8501011115610fa8575f80fd5b80356001600160401b038116811461246a575f80fd5b919050565b5f805f8060608587031215612482575f80fd5b843561248d81612400565b935060208501356001600160401b038111156124a7575f80fd5b6124b387828801612414565b90945092506124c6905060408601612454565b905092959194509250565b5f602082840312156124e1575f80fd5b61076a82612454565b5f80604083850312156124fb575f80fd5b823561250681612400565b91506020830135801515811461251a575f80fd5b809150509250929050565b5f8060408385031215612536575f80fd5b823561254181612400565b9150602083013561251a81612400565b5f8083601f840112612561575f80fd5b5081356001600160401b03811115612577575f80fd5b602083019150836020828501011115610fa8575f80fd5b5f805f604084860312156125a0575f80fd5b83356125ab81612400565b925060208401356001600160401b038111156125c5575f80fd5b6125d186828701612551565b9497909650939450505050565b803563ffffffff8116811461246a575f80fd5b5f805f60608486031215612603575f80fd5b61260c84612454565b9250602084013561261c81612400565b915061262a604085016125de565b90509250925092565b5f8060408385031215612644575f80fd5b61254183612454565b5f806040838503121561265e575f80fd5b61266783612454565b915061267560208401612454565b90509250929050565b5f6020828403121561268e575f80fd5b5035919050565b5f602082840312156126a5575f80fd5b813561076a81612400565b6001600160e01b031981168114611e06575f80fd5b5f80604083850312156126d6575f80fd5b82356126e181612400565b9150602083013561251a816126b0565b5f805f60408486031215612703575f80fd5b6125ab84612454565b5f806040838503121561271d575f80fd5b61272683612454565b9150612675602084016125de565b5f805f8060608587031215612747575f80fd5b843561275281612400565b9350602085013561276281612400565b925060408501356001600160401b0381111561277c575f80fd5b61278887828801612551565b95989497509550505050565b5f80602083850312156127a5575f80fd5b82356001600160401b038111156127ba575f80fd5b6127c685828601612414565b90969095509350505050565b5f5b838110156127ec5781810151838201526020016127d4565b50505f910152565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b8281101561285f57878503603f1901845281518051808752612840818989018a85016127d2565b601f01601f191695909501860194509285019290850190600101612819565b5092979650505050505050565b5f805f6060848603121561287e575f80fd5b833561288981612400565b9250602084013561289981612400565b915060408401356128a9816126b0565b809150509250925092565b5f80604083850312156128c5575f80fd5b823561272681612400565b5f805f80606085870312156128e3575f80fd5b84356128ee81612400565b935060208501356001600160401b03811115612908575f80fd5b61291487828801612551565b909450925050604085013565ffffffffffff81168114612932575f80fd5b939692955090935050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612961575f80fd5b813561076a816126b0565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610a0b60208301848661296c565b5f602082840312156129b7575f80fd5b815161076a816126b0565b6001600160a01b038581168252841660208201526060604082018190525f906116f1908301848661296c565b634e487b7160e01b5f52601160045260245ffd5b5f8085851115612a10575f80fd5b83861115612a1c575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f808335601e19843603018112612a52575f80fd5b8301803591506001600160401b03821115612a6b575f80fd5b602001915036819003821315610fa8575f80fd5b828482375f8382015f81528351612a9a8183602088016127d2565b0195945050505050565b65ffffffffffff818116838216019080821115612ac357612ac36129ee565b5092915050565b65ffffffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90612b04908301848661296c565b979650505050505050565b6001600160e01b03198135818116916004851015610da05760049490940360031b84901b1690921692915050565b5f8251612b4e8184602087016127d2565b9190910192915050565b63ffffffff828116828216039080821115612ac357612ac36129ee56fea26469706673582212206f6bc01aa1525d032d3d7986b52a271c17b92c365f4296d33466b84551eb567864736f6c63430008180033",
"deployedBytecode": "0x6080604052600436106101e6575f3560e01c80636d5115bd11610108578063b70096131161009d578063d1f856ee1161006d578063d1f856ee146105e9578063d22b598914610608578063d6bb62c614610627578063f801a69814610646578063fe0776f51461067f575f80fd5b8063b70096131461055b578063b7d2b16214610596578063c4d66de8146105b5578063cc1b6c81146105d4575f80fd5b8063a166aa89116100d8578063a166aa89146104b4578063a64d95ce146104e3578063abd9bd2a14610502578063ac9650d81461052f575f80fd5b80636d5115bd1461044457806375b238fc14610463578063853551b81461047657806394c7d7ee14610495575f80fd5b806330cae1871161017e5780634665096d1161014e5780634665096d146103d25780634c1da1e2146103e75780635296295214610406578063530dd45614610425575f80fd5b806330cae187146103445780633adc277a146103635780633ca7c02a146103995780634136a33c146103b3575f80fd5b806318ff183c116101b957806318ff183c1461029a5780631cff79cd146102b957806325c471a0146102cc5780633078f114146102eb575f80fd5b806308d6122d146101ea5780630b0a93ba1461020b57806312be872714610247578063167bd3951461027b575b5f80fd5b3480156101f5575f80fd5b5061020961020436600461246f565b61069e565b005b348015610216575f80fd5b5061022a6102253660046124d1565b6106f0565b6040516001600160401b0390911681526020015b60405180910390f35b348015610252575f80fd5b506102666102613660046124d1565b610727565b60405163ffffffff909116815260200161023e565b348015610286575f80fd5b506102096102953660046124ea565b610771565b3480156102a5575f80fd5b506102096102b4366004612525565b610787565b6102666102c736600461258e565b6107e9565b3480156102d7575f80fd5b506102096102e63660046125f1565b61092a565b3480156102f6575f80fd5b5061030a610305366004612633565b61094c565b60405161023e949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561034f575f80fd5b5061020961035e36600461264d565b6109bf565b34801561036e575f80fd5b5061038261037d36600461267e565b6109d1565b60405165ffffffffffff909116815260200161023e565b3480156103a4575f80fd5b5061022a6001600160401b0381565b3480156103be575f80fd5b506102666103cd36600461267e565b610a13565b3480156103dd575f80fd5b5062093a80610266565b3480156103f2575f80fd5b50610266610401366004612695565b610a3e565b348015610411575f80fd5b5061020961042036600461264d565b610a78565b348015610430575f80fd5b5061022a61043f3660046124d1565b610a8a565b34801561044f575f80fd5b5061022a61045e3660046126c5565b610aba565b34801561046e575f80fd5b5061022a5f81565b348015610481575f80fd5b506102096104903660046126f1565b610b01565b3480156104a0575f80fd5b506102096104af36600461258e565b610b98565b3480156104bf575f80fd5b506104d36104ce366004612695565b610c42565b604051901515815260200161023e565b3480156104ee575f80fd5b506102096104fd36600461270c565b610c79565b34801561050d575f80fd