Contract Address Details

0x0000002512019Dafb59528B82CB92D3c5D2423aC

Contract Name
SmartAccount
Creator
0xf29e33–04f866 at 0x6a3d00–988d80
Balance
0 CHZ ($0.00 USD)
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
22146289
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: MIT
pragma 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 is
BaseSmartAccount,
ModuleManager,
FallbackManager,
IERC165,
SmartAccountErrors,
ISignatureValidator
{
using ECDSA for bytes32;
using LibAddress for address;
// Storage Version
string public constant VERSION = "2.0.0";
// Owner storage. Deprecated. Left for storage layout compatibility
address public ownerDeprecated;
// changed to 2D nonce below
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@account-abstraction/contracts/core/Helpers.sol

// SPDX-License-Identifier: GPL-3.0
pragma 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).max
function _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;
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@account-abstraction/contracts/interfaces/IAccount.sol

// SPDX-License-Identifier: GPL-3.0
pragma 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);
}
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@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);
}
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/BaseSmartAccount.sol

// SPDX-License-Identifier: GPL-3.0
pragma 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.
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@account-abstraction/contracts/interfaces/IAggregator.sol

// SPDX-License-Identifier: GPL-3.0
pragma 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);
}
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@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.0
pragma 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
 
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@account-abstraction/contracts/interfaces/INonceManager.sol

// SPDX-License-Identifier: GPL-3.0
pragma 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;
}
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@account-abstraction/contracts/interfaces/IStakeManager.sol

// SPDX-License-Identifier: GPL-3.0-only
pragma 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 modified
event StakeLocked(
address indexed account,
uint256 totalStaked,
uint256 unstakeDelaySec
);
/// Emitted once a stake is scheduled for withdrawal
event StakeUnlocked(
address indexed account,
uint256 withdrawTime
);
event StakeWithdrawn(
address indexed account,
address withdrawAddress,
uint256 amount
);
/**
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@account-abstraction/contracts/interfaces/UserOperation.sol

// SPDX-License-Identifier: GPL-3.0
pragma 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 {
 
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@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-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@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.
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

@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 infinity
Up, // Toward infinity
Zero // 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.
*
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/base/Executor.sol

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity 0.8.17;
import {Enum} from "../common/Enum.sol";
/// @title Executor - A contract that can execute transactions
abstract contract Executor {
// Could add a flag fromEntryPoint for AA txn
event 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
)
}
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/base/FallbackManager.sol

// SPDX-License-Identifier: LGPL-3.0-only
pragma 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 1
bytes32 internal constant FALLBACK_HANDLER_STORAGE_SLOT =
0x6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d4;
event ChangedFallbackHandler(
address indexed previousHandler,
address indexed handler
);
// solhint-disable-next-line payable-fallback,no-complex-fallback
fallback() 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 calldata
mstore(calldatasize(), shl(96, caller()))
// Add 20 bytes for the address appended add the end
let success := call(
gas(),
handler,
0,
0,
add(calldatasize(), 20),
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/base/ModuleManager.sol

// SPDX-License-Identifier: LGPL-3.0-only
pragma 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 is
SelfAuthorized,
Executor,
ModuleManagerErrors
{
address internal constant SENTINEL_MODULES = address(0x1);
mapping(address => address) internal _modules;
uint256[24] private __gap;
// Events
event 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.
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/common/Enum.sol

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity 0.8.17;
/// @title Enum - Collection of enums
abstract contract Enum {
enum Operation {
Call,
DelegateCall
}
}
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/common/Errors.sol

// SPDX-License-Identifier: LGPL-3.0-only
pragma 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);
 
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/common/SelfAuthorized.sol

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity 0.8.17;
import {SelfAuthorizedErrors} from "../common/Errors.sol";
/// @title SelfAuthorized - authorizes current contract to perform actions
contract 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);
}
}
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/interfaces/IAuthorizationModule.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import {UserOperation} from "@account-abstraction/contracts/interfaces/UserOperation.sol";
// interface for modules to verify singatures signed over userOpHash
interface IAuthorizationModule {
function validateUserOp(
UserOperation calldata userOp,
bytes32 userOpHash
) external returns (uint256 validationData);
}
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/interfaces/IERC165.sol

// SPDX-License-Identifier: LGPL-3.0-only
pragma solidity 0.8.17;
/// @notice More details at https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol
interface 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);
}
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/interfaces/ISignatureValidator.sol

// SPDX-License-Identifier: LGPL-3.0-only
pragma 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);
}
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

contracts/smart-account/libs/LibAddress.sol

// SPDX-License-Identifier: MIT
pragma 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;
}
}
×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”×”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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