- Contract name:
- SmartAccount
- Optimization enabled
- true
- Compiler version
- v0.8.17+commit.8df45f5f
- Optimization runs
- 800
- EVM Version
- default
- Verified at
- 2023-10-27T09:58:26.705331Z
Constructor Arguments
0x00000000000000000000000000000061fefce24a79343c27127435286bb7a4e1
Arg [0] (address) : 0x00000061fefce24a79343c27127435286bb7a4e1
contracts/smart-account/SmartAccount.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.17;import {BaseSmartAccount, IEntryPoint, UserOperation} from "./BaseSmartAccount.sol";import {ModuleManager} from "./base/ModuleManager.sol";import {FallbackManager} from "./base/FallbackManager.sol";import {LibAddress} from "./libs/LibAddress.sol";import {ISignatureValidator} from "./interfaces/ISignatureValidator.sol";import {IERC165} from "./interfaces/IERC165.sol";import {SmartAccountErrors} from "./common/Errors.sol";import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";import {IAuthorizationModule} from "./interfaces/IAuthorizationModule.sol";/*** @title SmartAccount - EIP-4337 compatible smart contract wallet.* @dev This contract is the base for the Smart Account functionality.* - It is modular by nature. UserOp and txns validation happens in Authorization Modules.* - It provides the functionality to execute AA (EIP-4337) userOps. Gnosis style txns removed to a module.* - It allows to receive and manage assets.* - It is responsible for managing the modules and fallbacks.* - The Smart Account can be extended with modules, such as Social Recovery, Session Key and others.* @author Chirag Titiya - <chirag@biconomy.io>, Filipp Makarov - <filipp.makarov@biconomy.io>*/contract SmartAccount isBaseSmartAccount,ModuleManager,FallbackManager,IERC165,SmartAccountErrors,ISignatureValidator{using ECDSA for bytes32;using LibAddress for address;// Storage Versionstring public constant VERSION = "2.0.0";// Owner storage. Deprecated. Left for storage layout compatibilityaddress public ownerDeprecated;// changed to 2D nonce below
@account-abstraction/contracts/core/Helpers.sol
// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.12;/* solhint-disable no-inline-assembly *//*** returned data from validateUserOp.* validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`* @param aggregator - address(0) - the account validated the signature by itself.* address(1) - the account failed to validate the signature.* otherwise - this is an address of a signature aggregator that must be used to validate the signature.* @param validAfter - this UserOp is valid only after this timestamp.* @param validaUntil - this UserOp is valid only up to this timestamp.*/struct ValidationData {address aggregator;uint48 validAfter;uint48 validUntil;}//extract sigFailed, validAfter, validUntil.// also convert zero validUntil to type(uint48).maxfunction _parseValidationData(uint validationData) pure returns (ValidationData memory data) {address aggregator = address(uint160(validationData));uint48 validUntil = uint48(validationData >> 160);if (validUntil == 0) {validUntil = type(uint48).max;}uint48 validAfter = uint48(validationData >> (48 + 160));return ValidationData(aggregator, validAfter, validUntil);}// intersect account and paymaster ranges.function _intersectTimeRange(uint256 validationData, uint256 paymasterValidationData) pure returns (ValidationData memory) {ValidationData memory accountValidationData = _parseValidationData(validationData);ValidationData memory pmValidationData = _parseValidationData(paymasterValidationData);address aggregator = accountValidationData.aggregator;if (aggregator == address(0)) {aggregator = pmValidationData.aggregator;}uint48 validAfter = accountValidationData.validAfter;
@account-abstraction/contracts/interfaces/IAccount.sol
// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.12;import "./UserOperation.sol";interface IAccount {/*** Validate user's signature and nonce* the entryPoint will make the call to the recipient only if this validation call returns successfully.* signature failure should be reported by returning SIG_VALIDATION_FAILED (1).* This allows making a "simulation call" without a valid signature* Other failures (e.g. nonce mismatch, or invalid signature format) should still revert to signal failure.** @dev Must validate caller is the entryPoint.* Must validate the signature and nonce* @param userOp the operation that is about to be executed.* @param userOpHash hash of the user's request data. can be used as the basis for signature.* @param missingAccountFunds missing funds on the account's deposit in the entrypoint.* This is the minimum amount to transfer to the sender(entryPoint) to be able to make the call.* The excess is left as a deposit in the entrypoint, for future calls.* can be withdrawn anytime using "entryPoint.withdrawTo()"* In case there is a paymaster in the request (or the current deposit is high enough), this value will be zero.* @return validationData packaged ValidationData structure. use `_packValidationData` and `_unpackValidationData` to encode and decode* <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,* otherwise, an address of an "authorizer" contract.* <6-byte> validUntil - last timestamp this operation is valid. 0 for "indefinite"* <6-byte> validAfter - first timestamp this operation is valid* If an account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature failure.* Note that the validation code cannot use block.timestamp (or block.number) directly.*/function validateUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)external returns (uint256 validationData);}
@openzeppelin/contracts/utils/math/SignedMath.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)pragma solidity ^0.8.0;/*** @dev Standard signed math utilities missing in the Solidity language.*/library SignedMath {/*** @dev Returns the largest of two signed numbers.*/function max(int256 a, int256 b) internal pure returns (int256) {return a > b ? a : b;}/*** @dev Returns the smallest of two signed numbers.*/function min(int256 a, int256 b) internal pure returns (int256) {return a < b ? a : b;}/*** @dev Returns the average of two signed numbers without overflow.* The result is rounded towards zero.*/function average(int256 a, int256 b) internal pure returns (int256) {// Formula from the book "Hacker's Delight"int256 x = (a & b) + ((a ^ b) >> 1);return x + (int256(uint256(x) >> 255) & (a ^ b));}/*** @dev Returns the absolute unsigned value of a signed value.*/function abs(int256 n) internal pure returns (uint256) {unchecked {// must be unchecked in order to support `n = type(int256).min`return uint256(n >= 0 ? n : -n);}
contracts/smart-account/BaseSmartAccount.sol
// SPDX-License-Identifier: GPL-3.0pragma solidity 0.8.17;/* solhint-disable avoid-low-level-calls *//* solhint-disable no-inline-assembly *//* solhint-disable reason-string */import {IAccount} from "@account-abstraction/contracts/interfaces/IAccount.sol";import {IEntryPoint} from "@account-abstraction/contracts/interfaces/IEntryPoint.sol";import {UserOperationLib, UserOperation} from "@account-abstraction/contracts/interfaces/UserOperation.sol";import {BaseSmartAccountErrors} from "./common/Errors.sol";import "@account-abstraction/contracts/core/Helpers.sol";/*** Basic account implementation.* This contract provides the basic logic for implementing the IAccount interface: validateUserOp function* Specific account implementation should inherit it and provide the account-specific logic*/abstract contract BaseSmartAccount is IAccount, BaseSmartAccountErrors {using UserOperationLib for UserOperation;//return value in case of signature failure, with no time-range.// equivalent to _packValidationData(true,0,0);uint256 internal constant SIG_VALIDATION_FAILED = 1;/*** @dev Initialize the Smart Account with required states* @param handler Default fallback handler provided in Smart Account* @param moduleSetupContract Contract, that setups initial auth module for this smart account. It can be a module factory or* a registry module that serves several smart accounts.* @param moduleSetupData data containing address of the Setup Contract and a setup data* @notice devs need to make sure it is only callable once (use initializer modifier or state check restrictions)*/function init(address handler,address moduleSetupContract,bytes calldata moduleSetupData) external virtual returns (address);/*** Validates the userOp.
@account-abstraction/contracts/interfaces/IAggregator.sol
// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.12;import "./UserOperation.sol";/*** Aggregated Signatures validator.*/interface IAggregator {/*** validate aggregated signature.* revert if the aggregated signature does not match the given list of operations.*/function validateSignatures(UserOperation[] calldata userOps, bytes calldata signature) external view;/*** validate signature of a single userOp* This method is should be called by bundler after EntryPoint.simulateValidation() returns (reverts) with ValidationResultWithAggregation* First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.* @param userOp the userOperation received from the user.* @return sigForUserOp the value to put into the signature field of the userOp when calling handleOps.* (usually empty, unless account and aggregator support some kind of "multisig"*/function validateUserOpSignature(UserOperation calldata userOp)external view returns (bytes memory sigForUserOp);/*** aggregate multiple signatures into a single value.* This method is called off-chain to calculate the signature to pass with handleOps()* bundler MAY use optimized custom code perform this aggregation* @param userOps array of UserOperations to collect the signatures from.* @return aggregatedSignature the aggregated signature*/function aggregateSignatures(UserOperation[] calldata userOps) external view returns (bytes memory aggregatedSignature);}
@account-abstraction/contracts/interfaces/IEntryPoint.sol
/**** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.** Only one instance required on each chain.**/// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.12;/* solhint-disable avoid-low-level-calls *//* solhint-disable no-inline-assembly *//* solhint-disable reason-string */import "./UserOperation.sol";import "./IStakeManager.sol";import "./IAggregator.sol";import "./INonceManager.sol";interface IEntryPoint is IStakeManager, INonceManager {/**** An event emitted after each successful request* @param userOpHash - unique identifier for the request (hash its entire content, except signature).* @param sender - the account that generates this request.* @param paymaster - if non-null, the paymaster that pays for this request.* @param nonce - the nonce value from the request.* @param success - true if the sender transaction succeeded, false if reverted.* @param actualGasCost - actual amount paid (by account or paymaster) for this UserOperation.* @param actualGasUsed - total gas used by this UserOperation (including preVerification, creation, validation and execution).*/event UserOperationEvent(bytes32 indexed userOpHash, address indexed sender, address indexed paymaster, uint256 nonce, bool success, uint256 actualGasCost, uint256 actualGasUsed);/*** account "sender" was deployed.* @param userOpHash the userOp that deployed this account. UserOperationEvent will follow.* @param sender the account that is deployed* @param factory the factory used to deploy this account (in the initCode)* @param paymaster the paymaster used by this UserOp*/event AccountDeployed(bytes32 indexed userOpHash, address indexed sender, address factory, address paymaster);/*** An event emitted if the UserOperation "callData" reverted with non-zero length
@account-abstraction/contracts/interfaces/INonceManager.sol
// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.12;interface INonceManager {/*** Return the next nonce for this sender.* Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)* But UserOp with different keys can come with arbitrary order.** @param sender the account address* @param key the high 192 bit of the nonce* @return nonce a full nonce to pass for next UserOp with this sender.*/function getNonce(address sender, uint192 key)external view returns (uint256 nonce);/*** Manually increment the nonce of the sender.* This method is exposed just for completeness..* Account does NOT need to call it, neither during validation, nor elsewhere,* as the EntryPoint will update the nonce regardless.* Possible use-case is call it with various keys to "initialize" their nonces to one, so that future* UserOperations will not pay extra for the first transaction with a given key.*/function incrementNonce(uint192 key) external;}
@account-abstraction/contracts/interfaces/IStakeManager.sol
// SPDX-License-Identifier: GPL-3.0-onlypragma solidity ^0.8.12;/*** manage deposits and stakes.* deposit is just a balance used to pay for UserOperations (either by a paymaster or an account)* stake is value locked for at least "unstakeDelay" by the staked entity.*/interface IStakeManager {event Deposited(address indexed account,uint256 totalDeposit);event Withdrawn(address indexed account,address withdrawAddress,uint256 amount);/// Emitted when stake or unstake delay are modifiedevent StakeLocked(address indexed account,uint256 totalStaked,uint256 unstakeDelaySec);/// Emitted once a stake is scheduled for withdrawalevent StakeUnlocked(address indexed account,uint256 withdrawTime);event StakeWithdrawn(address indexed account,address withdrawAddress,uint256 amount);/**
@account-abstraction/contracts/interfaces/UserOperation.sol
// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.8.12;/* solhint-disable no-inline-assembly */import {calldataKeccak} from "../core/Helpers.sol";/*** User Operation struct* @param sender the sender account of this request.* @param nonce unique value the sender uses to verify it is not a replay.* @param initCode if set, the account contract will be created by this constructor/* @param callData the method call to execute on this account.* @param callGasLimit the gas limit passed to the callData method call.* @param verificationGasLimit gas used for validateUserOp and validatePaymasterUserOp.* @param preVerificationGas gas not calculated by the handleOps method, but added to the gas paid. Covers batch overhead.* @param maxFeePerGas same as EIP-1559 gas parameter.* @param maxPriorityFeePerGas same as EIP-1559 gas parameter.* @param paymasterAndData if set, this field holds the paymaster address and paymaster-specific data. the paymaster will pay for the transaction instead of the sender.* @param signature sender-verified signature over the entire request, the EntryPoint address and the chain ID.*/struct UserOperation {address sender;uint256 nonce;bytes initCode;bytes callData;uint256 callGasLimit;uint256 verificationGasLimit;uint256 preVerificationGas;uint256 maxFeePerGas;uint256 maxPriorityFeePerGas;bytes paymasterAndData;bytes signature;}/*** Utility functions helpful when working with UserOperation structs.*/library UserOperationLib {
@openzeppelin/contracts/utils/Strings.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)pragma solidity ^0.8.0;import "./math/Math.sol";import "./math/SignedMath.sol";/*** @dev String operations.*/library Strings {bytes16 private constant _SYMBOLS = "0123456789abcdef";uint8 private constant _ADDRESS_LENGTH = 20;/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {unchecked {uint256 length = Math.log10(value) + 1;string memory buffer = new string(length);uint256 ptr;/// @solidity memory-safe-assemblyassembly {ptr := add(buffer, add(32, length))}while (true) {ptr--;/// @solidity memory-safe-assemblyassembly {mstore8(ptr, byte(mod(value, 10), _SYMBOLS))}value /= 10;if (value == 0) break;}return buffer;}}/**
@openzeppelin/contracts/utils/cryptography/ECDSA.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)pragma solidity ^0.8.0;import "../Strings.sol";/*** @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.** These functions can be used to verify that a message was signed by the holder* of the private keys of a given address.*/library ECDSA {enum RecoverError {NoError,InvalidSignature,InvalidSignatureLength,InvalidSignatureS,InvalidSignatureV // Deprecated in v4.8}function _throwError(RecoverError error) private pure {if (error == RecoverError.NoError) {return; // no error: do nothing} else if (error == RecoverError.InvalidSignature) {revert("ECDSA: invalid signature");} else if (error == RecoverError.InvalidSignatureLength) {revert("ECDSA: invalid signature length");} else if (error == RecoverError.InvalidSignatureS) {revert("ECDSA: invalid signature 's' value");}}/*** @dev Returns the address that signed a hashed message (`hash`) with* `signature` or error string. This address can then be used for verification purposes.** The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:* this function rejects them by requiring the `s` value to be in the lower* half order, and the `v` value to be either 27 or 28.
@openzeppelin/contracts/utils/math/Math.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)pragma solidity ^0.8.0;/*** @dev Standard math utilities missing in the Solidity language.*/library Math {enum Rounding {Down, // Toward negative infinityUp, // Toward infinityZero // Toward zero}/*** @dev Returns the largest of two numbers.*/function max(uint256 a, uint256 b) internal pure returns (uint256) {return a > b ? a : b;}/*** @dev Returns the smallest of two numbers.*/function min(uint256 a, uint256 b) internal pure returns (uint256) {return a < b ? a : b;}/*** @dev Returns the average of two numbers. The result is rounded towards* zero.*/function average(uint256 a, uint256 b) internal pure returns (uint256) {// (a + b) / 2 can overflow.return (a & b) + (a ^ b) / 2;}/*** @dev Returns the ceiling of the division of two numbers.*
contracts/smart-account/base/Executor.sol
// SPDX-License-Identifier: LGPL-3.0-onlypragma solidity 0.8.17;import {Enum} from "../common/Enum.sol";/// @title Executor - A contract that can execute transactionsabstract contract Executor {// Could add a flag fromEntryPoint for AA txnevent ExecutionFailure(address indexed to,uint256 indexed value,bytes indexed data,Enum.Operation operation,uint256 txGas);event ExecutionSuccess(address indexed to,uint256 indexed value,bytes indexed data,Enum.Operation operation,uint256 txGas);function execute(address to,uint256 value,bytes memory data,Enum.Operation operation,uint256 txGas) internal returns (bool success) {if (operation == Enum.Operation.DelegateCall) {assembly {success := delegatecall(txGas,to,add(data, 0x20),mload(data),0,0)}
contracts/smart-account/base/FallbackManager.sol
// SPDX-License-Identifier: LGPL-3.0-onlypragma solidity 0.8.17;import {SelfAuthorized} from "../common/SelfAuthorized.sol";import {FallbackManagerErrors} from "../common/Errors.sol";/*** @title Fallback Manager - A contract that manages fallback calls made to the Smart Account* @dev Fallback calls are handled by a `handler` contract that is stored at FALLBACK_HANDLER_STORAGE_SLOT* fallback calls are not delegated to the `handler` so they can not directly change Smart Account storage*/abstract contract FallbackManager is SelfAuthorized, FallbackManagerErrors {// keccak-256 hash of "fallback_manager.handler.address" subtracted by 1bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT =0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4;event ChangedFallbackHandler(address indexed previousHandler,address indexed handler);// solhint-disable-next-line payable-fallback,no-complex-fallbackfallback() external {bytes32 slot = FALLBACK_HANDLER_STORAGE_SLOT;assembly {let handler := sload(slot)if iszero(handler) {return(0, 0)}calldatacopy(0, 0, calldatasize())// The msg.sender address is shifted to the left by 12 bytes to remove the padding// Then the address without padding is stored right after the calldatamstore(calldatasize(), shl(96, caller()))// Add 20 bytes for the address appended add the endlet success := call(gas(),handler,0,0,add(calldatasize(), 20),
contracts/smart-account/base/ModuleManager.sol
// SPDX-License-Identifier: LGPL-3.0-onlypragma solidity 0.8.17;import {SelfAuthorized} from "../common/SelfAuthorized.sol";import {Executor, Enum} from "./Executor.sol";import {ModuleManagerErrors} from "../common/Errors.sol";/*** @title Module Manager - A contract that manages modules that can execute transactions* on behalf of the Smart Account via this contract.*/abstract contract ModuleManager isSelfAuthorized,Executor,ModuleManagerErrors{address internal constant SENTINEL_MODULES = address(0x1);mapping(address => address) internal _modules;uint256[24] private __gap;// Eventsevent EnabledModule(address module);event DisabledModule(address module);event ExecutionFromModuleSuccess(address indexed module);event ExecutionFromModuleFailure(address indexed module);event ModuleTransaction(address module,address to,uint256 value,bytes data,Enum.Operation operation);/*** @dev Adds a module to the allowlist.* @notice This SHOULD only be done via userOp or a selfcall.*/function enableModule(address module) external virtual;/*** @dev Setups module for this Smart Account and enables it.
contracts/smart-account/common/Enum.sol
// SPDX-License-Identifier: LGPL-3.0-onlypragma solidity 0.8.17;/// @title Enum - Collection of enumsabstract contract Enum {enum Operation {Call,DelegateCall}}
contracts/smart-account/common/Errors.sol
// SPDX-License-Identifier: LGPL-3.0-onlypragma solidity 0.8.17;contract BaseSmartAccountErrors {/*** @notice Throws at onlyEntryPoint when msg.sender is not an EntryPoint set for this Smart Account* @param caller address that tried to call onlyEntryPoint-protected method*/error CallerIsNotAnEntryPoint(address caller);}contract FallbackManagerErrors {/*** @notice Throws if zero address has been provided as Fallback Handler address*/error HandlerCannotBeZero();}contract ModuleManagerErrors {/*** @notice Throws when trying to initialize module manager that already been initialized*/error ModulesAlreadyInitialized();/*** @notice Throws when a delegatecall in course of module manager initialization has failed*/error ModulesSetupExecutionFailed();/*** @notice Throws when address(0) or SENTINEL_MODULES constant has been provided as a module address* @param module Module address provided*/error ModuleCannotBeZeroOrSentinel(address module);/*** @notice Throws when trying to enable module that has already been enabled* @param module Module address provided*/error ModuleAlreadyEnabled(address module);
contracts/smart-account/common/SelfAuthorized.sol
// SPDX-License-Identifier: LGPL-3.0-onlypragma solidity 0.8.17;import {SelfAuthorizedErrors} from "../common/Errors.sol";/// @title SelfAuthorized - authorizes current contract to perform actionscontract SelfAuthorized is SelfAuthorizedErrors {modifier authorized() {// This is a function call as it minimized the bytecode size_requireSelfCall();_;}function _requireSelfCall() private view {if (msg.sender != address(this)) revert CallerIsNotSelf(msg.sender);}}
contracts/smart-account/interfaces/IAuthorizationModule.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.17;import {UserOperation} from "@account-abstraction/contracts/interfaces/UserOperation.sol";// interface for modules to verify singatures signed over userOpHashinterface IAuthorizationModule {function validateUserOp(UserOperation calldata userOp,bytes32 userOpHash) external returns (uint256 validationData);}
contracts/smart-account/interfaces/IERC165.sol
// SPDX-License-Identifier: LGPL-3.0-onlypragma solidity 0.8.17;/// @notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.solinterface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);}
contracts/smart-account/interfaces/ISignatureValidator.sol
// SPDX-License-Identifier: LGPL-3.0-onlypragma solidity 0.8.17;contract ISignatureValidatorConstants {// bytes4(keccak256("isValidSignature(bytes32,bytes)")bytes4 internal constant EIP1271_MAGIC_VALUE = 0x1626ba7e;}abstract contract ISignatureValidator is ISignatureValidatorConstants {/*** @dev Should return whether the signature provided is valid for the provided data* @param _dataHash Arbitrary length data signed on behalf of address(this)* @param _signature Signature byte array associated with _data** MUST return the bytes4 magic value 0x1626ba7e when function passes.* MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)* MUST allow external calls*/function isValidSignature(bytes32 _dataHash,bytes memory _signature) public view virtual returns (bytes4);}
contracts/smart-account/libs/LibAddress.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.17;library LibAddress {/*** @notice Will return true if provided address is a contract* @param account Address to verify if contract or not* @dev This contract will return false if called within the constructor of* a contract's deployment, as the code is not yet stored on-chain.*/function isContract(address account) internal view returns (bool) {uint256 csize;assembly {csize := extcodesize(account)}return csize != 0;}}
Contract ABI
[{"type":"constructor","inputs":[{"type":"address","name":"anEntryPoint","internalType":"contract IEntryPoint"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"VERSION","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"addDeposit","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableModule","inputs":[{"type":"address","name":"prevModule","internalType":"address"},{"type":"address","name":"module","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableModule","inputs":[{"type":"address","name":"module","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IEntryPoint"}],"name":"entryPoint","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"execBatchTransactionFromModule","inputs":[{"type":"address[]","name":"to","internalType":"address[]"},{"type":"uint256[]","name":"value","internalType":"uint256[]"},{"type":"bytes[]","name":"data","internalType":"bytes[]"},{"type":"uint8[]","name":"operations","internalType":"enum Enum.Operation[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"execTransactionFromModule","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint8","name":"operation","internalType":"enum Enum.Operation"},{"type":"uint256","name":"txGas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"execTransactionFromModule","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint8","name":"operation","internalType":"enum Enum.Operation"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"},{"type":"bytes","name":"returnData","internalType":"bytes"}],"name":"execTransactionFromModuleReturnData","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint8","name":"operation","internalType":"enum Enum.Operation"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"execute","inputs":[{"type":"address","name":"dest","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"bytes","name":"func","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeBatch","inputs":[{"type":"address[]","name":"dest","internalType":"address[]"},{"type":"uint256[]","name":"value","internalType":"uint256[]"},{"type":"bytes[]","name":"func","internalType":"bytes[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeBatch_y6U","inputs":[{"type":"address[]","name":"dest","internalType":"address[]"},{"type":"uint256[]","name":"value","internalType":"uint256[]"},{"type":"bytes[]","name":"func","internalType":"bytes[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"execute_ncC","inputs":[{"type":"address","name":"dest","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"bytes","name":"func","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getDeposit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"_handler","internalType":"address"}],"name":"getFallbackHandler","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"_implementation","internalType":"address"}],"name":"getImplementation","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"array","internalType":"address[]"},{"type":"address","name":"next","internalType":"address"}],"name":"getModulesPaginated","inputs":[{"type":"address","name":"start","internalType":"address"},{"type":"uint256","name":"pageSize","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"init","inputs":[{"type":"address","name":"handler","internalType":"address"},{"type":"address","name":"moduleSetupContract","internalType":"address"},{"type":"bytes","name":"moduleSetupData","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isModuleEnabled","inputs":[{"type":"address","name":"module","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"isValidSignature","inputs":[{"type":"bytes32","name":"dataHash","internalType":"bytes32"},{"type":"bytes","name":"signature","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonce","inputs":[{"type":"uint192","name":"_key","internalType":"uint192"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"noncesDeprecated","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerDeprecated","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFallbackHandler","inputs":[{"type":"address","name":"handler","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"setupAndEnableModule","inputs":[{"type":"address","name":"setupContract","internalType":"address"},{"type":"bytes","name":"setupData","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"_interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateImplementation","inputs":[{"type":"address","name":"_implementation","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"validationData","internalType":"uint256"}],"name":"validateUserOp","inputs":[{"type":"tuple","name":"userOp","internalType":"struct UserOperation","components":[{"type":"address"},{"type":"uint256"},{"type":"bytes"},{"type":"bytes"},{"type":"uint256"},{"type":"uint256"},{"type":"uint256"},{"type":"uint256"},{"type":"uint256"},{"type":"bytes"},{"type":"bytes"}]},{"type":"bytes32","name":"userOpHash","internalType":"bytes32"},{"type":"uint256","name":"missingAccountFunds","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"withdrawDepositTo","inputs":[{"type":"address","name":"withdrawAddress","internalType":"address payable"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"event","name":"ChangedFallbackHandler","inputs":[{"type":"address","name":"previousHandler","indexed":true},{"type":"address","name":"handler","indexed":true}],"anonymous":false},{"type":"event","name":"DisabledModule","inputs":[{"type":"address","name":"module","indexed":false}],"anonymous":false},{"type":"event","name":"EnabledModule","inputs":[{"type":"address","name":"module","indexed":false}],"anonymous":false},{"type":"event","name":"ExecutionFailure","inputs":[{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":true},{"type":"bytes","name":"data","indexed":true},{"type":"uint8","name":"operation","indexed":false},{"type":"uint256","name":"txGas","indexed":false}],"anonymous":false},{"type":"event","name":"ExecutionFromModuleFailure","inputs":[{"type":"address","name":"module","indexed":true}],"anonymous":false},{"type":"event","name":"ExecutionFromModuleSuccess","inputs":[{"type":"address","name":"module","indexed":true}],"anonymous":false},{"type":"event","name":"ExecutionSuccess","inputs":[{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":true},{"type":"bytes","name":"data","indexed":true},{"type":"uint8","name":"operation","indexed":false},{"type":"uint256","name":"txGas","indexed":false}],"anonymous":false},{"type":"event","name":"ImplementationUpdated","inputs":[{"type":"address","name":"oldImplementation","indexed":true},{"type":"address","name":"newImplementation","indexed":true}],"anonymous":false},{"type":"event","name":"ModuleTransaction","inputs":[{"type":"address","name":"module","indexed":false},{"type":"address","name":"to","indexed":false},{"type":"uint256","name":"value","indexed":false},{"type":"bytes","name":"data","indexed":false},{"type":"uint8","name":"operation","indexed":false}],"anonymous":false},{"type":"event","name":"SmartAccountReceivedNativeToken","inputs":[{"type":"address","name":"sender","indexed":true},{"type":"uint256","name":"value","indexed":true}],"anonymous":false},{"type":"error","name":"AlreadyInitialized","inputs":[]},{"type":"error","name":"BaseImplementationCannotBeZero","inputs":[]},{"type":"error","name":"CallerIsNotAnEntryPoint","inputs":[{"type":"address","name":"caller","internalType":"address"}]},{"type":"error","name":"CallerIsNotEntryPoint","inputs":[{"type":"address","name":"caller","internalType":"address"}]},{"type":"error","name":"CallerIsNotEntryPointOrOwner","inputs":[{"type":"address","name":"caller","internalType":"address"}]},{"type":"error","name":"CallerIsNotEntryPointOrSelf","inputs":[{"type":"address","name":"caller","internalType":"address"}]},{"type":"error","name":"CallerIsNotOwner","inputs":[{"type":"address","name":"caller","internalType":"address"}]},{"type":"error","name":"CallerIsNotSelf","inputs":[{"type":"address","name":"caller","internalType":"address"}]},{"type":"error","name":"DelegateCallsOnly","inputs":[]},{"type":"error","name":"EntryPointCannotBeZero","inputs":[]},{"type":"error","name":"HandlerCannotBeZero","inputs":[]},{"type":"error","name":"InvalidImplementation","inputs":[{"type":"address","name":"implementationAddress","internalType":"address"}]},{"type":"error","name":"MixedAuthFail","inputs":[{"type":"address","name":"caller","internalType":"address"}]},{"type":"error","name":"ModuleAlreadyEnabled","inputs":[{"type":"address","name":"module","internalType":"address"}]},{"type":"error","name":"ModuleAndPrevModuleMismatch","inputs":[{"type":"address","name":"expectedModule","internalType":"address"},{"type":"address","name":"returnedModule","internalType":"address"},{"type":"address","name":"prevModule","internalType":"address"}]},{"type":"error","name":"ModuleCannotBeZeroOrSentinel","inputs":[{"type":"address","name":"module","internalType":"address"}]},{"type":"error","name":"ModuleNotEnabled","inputs":[{"type":"address","name":"module","internalType":"address"}]},{"type":"error","name":"ModulesAlreadyInitialized","inputs":[]},{"type":"error","name":"ModulesSetupExecutionFailed","inputs":[]},{"type":"error","name":"OwnerCanNotBeSelf","inputs":[]},{"type":"error","name":"OwnerCannotBeZero","inputs":[]},{"type":"error","name":"OwnerProvidedIsSame","inputs":[]},{"type":"error","name":"TransferToZeroAddressAttempt","inputs":[]},{"type":"error","name":"WrongBatchProvided","inputs":[{"type":"uint256","name":"destLength","internalType":"uint256"},{"type":"uint256","name":"valueLength","internalType":"uint256"},{"type":"uint256","name":"funcLength","internalType":"uint256"},{"type":"uint256","name":"operationLength","internalType":"uint256"}]},{"type":"error","name":"WrongContractSignature","inputs":[{"type":"bytes","name":"contractSignature","internalType":"bytes"}]},{"type":"error","name":"WrongContractSignatureFormat","inputs":[{"type":"uint256","name":"uintS","internalType":"uint256"},{"type":"uint256","name":"contractSignatureLength","internalType":"uint256"},{"type":"uint256","name":"signatureLength","internalType":"uint256"}]},{"type":"error","name":"WrongValidationModule","inputs":[{"type":"address","name":"moduleAddressProvided","internalType":"address"}]},{"type":"receive"},{"type":"fallback"}]
Deployed ByteCode
0x60806040526004361015610030575b36156100285734610023576100216119d6565b005b600080fd5b6100216114d3565b60003560e01c8061189a146101b357806146801461021657806301ffc9a71461025e578063025b22bc146102555780631626ba7e1461024c57806321632045146102435780632d9ad53d1461023a578063378dfd8e146102315780633a871cdd14610228578063468721a71461021f57806347e1da2a146102165780634a58db191461020d5780634d44560d146102045780635229073f146101fb5780635305dd27146101f2578063610b5925146101e95780636424e9fe146101e0578063856dfd99146101d7578063aaf10f42146101ce578063acfdf503146101c5578063b0d691fe146101bc578063b61d27f6146101b3578063c399ec88146101aa578063cc2f8452146101a1578063d86f2b3c14610198578063e009cfde1461018f578063f08a032314610186578063f33623b11461017d5763ffa1ad740361000e57610178611439565b61000e565b5061017861140c565b506101786113de565b5061017861120c565b5061017861113a565b50610178611038565b50610178610f45565b506101786102b3565b50610178610f00565b50610178610e5d565b50610178610e36565b50610178610def565b50610178610dc7565b50610178610d99565b50610178610d2d565b50610178610cab565b50610178610bd4565b50610178610b4a565b50610178610342565b50610178610afc565b50610178610929565b506101786107c8565b5061017861076a565b506101786106ab565b5061017861064f565b5061017861049d565b50610178610461565b6001600160a01b0381160361002357565b359061028382610267565b565b9181601f840112156100235782359167ffffffffffffffff8311610023576020838186019501011161002357565b5034610023576060366003190112610023576004356102d181610267565b6044359067ffffffffffffffff8211610023576103076102f8610021933690600401610285565b61030061198c565b36916105fa565b906024359061190d565b9181601f840112156100235782359167ffffffffffffffff8311610023576020808501948460051b01011161002357565b50346100235760603660031901126100235767ffffffffffffffff60043581811161002357610375903690600401610311565b906024358381116100235761038e903690600401610311565b93604435908111610023576103a7903690600401610311565b926103b061198c565b84158015610445575b801561043b575b61040f5760005b8581106103d057005b806104096103e96103e46001948a87611745565b611763565b6103f4838b89611745565b35610403610300858b8a61176d565b9161190d565b016103c7565b5050506084926040519263470c355760e01b845260048401526024830152604482015260006064820152fd5b50838614156103c0565b50858514156103b9565b6001600160e01b031981160361002357565b50346100235760203660031901126100235760206004356104818161044f565b6040516001600160e01b03199091166301ffc9a760e01b148152f35b5034610023576020366003190112610023576004356104bb81610267565b6104c3611931565b6001600160a01b0380821691821561053057803b15610509573054903055167faa3f731066a578e5f39b4215468d826cdd15373cbc0dfc9cb9bdc649718ef7da600080a3005b604051630c76093760e01b81526001600160a01b03919091166004820152602490fd5b0390fd5b60405162461bcd60e51b815260206004820152601660248201527f416464726573732063616e6e6f74206265207a65726f000000000000000000006044820152606490fd5b50634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff81116105a057604052565b6105a8610575565b604052565b90601f8019910116810190811067ffffffffffffffff8211176105a057604052565b60209067ffffffffffffffff81116105ed575b601f01601f19160190565b6105f5610575565b6105e2565b929192610606826105cf565b9161061460405193846105ad565b829481845281830111610023578281602093846000960137010152565b9080601f830112156100235781602061064c933591016105fa565b90565b50346100235760403660031901126100235760243567ffffffffffffffff81116100235761068e6106866020923690600401610631565b600435611834565b6040516001600160e01b03199091168152f35b6002111561002357565b50346100235760a0366003190112610023576004356106c981610267565b60443567ffffffffffffffff8111610023576106e9903690600401610631565b90606435906106f7826106a1565b6084359160013314801561074b575b61073357602093610723938061072d57505a925b60243590611b5a565b6040519015158152f35b9261071a565b6040516321ac7c5f60e01b8152336004820152602490fd5b503360005260006020526001600160a01b036040600020541615610706565b503461002357602036600319011261002357602060043561078a81610267565b6001600160a01b0380911690816001141591826107ae575b50506040519015158152f35b9091506000526000825260406000205416151538806107a2565b5034610023576060366003190112610023576004356107e681610267565b602435906107f382610267565b60443567ffffffffffffffff811161002357610813903690600401610285565b91909260009360018552846020526001600160a01b0393604093858588205416158015906108fd575b6108ed5791610852916103006108589594611a24565b90611f7a565b918216801580156108e3575b6108cd578282856108b1936108c997528060205261089182822060016001600160a01b0319825416179055565b6001815220906001600160a01b03166001600160a01b0319825416179055565b516001600160a01b0390911681529081906020820190565b0390f35b602491519063cadb248f60e01b82526004820152fd5b5060018114610864565b845162dc149f60e41b8152600490fd5b50857f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d45416151561083c565b503461002357600319606036820112610023576004359067ffffffffffffffff82116100235761016082600401918336030112610023576000906001600160a01b0392837f00000000000000000000000000000061fefce24a79343c27127435286bb7a4e1163303610a9b576109af6109a76101448693018461153d565b810190611570565b905016926109e06109d3856001600160a01b03166000526000602052604060002090565b546001600160a01b031690565b1615610a7a576020610a116108c9948493604051948580948193637ff9adb960e11b835260243590600484016115fa565b03925af1918215610a6d575b91610a3f575b50610a2f6044356116f1565b6040519081529081906020820190565b610a60915060203d8111610a66575b610a5881836105ad565b8101906114b7565b38610a23565b503d610a4e565b610a756114c6565b610a1d565b6040516326cc3fab60e21b81526001600160a01b0384166004820152602490fd5b604051635dac3db760e11b8152336004820152602490fd5b608060031982011261002357600435610acb81610267565b91602435916044359067ffffffffffffffff821161002357610aef91600401610631565b9060643561064c816106a1565b503461002357610b0b36610ab3565b600193919333148015610b2b575b61073357602093610723935a93611b5a565b503360005260006020526001600160a01b036040600020541615610b19565b50600080600319360112610bd1576001600160a01b037f00000000000000000000000000000061fefce24a79343c27127435286bb7a4e11681813b15610bd15760405163b760faf960e01b8152306004820152918290602490829034905af18015610bc4575b610bb8575080f35b610bc19061058c565b80f35b610bcc6114c6565b610bb0565b80fd5b5060006040366003190112610bd157600435610bef81610267565b610bf7611931565b816001600160a01b03807f00000000000000000000000000000061fefce24a79343c27127435286bb7a4e11692833b15610c5f5760449083604051958694859363040b850f60e31b855216600484015260243560248401525af18015610bc457610bb8575080f35b8280fd5b60005b838110610c765750506000910152565b8181015183820152602001610c66565b90602091610c9f81518092818552858086019101610c63565b601f01601f1916010190565b503461002357610cba36610ab3565b90600193929333148015610d0e575b61073357610cd8935a93611b5a565b6040519060203d8301016040523d82523d6000602084013e6108c960405192839215158352604060208401526040830190610c86565b503360005260006020526001600160a01b036040600020541615610cc9565b503461002357604036600319011261002357600435610d4b81610267565b60243567ffffffffffffffff811161002357602091610d71610d7f923690600401610631565b90610d7a611931565b611f7a565b610d8881611d68565b6001600160a01b0360405191168152f35b503461002357602036600319011261002357610021600435610dba81610267565b610dc2611931565b611d68565b50346100235760003660031901126100235760206001600160a01b0360315416604051908152f35b50346100235760003660031901126100235760207f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4546001600160a01b0360405191168152f35b503461002357600036600319011261002357602030546001600160a01b0360405191168152f35b50346100235760803660031901126100235767ffffffffffffffff60043581811161002357610e90903690600401610311565b60249291923582811161002357610eab903690600401610311565b60449491943584811161002357610ec6903690600401610311565b91606435958611610023576108c996610ee6610eee973690600401610311565b969095611c22565b60405190151581529081906020820190565b50346100235760003660031901126100235760206040516001600160a01b037f00000000000000000000000000000061fefce24a79343c27127435286bb7a4e1168152f35b5034610023576000366003190112610023576040516370a0823160e01b815230600482015260209081816024817f00000000000000000000000000000061fefce24a79343c27127435286bb7a4e16001600160a01b03165afa908115610fd4575b600091610fb7575b50604051908152f35b610fce9150823d8111610a6657610a5881836105ad565b38610fae565b610fdc6114c6565b610fa6565b90929192604082016040835281518091526060830160208093019160005b8482821061101b575050506001600160a01b0391509416910152565b84516001600160a01b031684529384019390920191600101610fff565b50346100235760403660031901126100235760043561105681610267565b60243561106281611a96565b61106f60405191826105ad565b818152601f1961107e83611a96565b013660208301376110a76109d36000946001600160a01b03166000526000602052604060002090565b6001600160a01b038116801515908161112e575b5080611125575b15611112576111066109d3826110ed61110c946110df8988611ab7565b906001600160a01b03169052565b6001600160a01b03166000526000602052604060002090565b93611ad9565b926110a7565b908381526108c960405192839283610fe1565b508284106110c2565b600191501415386110bb565b50346100235760203660031901126100235760043577ffffffffffffffffffffffffffffffffffffffffffffffff8116809103610023576108c99060405190631aab3f0d60e11b825230600483015260248201526020816044816001600160a01b037f00000000000000000000000000000061fefce24a79343c27127435286bb7a4e1165afa9081156111ff575b6000916111e1575b506040519081529081906020820190565b6111f9915060203d8111610a6657610a5881836105ad565b386111d0565b6112076114c6565b6111c8565b50346100235760403660031901126100235760043561122a81610267565b60243561123681610267565b61123e611931565b6001600160a01b038116801580156113d4575b6113b3576112846112786109d3856001600160a01b03166000526000602052604060002090565b6001600160a01b031690565b03611359578061130a7faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276936112ef6112d56109d3611354966001600160a01b03166000526000602052604060002090565b916001600160a01b03166000526000602052604060002090565b906001600160a01b03166001600160a01b0319825416179055565b61133a61132a826001600160a01b03166000526000602052604060002090565b6001600160a01b03198154169055565b6040516001600160a01b0390911681529081906020820190565b0390a1005b61052c61137c6109d3846001600160a01b03166000526000602052604060002090565b604051633103525b60e21b81526001600160a01b039384166004820152908316602482015292909116604483015281906064820190565b60405163cadb248f60e01b81526001600160a01b0383166004820152602490fd5b5060018114611251565b5034610023576020366003190112610023576100216004356113ff81610267565b611407611931565b611a24565b50346100235760203660031901126100235760043560005260326020526020604060002054604051908152f35b5034610023576000366003190112610023576108c96040516040810181811067ffffffffffffffff8211176114aa575b604052600581527f322e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190610c86565b6114b2610575565b611469565b90816020910312610023575190565b506040513d6000823e3d90fd5b6001600160a01b037f0000000000000000000000000000002512019dafb59528b82cb92d3c5d2423ac16301461152b5734337ed05ab44e279ac59e855cb75dc2ae23b200ad994797b6f1f028f96a46ecce02600080a3565b604051633c97166560e21b8152600490fd5b903590601e1981360301821215610023570180359067ffffffffffffffff82116100235760200191813603831361002357565b919060408382031261002357823567ffffffffffffffff81116100235760209161159b918501610631565b92013561064c81610267565b9035601e198236030181121561002357016020813591019167ffffffffffffffff821161002357813603831361002357565b908060209392818452848401376000828201840152601f01601f1916010190565b9291906116ec611657602092604087526116276040880161161a83610278565b6001600160a01b03169052565b8381013560608801526116dc61164060408301836115a7565b9390610160948560808c01526101a08b01916115d9565b916116d361167f61166b60608401846115a7565b603f198d8803810160a08f015296916115d9565b608083013560c08c015260a083013560e08c01528a6101009660c0850135888301526116c361012060e087013581850152610140998701358a8501528601866115a7565b92909188828603019101526115d9565b938101906115a7565b91888403016101808901526115d9565b930152565b806116f95750565b600080808093338219f1503d15610283573d611714816105cf565b9061172260405192836105ad565b8152600060203d92013e565b50634e487b7160e01b600052603260045260246000fd5b9190811015611756575b60051b0190565b61175e61172e565b61174f565b3561064c81610267565b90916117869281101561178a575b60051b81019061153d565b9091565b61179261172e565b61177b565b919060408382031261002357825167ffffffffffffffff81116100235783019080601f83011215610023578151916117ce836105cf565b916117dc60405193846105ad565b83835260208483010111610023576020926117fc91848085019101610c63565b92015161064c81610267565b90816020910312610023575161064c8161044f565b60409061064c939281528160208201520190610c86565b906118489060208082518301019101611797565b90916001600160a01b03809216916118766109d3846001600160a01b03166000526000602052604060002090565b16156118ec57916020916118a093604051809581948293630b135d3f60e11b84526004840161181d565b03915afa9081156118df575b6000916118b7575090565b61064c915060203d81116118d8575b6118d081836105ad565b810190611808565b503d6118c6565b6118e76114c6565b6118ac565b6040516326cc3fab60e21b81526001600160a01b0383166004820152602490fd5b916000928392602083519301915af1604051903d6000833e1561192d5750565b3d90fd5b6001600160a01b037f00000000000000000000000000000061fefce24a79343c27127435286bb7a4e11633141580611982575b61196a57565b604051634776242160e01b8152336004820152602490fd5b5030331415611964565b6001600160a01b037f00000000000000000000000000000061fefce24a79343c27127435286bb7a4e11633036119be57565b60405163e6fce6a560e01b8152336004820152602490fd5b507f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4548015610021576000808092368280373360601b3652818060143601925af13d82803e1561192d573d90f35b6001600160a01b03808216918215611a84577f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d49081549155167f06be9a1bea257286cf2afa8205ed494ca9d6a4b41aa58d04238deebada20fb0c600080a3565b60405163dd449f5f60e01b8152600490fd5b60209067ffffffffffffffff8111611aaf5760051b0190565b61175e610575565b6020918151811015611acc575b60051b010190565b611ad461172e565b611ac4565b6000198114611ae85760010190565b634e487b7160e01b600052601160045260246000fd5b611b1690602060405192828480945193849201610c63565b810103902090565b906002821015611b2b5752565b634e487b7160e01b600052602160045260246000fd5b60209093929193611b56816040810196611b1e565b0152565b9493929091946002821015611b2b5760018203611c05576000808751602089018488f4955b8615611bcf577f81d12fffced46c214dfae8ab8fa0b9f7b69f70c9d500e33f612f2105deb261ee91611bca611bbb6001600160a01b0393611afe565b96604051938493169583611b41565b0390a4565b7f3ddd038f78c876172d5dbfd730b14c9f8692dfa197ef104eaac6df3f85a0874a91611bca611bbb6001600160a01b0393611afe565b600080875160208901868589f195611b7f565b3561064c816106a1565b9497969391929795909560009887158015611d5e575b8015611d54575b8015611d4a575b611d1b576001978833148015611ceb575b6107335797969594939291906000985b808a10611c7a5750505050505050505050565b9091929394959697899b50611cdb888888611cd589869f8f81611cc0818e611cb98f968f97611cb36103e483611ccd9b611cc89b611745565b9c611745565b359861176d565b989094611745565b611c18565b9436916105fa565b91611eab565b9b01989796959493929190611c67565b506001600160a01b03611d146109d3336001600160a01b03166000526000602052604060002090565b1615611c57565b60405163470c355760e01b81526004810189905260248101919091526044810182905260648101869052608490fd5b5085821415611c46565b5081811415611c3f565b5080881415611c38565b6001600160a01b0381168015908115611ea0575b50611e7d57611da46112786109d3836001600160a01b03166000526000602052604060002090565b611e5a57600160009081526020527fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844090611e5590611e21611e047fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d6109d3565b6112ef836001600160a01b03166000526000602052604060002090565b6001600090815260205261133a817fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d6112ef565b0390a1565b60405163b29d459560e01b81526001600160a01b03919091166004820152602490fd5b60405163cadb248f60e01b81526001600160a01b03919091166004820152602490fd5b600191501438611d7c565b939293611ebb5a86858585611b5a565b948515611f4e57611f23611f187f8c014e41cffd68ba64f3e7830b8b2e4ee860509d8deab25ebbcbba2f0405e2da956001600160a01b0395604051968796338852166020870152604086015260a0606086015260a0850190610c86565b916080840190611b1e565b0390a1337f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8600080a2565b50505050337facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375600080a2565b6001600160a01b03811615611fab5781600092918360208194519301915af1604051903d6000833e1561192d575190565b60405162461bcd60e51b815260206004820152601a60248201527f57726f6e67204d6f64756c6520536574757020416464726573730000000000006044820152606490fdfea26469706673582212205b0eef0c52710fe7c7bfe29486817ab401f71c64b70bb7d9a797e3f2642bcce364736f6c63430008110033