UNPKG

@ensuro/account-abstraction

Version:

ERC-4337 related contracts by the Ensuro Team

1,437 lines 88.7 kB
{ "_format": "hh3-artifact-1", "contractName": "AccessManagerAccount", "sourceName": "contracts/AccessManagerAccount.sol", "abi": [ { "inputs": [ { "internalType": "contract IEntryPoint", "name": "anEntryPoint", "type": "address" }, { "internalType": "address", "name": "initialAdmin", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "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": "DelayNotAllowed", "type": "error" }, { "inputs": [], "name": "ECDSAInvalidSignature", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "length", "type": "uint256" } ], "name": "ECDSAInvalidSignatureLength", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "s", "type": "bytes32" } ], "name": "ECDSAInvalidSignatureS", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "index", "type": "uint256" }, { "internalType": "bytes", "name": "error", "type": "bytes" } ], "name": "ExecuteError", "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": [ { "internalType": "bytes4", "name": "receivedSelector", "type": "bytes4" } ], "name": "OnlyExecuteAllowedFromEntryPoint", "type": "error" }, { "inputs": [], "name": "OnlyExternalTargets", "type": "error" }, { "inputs": [ { "internalType": "uint8", "name": "bits", "type": "uint8" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "SafeCastOverflowedUintDowncast", "type": "error" }, { "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": [], "name": "addDeposit", "outputs": [], "stateMutability": "payable", "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": [], "name": "entryPoint", "outputs": [ { "internalType": "contract IEntryPoint", "name": "", "type": "address" } ], "stateMutability": "view", "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": [ { "internalType": "address", "name": "dest", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "func", "type": "bytes" } ], "name": "execute", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "address", "name": "target", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "internalType": "struct BaseAccount.Call[]", "name": "calls", "type": "tuple[]" } ], "name": "executeBatch", "outputs": [], "stateMutability": "nonpayable", "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": [], "name": "getDeposit", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "id", "type": "bytes32" } ], "name": "getNonce", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getNonce", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "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": "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" }, { "inputs": [ { "components": [ { "internalType": "address", "name": "sender", "type": "address" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "bytes", "name": "initCode", "type": "bytes" }, { "internalType": "bytes", "name": "callData", "type": "bytes" }, { "internalType": "bytes32", "name": "accountGasLimits", "type": "bytes32" }, { "internalType": "uint256", "name": "preVerificationGas", "type": "uint256" }, { "internalType": "bytes32", "name": "gasFees", "type": "bytes32" }, { "internalType": "bytes", "name": "paymasterAndData", "type": "bytes" }, { "internalType": "bytes", "name": "signature", "type": "bytes" } ], "internalType": "struct PackedUserOperation", "name": "userOp", "type": "tuple" }, { "internalType": "bytes32", "name": "userOpHash", "type": "bytes32" }, { "internalType": "uint256", "name": "missingAccountFunds", "type": "uint256" } ], "name": "validateUserOp", "outputs": [ { "internalType": "uint256", "name": "validationData", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address payable", "name": "withdrawAddress", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "withdrawDepositTo", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x60a060405234801561000f575f5ffd5b50604051613aef380380613aef83398101604081905261002e91610466565b806001600160a01b03811661005d57604051630409d6d160e11b81525f60048201526024015b60405180910390fd5b6100695f82818061007d565b5050506001600160a01b03166080526104ec565b5f6002600160401b03196001600160401b038616016100ba5760405163061c6a4360e21b81526001600160401b0386166004820152602401610054565b6001600160401b0385165f9081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff16159081156101af5763ffffffff85166101056102c3565b61010f91906104b2565b905060405180604001604052808265ffffffffffff16815260200161013f8663ffffffff166102d260201b60201c565b6001600160701b039081169091526001600160401b0389165f9081526001602090815260408083206001600160a01b038c16845282529091208351815494909201519092166601000000000000026001600160a01b031990931665ffffffffffff90911617919091179055610255565b6001600160401b0387165f9081526001602090815260408083206001600160a01b038a1684529091528120546101fb9166010000000000009091046001600160701b03169086906102db565b6001600160401b0389165f9081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316660100000000000002600160301b600160a01b03199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b5f6102cd42610381565b905090565b63ffffffff1690565b5f80806102f06001600160701b0387166103b7565b90505f61032b8563ffffffff168763ffffffff168463ffffffff1611610316575f610320565b61032088856104d0565b63ffffffff166103d5565b905063ffffffff811661033c6102c3565b61034691906104b2565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b5f65ffffffffffff8211156103b3576040516306dfcc6560e41b81526030600482015260248101839052604401610054565b5090565b5f806103cb6001600160701b0384166103e5565b5090949350505050565b8082118183180281185b92915050565b5f80806103f9846103f46102c3565b610406565b9250925092509193909250565b6001600160501b03602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561043e57828282610442565b815f5f5b9250925092509250925092565b6001600160a01b0381168114610463575f5ffd5b50565b5f5f60408385031215610477575f5ffd5b82516104828161044f565b60208401519092506104938161044f565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b65ffffffffffff81811683821601908111156103df576103df61049e565b63ffffffff82811682821603908111156103df576103df61049e565b6080516135c86105275f395f818161068801528181610c5201528181610d2601528181611139015281816111ce01526116e201526135c85ff3fe608060405260043610610236575f3560e01c80636d5115bd11610129578063b7009613116100a8578063d1f856ee1161006d578063d1f856ee14610768578063d22b598914610787578063d6bb62c6146107a6578063f801a698146107c5578063fe0776f5146107fe575f5ffd5b8063b7009613146106d1578063b7d2b1621461070c578063c399ec881461072b578063cc1b6c811461073f578063d087d28814610754575f5ffd5b8063a64d95ce116100ee578063a64d95ce14610605578063abd9bd2a14610624578063ac9650d814610643578063b0d691fe1461066f578063b61d27f6146106b2575f5ffd5b80636d5115bd1461056657806375b238fc14610585578063853551b81461059857806394c7d7ee146105b7578063a166aa89146105d6575f5ffd5b806334fcd5be116101b55780634a58db191161017a5780634a58db19146104c65780634c1da1e2146104ce5780634d44560d146104ed578063529629521461050c578063530dd4561461052b575f5ffd5b806334fcd5be1461040a5780633adc277a146104295780633ca7c02a1461045f5780634136a33c146104795780634665096d146104b1575f5ffd5b806319822f7c116101fb57806319822f7c146103335780631cff79cd1461036057806325c471a0146103735780633078f1141461039257806330cae187146103eb575f5ffd5b806308d6122d146102415780630b0a93ba1461026257806312be8727146102c1578063167bd395146102f557806318ff183c14610314575f5ffd5b3661023d57005b5f5ffd5b34801561024c575f5ffd5b5061026061025b366004612c6c565b61081d565b005b34801561026d575f5ffd5b506102a461027c366004612cce565b6001600160401b039081165f9081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b3480156102cc575f5ffd5b506102e06102db366004612cce565b61086f565b60405163ffffffff90911681526020016102b8565b348015610300575f5ffd5b5061026061030f366004612ce7565b6108a9565b34801561031f575f5ffd5b5061026061032e366004612d22565b6108bf565b34801561033e575f5ffd5b5061035261034d366004612d4e565b610922565b6040519081526020016102b8565b6102e061036e366004612dd9565b610947565b34801561037e575f5ffd5b5061026061038d366004612e3c565b610a71565b34801561039d575f5ffd5b506103b16103ac366004612e7e565b610a93565b6040516102b8949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b3480156103f6575f5ffd5b50610260610405366004612e98565b610b2c565b348015610415575f5ffd5b50610260610424366004612ec9565b610b3e565b348015610434575f5ffd5b50610448610443366004612f07565b610c1f565b60405165ffffffffffff90911681526020016102b8565b34801561046a575f5ffd5b506102a46001600160401b0381565b348015610484575f5ffd5b506102e0610493366004612f07565b5f90815260026020526040902054600160301b900463ffffffff1690565b3480156104bc575f5ffd5b5062093a806102e0565b610260610c50565b3480156104d9575f5ffd5b506102e06104e8366004612f1e565b610cc5565b3480156104f8575f5ffd5b50610260610507366004612f39565b610cf2565b348015610517575f5ffd5b50610260610526366004612e98565b610d55565b348015610536575f5ffd5b506102a4610545366004612cce565b6001600160401b039081165f90815260016020819052604090912001541690565b348015610571575f5ffd5b506102a4610580366004612f78565b610d67565b348015610590575f5ffd5b506102a45f81565b3480156105a3575f5ffd5b506102606105b2366004612fa4565b610da1565b3480156105c2575f5ffd5b506102606105d1366004612dd9565b610e38565b3480156105e1575f5ffd5b506105f56105f0366004612f1e565b610ee2565b60405190151581526020016102b8565b348015610610575f5ffd5b5061026061061f366004612fbf565b610f09565b34801561062f575f5ffd5b5061035261063e366004612fe7565b610f1b565b34801561064e575f5ffd5b5061066261065d366004612ec9565b610f54565b6040516102b89190613075565b34801561067a575f5ffd5b506040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681526020016102b8565b3480156106bd575f5ffd5b506102606106cc3660046130d8565b611039565b3480156106dc575f5ffd5b506106f06106eb366004613117565b611082565b60408051921515835263ffffffff9091166020830152016102b8565b348015610717575f5ffd5b50610260610726366004612e7e565b611103565b348015610736575f5ffd5b5061035261111a565b34801561074a575f5ffd5b50620697806102e0565b34801561075f575f5ffd5b506103526111a8565b348015610773575f5ffd5b506106f0610782366004612e7e565b6111fd565b348015610792575f5ffd5b506102606107a136600461315f565b611281565b3480156107b1575f5ffd5b506102e06107c0366004612fe7565b611293565b3480156107d0575f5ffd5b506107e46107df36600461317b565b6113e6565b6040805192835263ffffffff9091166020830152016102b8565b348015610809575f5ffd5b50610260610818366004612e7e565b611527565b610825611550565b5f5b828110156108685761086085858584818110610845576108456131e8565b905060200201602081019061085a91906131fc565b846115c7565b600101610827565b5050505050565b6001600160401b0381165f908152600160208190526040822001546108a390600160801b90046001600160701b0316611648565b92915050565b6108b1611550565b6108bb8282611666565b5050565b6108c7611550565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b906024015b5f604051808303815f87803b158015610908575f5ffd5b505af115801561091a573d5f5f3e3d5ffd5b505050505050565b5f61092b6116d7565b6109358484611751565b9050610940826118ec565b9392505050565b5f33818061095783888888611931565b915091508115801561096d575063ffffffff8116155b156109c057828761097e8888611982565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b5f6109cd84898989610f1b565b90505f63ffffffff83161515806109f357506109e882610c1f565b65ffffffffffff1615155b15610a0457610a0182611999565b90505b600354610a1a8a610a158b8b611982565b611a97565b600381905550610a618a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250349250611ad9915050565b5060035598975050505050505050565b610a79611550565b610a8d8383610a878661086f565b84611ba5565b50505050565b6001600160401b0382165f9081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff1691908190819060ff825c1615610aff578054610af390600160301b90046001600160701b0316611deb565b91955093509150610b22565b8054610b1a90600160301b90046001600160701b0316611e0c565b919550935091505b5092959194509250565b610b34611550565b6108bb8282611e20565b610b46611ec3565b805f5b81811015610a8d5736848483818110610b6457610b646131e8565b9050602002810190610b769190613217565b90505f610bd4610b896020840184612f1e565b6020840135610b9b6040860186613235565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050505a611ecb565b905080610c155783600103610bf057610beb611ee1565b610c15565b82610bfa5f611ef2565b604051635a15467560e01b81526004016109b7929190613277565b5050600101610b49565b5f8181526002602052604081205465ffffffffffff16610c3e81611f23565b610c485780610940565b5f9392505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b158015610cb3575f5ffd5b505af1158015610868573d5f5f3e3d5ffd5b6001600160a01b0381165f908152602081905260408120600101546108a3906001600160701b0316611648565b610cff335f366001611f51565b5060405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c2878906044016108f1565b610d5d611550565b6108bb8282612008565b6001600160a01b0382165f908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610da9611550565b6001600160401b0383161580610dc757506001600160401b03838116145b15610df05760405163061c6a4360e21b81526001600160401b03841660048201526024016109b7565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610e2b9291906132b7565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610e77573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9b91906132ca565b6001600160e01b03191614610ece57604051630641fee960e31b81526001600160a01b03821660048201526024016109b7565b610868610edd85838686610f1b565b611999565b6001600160a01b03165f90815260208190526040902060010154600160701b900460ff1690565b610f11611550565b6108bb82826120b9565b5f84848484604051602001610f3394939291906132e5565b6040516020818303038152906040528051906020012090505b949350505050565b604080515f815260208101909152606090826001600160401b03811115610f7d57610f7d613369565b604051908082528060200260200182016040528015610fb057816020015b6060815260200190600190039081610f9b5790505b5091505f5b838110156110315761100c30868684818110610fd357610fd36131e8565b9050602002810190610fe59190613235565b85604051602001610ff89392919061337d565b6040516020818303038152906040526121c8565b83828151811061101e5761101e6131e8565b6020908102919091010152600101610fb5565b505092915050565b6110416116d7565b6108688483838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250611ad9915050565b5f5f61108d84610ee2565b1561109c57505f9050806110fb565b306001600160a01b038616036110c0576110b6848461224a565b5f915091506110fb565b5f6110cb8585610d67565b90505f5f6110d983896111fd565b91509150816110e9575f5f6110f3565b63ffffffff811615815b945094505050505b935093915050565b61110b611550565b6111158282612260565b505050565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa15801561117f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111a391906133a0565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401611164565b5f8067fffffffffffffffe196001600160401b038516016112235750600190505f61127a565b5f5f61122f8686610a93565b5050915091508165ffffffffffff165f1415801561126f575060ff5f5c168061126f575061125b612349565b65ffffffffffff168265ffffffffffff1611155b9350915061127a9050565b9250929050565b611289611550565b6108bb8282612353565b5f33816112a08585611982565b90505f6112af88888888610f1b565b5f8181526002602052604081205491925065ffffffffffff90911690036112ec5760405163060a299b60e41b8152600481018290526024016109b7565b826001600160a01b0316886001600160a01b031614611385575f6113105f856111fd565b5090505f61132a61132461027c8b87610d67565b866111fd565b50905081158015611339575080155b1561138257604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b0319851660648201526084016109b7565b50505b5f81815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b5f8033816113f682898989611931565b9150505f8163ffffffff16611409612349565b61141391906133b7565b905063ffffffff8216158061144957505f8665ffffffffffff1611801561144957508065ffffffffffff168665ffffffffffff16105b1561145a57828961097e8a8a611982565b6114748665ffffffffffff168265ffffffffffff1661240e565b9550611482838a8a8a610f1b565b945061148d8561241d565b5f8581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b490611513908a9088908f908f908f906133d5565b60405180910390a350505094509492505050565b6001600160a01b038116331461110b57604051635f159e6360e01b815260040160405180910390fd5b335f8061155e838236612469565b9150915081611115578063ffffffff165f036115b8575f61157f813661252c565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b038216602482015290925060440190506109b7565b610a8d610edd84305f36610f1b565b6001600160a01b0383165f818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b5f5f61165c836001600160701b0316611e0c565b5090949350505050565b6001600160a01b0382165f81815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138906116cb90841515815260200190565b60405180910390a25050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461174f5760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016109b7565b565b5f600160ff19825c168117825d505f61176d6060850185613235565b61177b916004915f91613342565b6117849161341a565b90506001600160e01b03198116635b0e93fb60e11b146117c35760405163d4d202fb60e01b81526001600160e01b0319821660048201526024016109b7565b5f6117d16060860186613235565b6117e091602491600491613342565b8101906117ed9190612f1e565b9050306001600160a01b0382160361181857604051637e6c446560e11b815260040160405180910390fd5b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c859052603c812090611892826118596101008a018a613235565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061271292505050565b90506118ab816118a560608a018a613235565b5f611f51565b6118bc5760019450505050506118d9565b6118d2816118cd60608a018a613235565b612730565b9450505050505b5f60ff19815c16815d5092915050565b50565b80156118e9576040515f90339083908381818185875af1925050503d805f8114610868576040519150601f19603f3d011682016040523d82523d5f602084013e610868565b5f80306001600160a01b038616036119575761194e868585612469565b91509150611979565b600483106119735761196e86866106eb8787611982565b61194e565b505f9050805b94509492505050565b5f6119906004828486613342565b6109409161341a565b5f8181526002602052604081205465ffffffffffff811690600160301b900463ffffffff168183036119e15760405163060a299b60e41b8152600481018590526024016109b7565b6119e9612349565b65ffffffffffff168265ffffffffffff161115611a1c57604051630c65b5bd60e11b8152600481018590526024016109b7565b611a2582611f23565b15611a4657604051631e2975b960e21b8152600481018590526024016109b7565b5f84815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b606081471015611b055760405163cf47918160e01b8152476004820152602481018390526044016109b7565b5f611b118584866127c8565b9050808015611b3257505f3d1180611b3257505f856001600160a01b03163b115b15611b4757611b3f6127dd565b915050610940565b8015611b7157604051639996b31560e01b81526001600160a01b03861660048201526024016109b7565b3d15611b8457611b7f6127f6565b611b9d565b60405163d6bda27560e01b815260040160405180910390fd5b509392505050565b5f67fffffffffffffffe196001600160401b03861601611be35760405163061c6a4360e21b81526001600160401b03861660048201526024016109b7565b6001600160401b0385165f9081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff1615908115611cd3578463ffffffff16611c2e612349565b611c3891906133b7565b905060405180604001604052808265ffffffffffff168152602001611c668663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b0389165f9081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff90911617919091179055611d7d565b6001600160401b0387165f9081526001602090815260408083206001600160a01b038a168452909152812054611d1c91600160301b9091046001600160701b0316908690612801565b6001600160401b0389165f9081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b5f5f5f611dff84611dfa6128a7565b6128b6565b9250925092509193909250565b5f5f5f611dff84611e1b612349565b612908565b6001600160401b0382161580611e3e57506001600160401b03828116145b15611e675760405163061c6a4360e21b81526001600160401b03831660048201526024016109b7565b6001600160401b038281165f818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b61174f6116d7565b5f5f5f845160208601878987f195945050505050565b61174f611eed5f611ef2565b612954565b60603d8215611f065782811115611f065750815b604051602082018101604052818152815f602083013e9392505050565b5f611f2c612349565b65ffffffffffff16611f4162093a80846133b7565b65ffffffffffff16111592915050565b5f8080611f6f8730611f666004858a8c613342565b6106eb9161341a565b9150915081611ffb5763ffffffff811615611f9d576040516399ec076b60e01b815260040160405180910390fd5b8315611ff15786611fbe30611fb560045f8a8c613342565b6105809161341a565b60405163f07e038f60e01b81526001600160a01b0390921660048301526001600160401b031660248201526044016109b7565b5f92505050610f4c565b5060019695505050505050565b6001600160401b038216158061202657506001600160401b03828116145b1561204f5760405163061c6a4360e21b81526001600160401b03831660048201526024016109b7565b6001600160401b038281165f81815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b67fffffffffffffffe196001600160401b038316016120f65760405163061c6a4360e21b81526001600160401b03831660048201526024016109b7565b6001600160401b0382165f9081526001602081905260408220015461212f90600160801b90046001600160701b03168362069780612801565b60016001