UNPKG

@ensuro/account-abstraction

Version:

ERC-4337 related contracts by the Ensuro Team

1,391 lines 85.4 kB
{ "_format": "hh-sol-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": [], "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": [], "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": "0x60a060405234801561000f575f5ffd5b5060405161394a38038061394a83398101604081905261002e91610466565b806001600160a01b03811661005d57604051630409d6d160e11b81525f60048201526024015b60405180910390fd5b6100695f82818061007d565b5050506001600160a01b03166080526104ec565b5f6002600160401b03196001600160401b038616016100ba5760405163061c6a4360e21b81526001600160401b0386166004820152602401610054565b6001600160401b0385165f9081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff16159081156101af5763ffffffff85166101056102c3565b61010f91906104b2565b905060405180604001604052808265ffffffffffff16815260200161013f8663ffffffff166102d260201b60201c565b6001600160701b039081169091526001600160401b0389165f9081526001602090815260408083206001600160a01b038c16845282529091208351815494909201519092166601000000000000026001600160a01b031990931665ffffffffffff90911617919091179055610255565b6001600160401b0387165f9081526001602090815260408083206001600160a01b038a1684529091528120546101fb9166010000000000009091046001600160701b03169086906102db565b6001600160401b0389165f9081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316660100000000000002600160301b600160a01b03199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b5f6102cd42610381565b905090565b63ffffffff1690565b5f80806102f06001600160701b0387166103b7565b90505f61032b8563ffffffff168763ffffffff168463ffffffff1611610316575f610320565b61032088856104d0565b63ffffffff166103d5565b905063ffffffff811661033c6102c3565b61034691906104b2565b925063ffffffff8616602083901b67ffffffff0000000016604085901b6dffffffffffff000000000000000016171793505050935093915050565b5f65ffffffffffff8211156103b3576040516306dfcc6560e41b81526030600482015260248101839052604401610054565b5090565b5f806103cb6001600160701b0384166103e5565b5090949350505050565b8082118183180281185b92915050565b5f80806103f9846103f46102c3565b610406565b9250925092509193909250565b6001600160501b03602083901c166001600160701b03831665ffffffffffff604085901c811690841681111561043e57828282610442565b815f5f5b9250925092509250925092565b6001600160a01b0381168114610463575f5ffd5b50565b5f5f60408385031215610477575f5ffd5b82516104828161044f565b60208401519092506104938161044f565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b65ffffffffffff81811683821601908111156103df576103df61049e565b63ffffffff82811682821603908111156103df576103df61049e565b6080516134236105275f395f818161065e01528181610b4701528181610c1b0152818161102e015281816110c301526115d701526134235ff3fe60806040526004361061022b575f3560e01c80636d5115bd11610129578063b7009613116100a8578063d1f856ee1161006d578063d1f856ee1461073e578063d22b59891461075d578063d6bb62c61461077c578063f801a6981461079b578063fe0776f5146107d4575f5ffd5b8063b7009613146106a7578063b7d2b162146106e2578063c399ec8814610701578063cc1b6c8114610715578063d087d2881461072a575f5ffd5b8063a64d95ce116100ee578063a64d95ce146105db578063abd9bd2a146105fa578063ac9650d814610619578063b0d691fe14610645578063b61d27f614610688575f5ffd5b80636d5115bd1461053c57806375b238fc1461055b578063853551b81461056e57806394c7d7ee1461058d578063a166aa89146105ac575f5ffd5b806330cae187116101b55780634a58db191161017a5780634a58db191461049c5780634c1da1e2146104a45780634d44560d146104c357806352962952146104e2578063530dd45614610501575f5ffd5b806330cae187146103e05780633adc277a146103ff5780633ca7c02a146104355780634136a33c1461044f5780634665096d14610487575f5ffd5b806318ff183c116101fb57806318ff183c1461030957806319822f7c146103285780631cff79cd1461035557806325c471a0146103685780633078f11414610387575f5ffd5b806308d6122d146102365780630b0a93ba1461025757806312be8727146102b6578063167bd395146102ea575f5ffd5b3661023257005b5f5ffd5b348015610241575f5ffd5b50610255610250366004612afa565b6107f3565b005b348015610262575f5ffd5b50610299610271366004612b5c565b6001600160401b039081165f9081526001602081905260409091200154600160401b90041690565b6040516001600160401b0390911681526020015b60405180910390f35b3480156102c1575f5ffd5b506102d56102d0366004612b5c565b610845565b60405163ffffffff90911681526020016102ad565b3480156102f5575f5ffd5b50610255610304366004612b75565b61087f565b348015610314575f5ffd5b50610255610323366004612bb0565b610895565b348015610333575f5ffd5b50610347610342366004612bdc565b6108f8565b6040519081526020016102ad565b6102d5610363366004612c67565b61091d565b348015610373575f5ffd5b50610255610382366004612cca565b610a47565b348015610392575f5ffd5b506103a66103a1366004612d0c565b610a69565b6040516102ad949392919065ffffffffffff948516815263ffffffff93841660208201529190921660408201529116606082015260800190565b3480156103eb575f5ffd5b506102556103fa366004612d26565b610b02565b34801561040a575f5ffd5b5061041e610419366004612d57565b610b14565b60405165ffffffffffff90911681526020016102ad565b348015610440575f5ffd5b506102996001600160401b0381565b34801561045a575f5ffd5b506102d5610469366004612d57565b5f90815260026020526040902054600160301b900463ffffffff1690565b348015610492575f5ffd5b5062093a806102d5565b610255610b45565b3480156104af575f5ffd5b506102d56104be366004612d6e565b610bba565b3480156104ce575f5ffd5b506102556104dd366004612d89565b610be7565b3480156104ed575f5ffd5b506102556104fc366004612d26565b610c4a565b34801561050c575f5ffd5b5061029961051b366004612b5c565b6001600160401b039081165f90815260016020819052604090912001541690565b348015610547575f5ffd5b50610299610556366004612dc8565b610c5c565b348015610566575f5ffd5b506102995f81565b348015610579575f5ffd5b50610255610588366004612df4565b610c96565b348015610598575f5ffd5b506102556105a7366004612c67565b610d2d565b3480156105b7575f5ffd5b506105cb6105c6366004612d6e565b610dd7565b60405190151581526020016102ad565b3480156105e6575f5ffd5b506102556105f5366004612e0f565b610dfe565b348015610605575f5ffd5b50610347610614366004612e37565b610e10565b348015610624575f5ffd5b50610638610633366004612e97565b610e49565b6040516102ad9190612f03565b348015610650575f5ffd5b506040516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681526020016102ad565b348015610693575f5ffd5b506102556106a2366004612f66565b610f2e565b3480156106b2575f5ffd5b506106c66106c1366004612fa5565b610f77565b60408051921515835263ffffffff9091166020830152016102ad565b3480156106ed575f5ffd5b506102556106fc366004612d0c565b610ff8565b34801561070c575f5ffd5b5061034761100f565b348015610720575f5ffd5b50620697806102d5565b348015610735575f5ffd5b5061034761109d565b348015610749575f5ffd5b506106c6610758366004612d0c565b6110f2565b348015610768575f5ffd5b50610255610777366004612fed565b611176565b348015610787575f5ffd5b506102d5610796366004612e37565b611188565b3480156107a6575f5ffd5b506107ba6107b5366004613009565b6112db565b6040805192835263ffffffff9091166020830152016102ad565b3480156107df575f5ffd5b506102556107ee366004612d0c565b61141c565b6107fb611445565b5f5b8281101561083e576108368585858481811061081b5761081b613076565b9050602002016020810190610830919061308a565b846114bc565b6001016107fd565b5050505050565b6001600160401b0381165f9081526001602081905260408220015461087990600160801b90046001600160701b031661153d565b92915050565b610887611445565b610891828261155b565b5050565b61089d611445565b604051637a9e5e4b60e01b81526001600160a01b038281166004830152831690637a9e5e4b906024015b5f604051808303815f87803b1580156108de575f5ffd5b505af11580156108f0573d5f5f3e3d5ffd5b505050505050565b5f6109016115cc565b61090b8484611646565b9050610916826117e1565b9392505050565b5f33818061092d8388888861182a565b9150915081158015610943575063ffffffff8116155b15610996578287610954888861187b565b6040516381c6f24b60e01b81526001600160a01b0393841660048201529290911660248301526001600160e01b03191660448201526064015b60405180910390fd5b5f6109a384898989610e10565b90505f63ffffffff83161515806109c957506109be82610b14565b65ffffffffffff1615155b156109da576109d782611892565b90505b6003546109f08a6109eb8b8b61187b565b611990565b600381905550610a378a8a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152503492506119d2915050565b5060035598975050505050505050565b610a4f611445565b610a638383610a5d86610845565b84611a72565b50505050565b6001600160401b0382165f9081526001602090815260408083206001600160a01b03851684529091528120805465ffffffffffff1691908190819060ff825c1615610ad5578054610ac990600160301b90046001600160701b0316611cb8565b91955093509150610af8565b8054610af090600160301b90046001600160701b0316611cd9565b919550935091505b5092959194509250565b610b0a611445565b6108918282611ced565b5f8181526002602052604081205465ffffffffffff16610b3381611d90565b610b3d5780610916565b5f9392505050565b7f000000000000000000000000000000000000000000000000000000000000000060405163b760faf960e01b81523060048201526001600160a01b03919091169063b760faf99034906024015f604051808303818588803b158015610ba8575f5ffd5b505af115801561083e573d5f5f3e3d5ffd5b6001600160a01b0381165f90815260208190526040812060010154610879906001600160701b031661153d565b610bf4335f366001611dbe565b5060405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c2878906044016108c7565b610c52611445565b6108918282611e75565b6001600160a01b0382165f908152602081815260408083206001600160e01b0319851684529091529020546001600160401b031692915050565b610c9e611445565b6001600160401b0383161580610cbc57506001600160401b03838116145b15610ce55760405163061c6a4360e21b81526001600160401b038416600482015260240161098d565b826001600160401b03167f1256f5b5ecb89caec12db449738f2fbcd1ba5806cf38f35413f4e5c15bf6a4508383604051610d209291906130cd565b60405180910390a2505050565b60408051638fb3603760e01b80825291513392918391638fb36037916004808201926020929091908290030181865afa158015610d6c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d9091906130e0565b6001600160e01b03191614610dc357604051630641fee960e31b81526001600160a01b038216600482015260240161098d565b61083e610dd285838686610e10565b611892565b6001600160a01b03165f90815260208190526040902060010154600160701b900460ff1690565b610e06611445565b6108918282611f26565b5f84848484604051602001610e2894939291906130fb565b6040516020818303038152906040528051906020012090505b949350505050565b604080515f815260208101909152606090826001600160401b03811115610e7257610e72613175565b604051908082528060200260200182016040528015610ea557816020015b6060815260200190600190039081610e905790505b5091505f5b83811015610f2657610f0130868684818110610ec857610ec8613076565b9050602002810190610eda9190613189565b85604051602001610eed939291906131e2565b604051602081830303815290604052612035565b838281518110610f1357610f13613076565b6020908102919091010152600101610eaa565b505092915050565b610f366115cc565b61083e8483838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892506119d2915050565b5f5f610f8284610dd7565b15610f9157505f905080610ff0565b306001600160a01b03861603610fb557610fab84846120a7565b5f91509150610ff0565b5f610fc08585610c5c565b90505f5f610fce83896110f2565b9150915081610fde575f5f610fe8565b63ffffffff811615815b945094505050505b935093915050565b611000611445565b61100a82826120bd565b505050565b6040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa158015611074573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109891906131f7565b905090565b604051631aab3f0d60e11b81523060048201525f60248201819052906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401611059565b5f8067fffffffffffffffe196001600160401b038516016111185750600190505f61116f565b5f5f6111248686610a69565b5050915091508165ffffffffffff165f14158015611164575060ff5f5c168061116457506111506121a6565b65ffffffffffff168265ffffffffffff1611155b9350915061116f9050565b9250929050565b61117e611445565b61089182826121b0565b5f3381611195858561187b565b90505f6111a488888888610e10565b5f8181526002602052604081205491925065ffffffffffff90911690036111e15760405163060a299b60e41b81526004810182905260240161098d565b826001600160a01b0316886001600160a01b03161461127a575f6112055f856110f2565b5090505f61121f6112196102718b87610c5c565b866110f2565b5090508115801561122e575080155b1561127757604051630ff89d4760e21b81526001600160a01b038087166004830152808c1660248301528a1660448201526001600160e01b03198516606482015260840161098d565b50505b5f81815260026020526040808220805465ffffffffffff1916908190559051600160301b90910463ffffffff1691829184917fbd9ac67a6e2f6463b80927326310338bcbb4bdb7936ce1365ea3e01067e7b9f791a398975050505050505050565b5f8033816112eb8289898961182a565b9150505f8163ffffffff166112fe6121a6565b611308919061320e565b905063ffffffff8216158061133e57505f8665ffffffffffff1611801561133e57508065ffffffffffff168665ffffffffffff16105b1561134f5782896109548a8a61187b565b6113698665ffffffffffff168265ffffffffffff1661226b565b9550611377838a8a8a610e10565b94506113828561227a565b5f8581526002602052604090819020805465ffffffffffff891669ffffffffffffffffffff19821617600160301b9182900463ffffffff90811660010190811692830291909117909255915190955086907f82a2da5dee54ea8021c6545b4444620291e07ee83be6dd57edb175062715f3b490611408908a9088908f908f908f9061322c565b60405180910390a350505094509492505050565b6001600160a01b038116331461100057604051635f159e6360e01b815260040160405180910390fd5b335f806114538382366122c6565b915091508161100a578063ffffffff165f036114ad575f6114748136612389565b5060405163f07e038f60e01b81526001600160a01b03871660048201526001600160401b0382166024820152909250604401905061098d565b610a63610dd284305f36610e10565b6001600160a01b0383165f818152602081815260408083206001600160e01b0319871680855290835292819020805467ffffffffffffffff19166001600160401b038716908117909155905192835292917f9ea6790c7dadfd01c9f8b9762b3682607af2c7e79e05a9f9fdf5580dde949151910160405180910390a3505050565b5f5f611551836001600160701b0316611cd9565b5090949350505050565b6001600160a01b0382165f81815260208190526040908190206001018054841515600160701b0260ff60701b19909116179055517f90d4e7bb7e5d933792b3562e1741306f8be94837e1348dacef9b6f1df56eb138906115c090841515815260200190565b60405180910390a25050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116445760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e7400000000604482015260640161098d565b565b5f600160ff19825c168117825d505f6116626060850185613189565b611670916004915f9161314e565b61167991613271565b90506001600160e01b03198116635b0e93fb60e11b146116b85760405163d4d202fb60e01b81526001600160e01b03198216600482015260240161098d565b5f6116c66060860186613189565b6116d59160249160049161314e565b8101906116e29190612d6e565b9050306001600160a01b0382160361170d57604051637e6c446560e11b815260040160405180910390fd5b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c859052603c8120906117878261174e6101008a018a613189565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061256f92505050565b90506117a08161179a60608a018a613189565b5f611dbe565b6117b15760019450505050506117ce565b6117c7816117c260608a018a613189565b61258d565b9450505050505b5f60ff19815c16815d5092915050565b50565b80156117de576040515f9033905f1990849084818181858888f193505050503d805f811461083e576040519150601f19603f3d011682016040523d82523d5f602084013e61083e565b5f80306001600160a01b03861603611850576118478685856122c6565b91509150611872565b6004831061186c5761186786866106c1878761187b565b611847565b505f9050805b94509492505050565b5f611889600482848661314e565b61091691613271565b5f8181526002602052604081205465ffffffffffff811690600160301b900463ffffffff168183036118da5760405163060a299b60e41b81526004810185905260240161098d565b6118e26121a6565b65ffffffffffff168265ffffffffffff16111561191557604051630c65b5bd60e11b81526004810185905260240161098d565b61191e82611d90565b1561193f57604051631e2975b960e21b81526004810185905260240161098d565b5f84815260026020526040808220805465ffffffffffff191690555163ffffffff83169186917f76a2a46953689d4861a5d3f6ed883ad7e6af674a21f8e162707159fc9dde614d9190a39392505050565b604080516001600160a01b03939093166020808501919091526001600160e01b0319929092168382015280518084038201815260609093019052815191012090565b6060814710156119fe5760405163cf47918160e01b81524760048201526024810183905260440161098d565b5f5f856001600160a01b03168486604051611a1991906132a9565b5f6040518083038185875af1925050503d805f8114611a53576040519150601f19603f3d011682016040523d82523d5f602084013e611a58565b606091505b5091509150611a68868383612625565b9695505050505050565b5f67fffffffffffffffe196001600160401b03861601611ab05760405163061c6a4360e21b81526001600160401b038616600482015260240161098d565b6001600160401b0385165f9081526001602090815260408083206001600160a01b038816845290915281205465ffffffffffff1615908115611ba0578463ffffffff16611afb6121a6565b611b05919061320e565b905060405180604001604052808265ffffffffffff168152602001611b338663ffffffff1663ffffffff1690565b6001600160701b039081169091526001600160401b0389165f9081526001602090815260408083206001600160a01b038c1684528252909120835181549490920151909216600160301b026001600160a01b031990931665ffffffffffff90911617919091179055611c4a565b6001600160401b0387165f9081526001602090815260408083206001600160a01b038a168452909152812054611be991600160301b9091046001600160701b0316908690612681565b6001600160401b0389165f9081526001602090815260408083206001600160a01b038c168452909152902080546001600160701b03909316600160301b0273ffffffffffffffffffffffffffff000000000000199093169290921790915590505b6040805163ffffffff8616815265ffffffffffff831660208201528315158183015290516001600160a01b038816916001600160401b038a16917ff98448b987f1428e0e230e1f3c6e2ce15b5693eaf31827fbd0b1ec4b424ae7cf9181900360600190a35095945050505050565b5f5f5f611ccc84611cc7612727565b612736565b9250925092509193909250565b5f5f5f611ccc84611ce86121a6565b612788565b6001600160401b0382161580611d0b57506001600160401b03828116145b15611d345760405163061c6a4360e21b81526001600160401b038316600482015260240161098d565b6001600160401b038281165f818152600160208190526040808320909101805467ffffffffffffffff19169486169485179055517f1fd6dd7631312dfac2205b52913f99de03b4d7e381d5d27d3dbfe0713e6e63409190a35050565b5f611d996121a6565b65ffffffffffff16611dae62093a808461320e565b65ffffffffffff16111592915050565b5f8080611ddc8730611dd36004858a8c61314e565b6106c191613271565b9150915081611e685763ffffffff811615611e0a576040516399ec076b60e01b815260040160405180910390fd5b8315611e5e5786611e2b30611e2260045f8a8c61314e565b61055691613271565b60405163f07e038f60e01b81526001600160a01b0390921660048301526001600160401b0316602482015260440161098d565b5f92505050610e41565b5060019695505050505050565b6001600160401b0382161580611e9357506001600160401b03828116145b15611ebc5760405163061c6a4360e21b81526001600160401b038316600482015260240161098d565b6001600160401b038281165f81815260016020819052604080832090910180546fffffffffffffffff00000000000000001916600160401b958716958602179055517f7a8059630b897b5de4c08ade69f8b90c3ead1f8596d62d10b6c4d14a0afb4ae29190a35050565b67fffffffffffffffe196001600160401b03831601611f635760405163061c6a4360e21b81526001600160401b038316600482015260240161098d565b6001600160401b0382165f90815260016020819052604082200154611f9c90600160801b90046001600160701b03168362069780612681565b6001600160401b0385165f818152600160208190526040918290200180546001600160701b03909516600160801b026dffffffffffffffffffffffffffff60801b199095169490941790935591519092507ffeb69018ee8b8fd50ea86348f1267d07673379f72cffdeccec63853ee8ce8b4890610d20908590859063ffffffff92909216825265ffffffffffff16602082015260400190565b60605f5f846001600160a01b03168460405161205191906132a9565b5f60405180830381855af49150503d805f8114612089576040519150601f19603f3d011682016040523d82523d5f602084013e61208e565b606091505b509150915061209e858383612625565b95945050505050565b5f6120b28383611990565b600354149392505050565b5f67fffffffffffffffe196001600160401b038416016120fb5760405163061c6a4360e21b81526001600160401b038416600482015260240161098d565b6001600160401b0383165f9081526001602090815260408083206001600160a01b038616845290915281205465ffffffffffff16900361213c57505f610879565b6001600160401b0383165f8181526001602090815260408083206001600160a01b038716808552925280832080546001600160a01b0319169055519092917ff229baa593af28c41b1d16b748cd7688f0c83aaf92d4be41c44005defe84c16691a350600192915050565b5f611098426127d4565b6001600160a01b0382165f908152602081905260408120600101546121e2906001600160701b03168362069780612681565b6001600160a01b0385165f818152602081815260409182902060010180546dffffffffffffffffffffffffffff19166001600160701b039690961695909517909455805163ffffffff8716815265ffffffffffff841694810194909452919350917fa56b76017453f399ec2327ba00375dbfb1fd070ff854341ad6191e6a2e2de19c9101610d20565b5f828218828411028218610916565b5f8181526002602052604090205465ffffffffffff1680158015906122a557506122a381611d90565b155b156108915760405163813e945960e01b81526004810183905260240161098d565b5f8060048310156122db57505f905080610ff0565b306001600160a01b038616036122fe57610fab306122f9868661187b565b6120a7565b5f5f5f61230b8787612389565b92509250925082158015612323575061232330610dd7565b15612336575f5f94509450505050610ff056