UNPKG

@openzeppelin/contracts-upgradeable

Version:
1,197 lines 69.8 kB
{ "_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": "0x608060405234801561000f575f80fd5b50612ba38061001d5f395ff3fe6080604052600436106101e6575f3560e01c80636d5115bd11610108578063b70096131161009d578063d1f856ee1161006d578063d1f856ee146105e9578063d22b598914610608578063d6bb62c614610627578063f801a69814610646578063fe0776f51461067f575f80fd5b8063b70096131461055b578063b7d2b16214610596578063c4d66de8146105b5578063cc1b6c81146105d4575f80fd5b8063a166aa89116100d8578063a166aa89146104b4578063a64d95ce146104e3578063abd9bd2a14610502578063ac9650d81461052f575f80fd5b80636d5115bd1461044457806375b238fc14610463578063853551b81461047657806394c7d7ee14610495575f80fd5b806330cae1871161017e5780634665096d1161014e5780634665096d146103d25780634c1da1e2146103e75780635296295214610406578063530dd45614610425575f80fd5b806330cae187146103445780633adc277a146103635780633ca7c02a146103995780634136a33c146103b3575f80fd5b806318ff183c116101b957806318ff183c1461029a5780631cff79cd146102b957806325c471a0146102cc5780633078f114146102eb575f80fd5b806308d6122d146101ea5780630b0a93ba1461020b57806312be872714610247578063167bd3951461027b575b5f80fd5b3480156101f5575f80fd5b50610209610204366004612467565b61069e565b005b348015610216575f80fd5b5061022a6102253660046124c9565b6106f0565b6040516001600160401b0390911681526020015b60405180910390f35b348015610252575f80fd5b506102666102613660046124c9565b610727565b60405163ffffffff909116815260200161023e565b348015610286575f80fd5b506102096102953660046124e2565b610771565b3480156102a5575f80fd5b506102096102b436600461251d565b610787565b6102666102c7366004612586565b6107e9565b3480156102d7575f80fd5b506102096102e63660046125e9565b61092a565b3480156102f6575f80fd5b5061030a61030536600461262b565b61094c565b60405161023e949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561034f575f80fd5b5061020961035e366004612645565b6109bf565b34801561036e575f80fd5b5061038261037d366004612676565b6109d1565b60405165ffffffffffff909116815260200161023e565b3480156103a4575f80fd5b5061022a6001600160401b0381565b3480156103be575f80fd5b506102666103cd366004612676565b610a13565b3480156103dd575f80fd5b5062093a80610266565b3480156103f2575f80fd5b5061026661040136600461268d565b610a3e565b348015610411575f80fd5b50610209610420366004612645565b610a78565b348015610430575f80fd5b5061022a61043f3660046124c9565b610a8a565b34801561044f575f80fd5b5061022a61045e3660046126bd565b610aba565b34801561046e575f80fd5b5061022a5f81565b348015610481575f80fd5b506102096104903660046126e9565b610b01565b3480156104a0575f80fd5b506102096104af366004612586565b610b98565b3480156104bf575f80fd5b506104d36104ce36600461268d565b610c42565b604051901515815260200161023e565b3480156104ee575f80fd5b506102096104fd366004612704565b610c79565b34801561050d575f80fd5b5061052161051c36600461272c565b610c8b565b60405190815260200161023e565b34801561053a575f80fd5b5061054e61054936600461278c565b610cc3565b60405161023e91906127ec565b348015610566575f80fd5b5061057a610575366004612864565b610da8565b60408051921515835263ffffffff90911660208301520161023e565b3480156105a1575f80fd5b506102096105b036600461262b565b610e29565b3480156105c0575f80fd5b506102096105cf36600461268d565b610e40565b3480156105df575f80fd5b5062069780610266565b3480156105f4575f80fd5b5061057a61060336600461262b565b610f4b565b348015610613575f80fd5b506102096106223660046128ac565b610fc4565b348015610632575f80fd5b5061026661064136600461272c565b610fd6565b348015610651575f80fd5b506106656106603660046128c8565b611139565b6040805192835263ffffffff90911660208301520161023e565b34801561068a575f80fd5b5061020961069936600461262b565b6112d5565b6106a66112fe565b5f5b828110156106e9576106e1858585848181106106c6576106c6612935565b90506020020160208101906106db9190612949565b84611375565b6001016106a8565b5050505050565b5f806106fa611401565b6001600160401b039384165f9081526001918201602052604090200154600160401b900490921692915050565b5f80610731611401565b6001600160401b0384165f90815260018281016020526040909120015490915061076a90600160801b90046001600160701b0316611425565b9392505050565b6107796112fe565b6107838282611443565b5050565b61078f6112fe565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b906024015f604051808303815f87803b1580156107cf575f80fd5b505af11580156107e1573d5f803e3d5ffd5b505050505050565b5f806107f3611401565b9050335f80610804838989896114b5565b915091508115801561081a575063ffffffff8116155b1561086d57828861082b8989611506565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b5f61087a848a8a8a610c8b565b90505f63ffffffff83161515806108a05750610895826109d1565b65ffffffffffff1615155b156108b1576108ae8261151d565b90505b60038601546108c98b6108c48c8c611506565b61162e565b87600301819055506109128b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250349250611670915050565b50600390960195909555509293505050509392505050565b6109326112fe565b610946838361094086610727565b84611710565b50505050565b5f805f805f610959611401565b6001600160401b0388165f90815260018201602090815260408083206001600160a01b038b1684529091529020805465ffffffffffff81169750919250906109b090600160301b90046001600160701b031661196a565b979a9199509750945050505050565b6109c76112fe565b610783828261198b565b5f806109db611401565b5f84815260028201602052604090205490915065ffffffffffff166109ff81611a3b565b610a095780610a0b565b5f5b949350505050565b5f80610a1d611401565b5f93845260020160205250506040902054600160301b900463ffffffff1690565b5f80610a48611401565b6001600160a01b0384165f9081526020829052604090206001015490915061076a906001600160701b0316611425565b610a806112fe565b6107838282611a69565b5f80610a94611401565b6001600160401b039384165f908152600191820160205260409020015490921692915050565b5f80610ac4611401565b6001600160a01b0385165f908152602091825260408082206001600160e01b03198716835290925220546001600160401b03169150505b92915050565b610b096112fe565b6001600160401b0383161580610b2757506001600160401b03838116145b15610b505760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610b8b92919061298c565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610bd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfb919061299f565b6001600160e01b03191614610c2e57604051630641fee960e31b81526001600160a01b0382166004820152602401610864565b6106e9610c3d85838686610c8b565b61151d565b5f80610c4c611401565b6001600160a01b039093165f9081526020939093525050604090206001015460ff600160701b9091041690565b610c816112fe565b6107838282611b27565b5f84848484604051602001610ca394939291906129ba565b604051602081830303815290604052805190602001209050949350505050565b604080515f815260208101909152606090826001600160401b03811115610cec57610cec612a21565b604051908082528060200260200182016040528015610d1f57816020015b6060815260200190600190039081610d0a5790505b5091505f5b83811015610da057610d7b30868684818110610d4257610d42612935565b9050602002810190610d549190612a35565b85604051602001610d6793929190612a77565b604051602081830303815290604052611c51565b838281518110610d8d57610d8d612935565b6020908102919091010152600101610d24565b505092915050565b5f80610db384610c42565b15610dc257505f905080610e21565b306001600160a01b03861603610de657610ddc8484611cc3565b5f91509150610e21565b5f610df18585610aba565b90505f80610dff8389610f4b565b9150915081610e0f575f80610e19565b63ffffffff811615815b945094505050505b935093915050565b610e316112fe565b610e3b8282611ce7565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610e845750825b90505f826001600160401b03166001148015610e9f5750303b155b905081158015610ead575080155b15610ecb5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ef557845460ff60401b1916600160401b1785555b610efe86611de2565b83156107e157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b5f8067fffffffffffffffe196001600160401b03851601610f715750600190505f610fbd565b5f80610f7d868661094c565b5050915091508165ffffffffffff165f14158015610fb25750610f9e611df6565b65ffffffffffff168265ffffffffffff1611155b93509150610fbd9050565b9250929050565b610fcc6112fe565b6107838282611e05565b5f80610fe0611401565b9050335f610fee8686611506565b90505f610ffd89898989610c8b565b5f81815260028601602052604081205491925065ffffffffffff909116900361103c5760405163060a299b60e41b815260048101829052602401610864565b826001600160a01b0316896001600160a01b0316146110d5575f6110605f85610f4b565b5090505f61107a6110746102258c87610aba565b86610f4b565b50905081158015611089575080155b156110d257604051630ff89d4760e21b81526001600160a01b038087166004830152808d1660248301528b1660448201526001600160e01b031985166064820152608401610864565b50505b5f818152600285016020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a39998505050505050505050565b5f805f611144611401565b9050335f611154828a8a8a6114b5565b9150505f8163ffffffff16611167611df6565b6111719190612a9c565b905063ffffffff821615806111a757505f8765ffffffffffff161180156111a757508065ffffffffffff168765ffffffffffff16105b156111b857828a61082b8b8b611506565b6111d28765ffffffffffff168265ffffffffffff16611ecd565b96506111e0838b8b8b610c8b565b95506111eb86611edc565b836002015f8781526020019081526020015f205f0160069054906101000a900463ffffffff16600101945086846002015f8881526020019081526020015f205f015f6101000a81548165ffffffffffff021916908365ffffffffffff16021790555084846002015f8881526020019081526020015f205f0160066101000a81548163ffffffff021916908363ffffffff1602179055508463ffffffff16867f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b489868e8e8e6040516112c0959493929190612ac2565b60405180910390a35050505094509492505050565b6001600160a01b0381163314610e3157604051635f159e6360e01b815260040160405180910390fd5b335f8061130c838236611f36565b9150915081610e3b578063ffffffff165f03611366575f61132d8136611ff9565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b03821660248201529092506044019050610864565b610946610c3d84305f36610c8b565b5f61137e611401565b6001600160a01b0385165f818152602083815260408083206001600160e01b0319891680855290835292819020805467ffffffffffffffff19166001600160401b03891690811790915590519283529394507f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a350505050565b7f40c6c8c28789853c7efd823ab20824bbd71718a8a5915e855f6f288c9a26ad0090565b5f80611439836001600160701b031661196a565b5090949350505050565b5f61144c611401565b6001600160a01b0384165f81815260208390526040908190206001018054861515600160701b0260ff60701b1990911617905551919250907f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb13890610b8b90851515815260200190565b5f80306001600160a01b038616036114db576114d2868585611f36565b915091506114fd565b600483106114f7576114f286866105758787611506565b6114d2565b505f9050805b94509492505050565b5f61151460048284866129fa565b61076a91612b07565b5f80611527611401565b5f84815260028201602052604081205491925065ffffffffffff821691600160301b900463ffffffff16908290036115755760405163060a299b60e41b815260048101869052602401610864565b61157d611df6565b65ffffffffffff168265ffffffffffff1611156115b057604051630c65b5bd60e11b815260048101869052602401610864565b6115b982611a3b565b156115da57604051631e2975b960e21b815260048101869052602401610864565b5f858152600284016020526040808220805465ffffffffffff191690555163ffffffff83169187917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a3949350505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b60608147101561169c5760405163cf47918160e01b815247600482015260248101839052604401610864565b5f80856001600160a01b031684866040516116b79190612b35565b5f6040518083038185875af1925050503d805f81146116f1576040519150601f19603f3d011682016040523d82523d5f602084013e6116f6565b606091505b50915091506117068683836121c3565b9695505050505050565b5f8061171a611401565b905067fffffffffffffffe196001600160401b038716016117595760405163061c6a4360e21b81526001600160401b0387166004820152602401610864565b6001600160401b0386165f90815260018201602090815260408083206001600160a01b038916845290915281205465ffffffffffff161590811561184d578563ffffffff166117a6611df6565b6117b09190612a9c565b905060405180604001604052808265ffffffffffff1681526020016117de8763ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b038a165f90815260018601602090815260408083206001600160a01b038d1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff909116179190911790556118fb565b6001600160401b0388165f90815260018401602090815260408083206001600160a01b038b16845290915281205461189891600160301b9091046001600160701b031690879061221f565b6001600160401b038a165f90815260018601602090815260408083206001600160a01b038d168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8716815265ffffffffffff831660208201528315158183015290516001600160a01b038916916001600160401b038b16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a3509695505050505050565b5f805f61197e84611979611df6565b6122c5565b9250925092509193909250565b5f611994611401565b90506001600160401b03831615806119b457506001600160401b03838116145b156119dd5760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b038381165f81815260018481016020526040808320909101805467ffffffffffffffff19169487169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a3505050565b5f611a44611df6565b65ffffffffffff16611a5962093a8084612a9c565b65ffffffffffff16111592915050565b5f611a72611401565b90506001600160401b0383161580611a9257506001600160401b03838116145b15611abb5760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b038381165f8181526001848101602052604080832090910180546fffffffffffffffff00000000000000001916600160401b958816958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a3505050565b5f611b30611401565b905067fffffffffffffffe196001600160401b03841601611b6f5760405163061c6a4360e21b81526001600160401b0384166004820152602401610864565b6001600160401b0383165f9081526001828101602052604082200154611ba990600160801b90046001600160701b0316846206978061221f565b6001600160401b0386165f81815260018087016020526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890611c43908690859063ffffffff92909216825265ffffffffffff16602082015260400190565b60405180910390a250505050565b60605f80846001600160a01b031684604051611c6d9190612b35565b5f60405180830381855af49150503d805f8114611ca5576040519150601f19603f3d011682016040523d82523d5f602084013e611caa565b606091505b5091509150611cba8583836121c3565b95945050505050565b5f80611ccd611401565b9050611cd9848461162e565b600390910154149392505050565b5f80611cf1611401565b905067fffffffffffffffe196001600160401b03851601611d305760405163061c6a4360e21b81526001600160401b0385166004820152602401610864565b6001600160401b0384165f90815260018201602090815260408083206001600160a01b038716845290915281205465ffffffffffff169003611d75575f915050610afb565b6001600160401b0384165f81815260018301602090815260408083206001600160a01b038816808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a35060019392505050565b611dea612311565b611df38161235c565b50565b5f611e0042612399565b905090565b5f611e0e611401565b90505f611e4483620697806001600160a01b0387165f908152602086905260409020600101546001600160701b0316919061221f565b6001600160a01b0386165f818152602086815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8816815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101611c43565b5f82821882841102821861076a565b5f611ee5611401565b5f83815260028201602052604090205490915065ffffffffffff168015801590611f155750611f1381611a3b565b155b15610e3b5760405163813e945960e01b815260048101849052602401610864565b5f806004831015611f4b57505f905080610e21565b306001600160a01b03861603611f6e57610ddc30611f698686611506565b611cc3565b5f805f611f7b8787611ff9565b92509250925082158015611f935750611f9330610c42565b15611fa6575f8094509450505050610e21565b5f80611fb2848b610f4b565b9150915081611fcb575f80965096505050505050610e21565b611fe18363ffffffff168263ffffffff16611ecd565b63ffffffff8116159b909a5098505050505050505050565b5f8080600484101561201257505f9150819050806121bc565b5f61201d8686611506565b90506001600160e01b031981166310a6aa3760e31b148061204e57506001600160e01b031981166330cae18760e01b145b8061206957506001600160e01b0319811663294b14a960e11b145b8061208457506001600160e01b03198116635326cae760e11b145b8061209f57506001600160e01b0319811663d22b598960e01b145b156120b45760015f80935093509350506121bc565b6001600160e01b0319811663063fc60f60e21b14806120e357506001600160e01b0319811663167bd39560e01b145b806120fe57506001600160e01b031981166308d6122d60e01b145b1561213d575f61211260246004888a6129fa565b81019061211f919061268d565b90505f61212b82610a3e565b600196505f955093506121bc92505050565b6001600160e01b0319811663012e238d60e51b148061216c57506001600160e01b03198116635be958b160e11b145b156121a8575f61218060246004888a6129fa565b81019061218d91906124c9565b9050600161219a82610a8a565b5f94509450945050506121bc565b5f6121b33083610aba565b5f935093509350505b9250925092565b6060826121d8576121d3826123cf565b61076a565b81511580156121ef57506001600160a01b0384163b155b1561221857604051639996b31560e01b81526001600160a01b0385166004820152602401610864565b508061076a565b5f805f612234866001600160701b0316611425565b90505f61226f8563ffffffff168763ffffffff168463ffffffff161161225a575f612264565b6122648885612b50565b63ffffffff16611ecd565b90508063ffffffff16612280611df6565b61228a9190612a9c565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b69ffffffffffffffffffff602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561230057828282612304565b815f805b9250925092509250925092565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661235a57604051631afcd79f60e31b815260040160405180910390fd5b565b612364612311565b6001600160a01b03811661238d57604051630409d6d160e11b81525f6004820152602401610864565b6107835f825f80611710565b5f65ffffffffffff8211156123cb576040516306dfcc6560e41b81526030600482015260248101839052604401610864565b5090565b8051156123df5780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6001600160a01b0381168114611df3575f80fd5b5f8083601f84011261241c575f80fd5b5081356001600160401b03811115612432575f80fd5b6020830191508360208260051b8501011115610fbd575f80fd5b80356001600160401b0381168114612462575f80fd5b919050565b5f805f806060858703121561247a575f80fd5b8435612485816123f8565b935060208501356001600160401b0381111561249f575f80fd5b6124ab8782880161240c565b90945092506124be90506040860161244c565b905092959194509250565b5f602082840312156124d9575f80fd5b61076a8261244c565b5f80604083850312156124f3575f80fd5b82356124fe816123f8565b915060208301358015158114612512575f80fd5b809150509250929050565b5f806040838503121561252e575f80fd5b8235612539816123f8565b91506020830135612512816123f8565b5f8083601f840112612559575f80fd5b5081356001600160401b0381111561256f575f80fd5b602083019150836020828501011115610fbd575f80fd5b5f805f60408486031215612598575f80fd5b83356125a3816123f8565b925060208401356001600160401b038111156125bd575f80fd5b6125c986828701612549565b9497909650939450505050565b803563ffffffff81168114612462575f80fd5b5f805f606084860312156125fb575f80fd5b6126048461244c565b92506020840135612614816123f8565b9150612622604085016125d6565b90509250925092565b5f806040838503121561263c575f80fd5b6125398361244c565b5f8060408385031215612656575f80fd5b61265f8361244c565b915061266d6020840161244c565b90509250929050565b5f60208284031215612686575f80fd5b5035919050565b5f6020828403121561269d575f80fd5b813561076a816123f8565b6001600160e01b031981168114611df3575f80fd5b5f80604083850312156126ce575f80fd5b82356126d9816123f8565b91506020830135612512816126a8565b5f805f604084860312156126fb575f80fd5b6125a38461244c565b5f8060408385031215612715575f80fd5b61271e8361244c565b915061266d602084016125d6565b5f805f806060858703121561273f575f80fd5b843561274a816123f8565b9350602085013561275a816123f8565b925060408501356001600160401b03811115612774575f80fd5b61278087828801612549565b95989497509550505050565b5f806020838503121561279d575f80fd5b82356001600160401b038111156127b2575f80fd5b6127be8582860161240c565b90969095509350505050565b5f5b838110156127e45781810151838201526020016127cc565b50505f910152565b5f602080830181845280855180835260408601915060408160051b87010192508387015f5b8281101561285757878503603f1901845281518051808752612838818989018a85016127ca565b601f01601f191695909501860194509285019290850190600101612811565b5092979650505050505050565b5f805f60608486031215612876575f80fd5b8335612881816123f8565b92506020840135612891816123f8565b915060408401356128a1816126a8565b809150509250925092565b5f80604083850312156128bd575f80fd5b823561271e816123f8565b5f805f80606085870312156128db575f80fd5b84356128e6816123f8565b935060208501356001600160401b03811115612900575f80fd5b61290c87828801612549565b909450925050604085013565ffffffffffff8116811461292a575f80fd5b939692955090935050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612959575f80fd5b813561076a816126a8565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610a0b602083018486612964565b5f602082840312156129af575f80fd5b815161076a816126a8565b6001600160a01b038581168252841660208201526060604082018190525f906117069083018486612964565b634e487b7160e01b5f52601160045260245ffd5b5f8085851115612a08575f80fd5b83861115612a14575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f808335601e19843603018112612a4a575f80fd5b8301803591506001600160401b03821115612a63575f80fd5b602001915036819003821315610fbd575f80fd5b828482375f8382015f81528351612a928183602088016127ca565b0195945050505050565b65ffffffffffff818116838216019080821115612abb57612abb6129e6565b5092915050565b65ffffffffffff861681526001600160a01b038581166020830152841660408201526080606082018190525f90612afc9083018486612964565b979650505050505050565b6001600160e01b03198135818116916004851015610da05760049490940360031b84901b1690921692915050565b5f8251612b468184602087016127ca565b9190910192915050565b63ffffffff828116828216039080821115612abb57612abb6129e656fea2646970667358221220cd485ec3fa51ca0596f44e3fb5af8981eace0866833e374e01e0e54c36e1e7a164736f6c63430008180033", "deployedBytecode": "0x6080604052600436106101e6575f3560e01c80636d5115bd11610108578063b70096131161009d578063d1f856ee1161006d578063d1f856ee146105e9578063d22b598914610608578063d6bb62c614610627578063f801a69814610646578063fe0776f51461067f575f80fd5b8063b70096131461055b578063b7d2b16214610596578063c4d66de8146105b5578063cc1b6c81146105d4575f80fd5b8063a166aa89116100d8578063a166aa89146104b4578063a64d95ce146104e3578063abd9bd2a14610502578063ac9650d81461052f575f80fd5b80636d5115bd1461044457806375b238fc14610463578063853551b81461047657806394c7d7ee14610495575f80fd5b806330cae1871161017e5780634665096d1161014e5780634665096d146103d25780634c1da1e2146103e75780635296295214610406578063530dd45614610425575f80fd5b806330cae187146103445780633adc277a146103635780633ca7c02a146103995780634136a33c146103b3575f80fd5b806318ff183c116101b957806318ff183c1461029a5780631cff79cd146102b957806325c471a0146102cc5780633078f114146102eb575f80fd5b806308d6122d146101ea5780630b0a93ba1461020b57806312be872714610247578063167bd3951461027b575b5f80fd5b3480156101f5575f80fd5b50610209610204366004612467565b61069e565b005b348015610216575f80fd5b5061022a6102253660046124c9565b6106f0565b6040516001600160401b0390911681526020015b60405180910390f35b348015610252575f80fd5b506102666102613660046124c9565b610727565b60405163ffffffff909116815260200161023e565b348015610286575f80fd5b506102096102953660046124e2565b610771565b3480156102a5575f80fd5b506102096102b436600461251d565b610787565b6102666102c7366004612586565b6107e9565b3480156102d7575f80fd5b506102096102e63660046125e9565b61092a565b3480156102f6575f80fd5b5061030a61030536600461262b565b61094c565b60405161023e949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b34801561034f575f80fd5b5061020961035e366004612645565b6109bf565b34801561036e575f80fd5b5061038261037d366004612676565b6109d1565b60405165ffffffffffff909116815260200161023e565b3480156103a4575f80fd5b5061022a6001600160401b0381565b3480156103be575f80fd5b506102666103cd366004612676565b610a13565b3480156103dd575f80fd5b5062093a80610266565b3480156103f2575f80fd5b5061026661040136600461268d565b610a3e565b348015610411575f80fd5b50610209610420366004612645565b610a78565b348015610430575f80fd5b5061022a61043f3660046124c9565b610a8a565b34801561044f575f80fd5b5061022a61045e3660046126bd565b610aba565b34801561046e575f80fd5b5061022a5f81565b348015610481575f80fd5b506102096104903660046126e9565b610b01565b3480156104a0575f80fd5b506102096104af366004612586565b610b98565b3480156104bf575f80fd5b506104d36104ce36600461268d565b610c42565b604051901515815260200161023e565b3480156104ee575f80fd5b506102096104fd366004612704565b610c79565b34801561050d575f80fd5b5061052161051c