Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 21 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21345602 | 16 days ago | Contract Creation | 0 ETH | |||
21331526 | 18 days ago | Contract Creation | 0 ETH | |||
21293055 | 24 days ago | Contract Creation | 0 ETH | |||
21279382 | 26 days ago | Contract Creation | 0 ETH | |||
21262354 | 28 days ago | Contract Creation | 0 ETH | |||
21121335 | 48 days ago | Contract Creation | 0 ETH | |||
21113882 | 49 days ago | Contract Creation | 0 ETH | |||
20840196 | 87 days ago | Contract Creation | 0 ETH | |||
20639472 | 115 days ago | Contract Creation | 0 ETH | |||
20579320 | 123 days ago | Contract Creation | 0 ETH | |||
20576848 | 124 days ago | Contract Creation | 0 ETH | |||
20526086 | 131 days ago | Contract Creation | 0 ETH | |||
20376601 | 152 days ago | Contract Creation | 0 ETH | |||
20176907 | 179 days ago | Contract Creation | 0 ETH | |||
20142667 | 184 days ago | Contract Creation | 0 ETH | |||
19882963 | 221 days ago | Contract Creation | 0 ETH | |||
19760500 | 238 days ago | Contract Creation | 0 ETH | |||
19549368 | 267 days ago | Contract Creation | 0 ETH | |||
18940127 | 353 days ago | 0.1 ETH | ||||
18940127 | 353 days ago | 0.1 ETH | ||||
18940127 | 353 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
KernelFactory
Compiler Version
v0.8.22+commit.4fc1097e
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {AdminLessERC1967Factory} from "./AdminLessERC1967Factory.sol"; import {IEntryPoint} from "I4337/interfaces/IEntryPoint.sol"; import {Ownable} from "solady/auth/Ownable.sol"; contract KernelFactory is AdminLessERC1967Factory, Ownable { IEntryPoint public entryPoint; mapping(address => bool) public isAllowedImplementation; constructor(address _owner, IEntryPoint _entryPoint) { _initializeOwner(_owner); entryPoint = _entryPoint; } function setImplementation(address _implementation, bool _allow) external onlyOwner { isAllowedImplementation[_implementation] = _allow; } function setEntryPoint(IEntryPoint _entryPoint) external onlyOwner { entryPoint = _entryPoint; } function createAccount(address _implementation, bytes calldata _data, uint256 _index) external payable returns (address proxy) { require(isAllowedImplementation[_implementation], "KernelFactory: implementation not allowed"); bytes32 salt = bytes32(uint256(keccak256(abi.encodePacked(_data, _index))) & type(uint96).max); proxy = deployDeterministicAndCall(_implementation, salt, _data); } function getAccountAddress(bytes calldata _data, uint256 _index) public view returns (address) { bytes32 salt = bytes32(uint256(keccak256(abi.encodePacked(_data, _index))) & type(uint96).max); return predictDeterministicAddress(salt); } // stake functions function addStake(uint32 unstakeDelaySec) external payable onlyOwner { entryPoint.addStake{value: msg.value}(unstakeDelaySec); } function unlockStake() external onlyOwner { entryPoint.unlockStake(); } function withdrawStake(address payable withdrawAddress) external onlyOwner { entryPoint.withdrawStake(withdrawAddress); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Factory for deploying and managing ERC1967 proxy contracts. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ERC1967Factory.sol) /// @author jtriley-eth (https://github.com/jtriley-eth/minimum-viable-proxy) /// @author taeklee (https://github.com/zerodevapp/kernel) contract AdminLessERC1967Factory { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The proxy deployment failed. error DeploymentFailed(); /// @dev The salt does not start with the caller. error SaltDoesNotStartWithCaller(); /// @dev `bytes4(keccak256(bytes("DeploymentFailed()")))`. uint256 internal constant _DEPLOYMENT_FAILED_ERROR_SELECTOR = 0x30116425; /// @dev `bytes4(keccak256(bytes("SaltDoesNotStartWithCaller()")))`. uint256 internal constant _SALT_DOES_NOT_START_WITH_CALLER_ERROR_SELECTOR = 0x2f634836; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev A proxy has been deployed. event Deployed(address indexed proxy, address indexed implementation); /// @dev `keccak256(bytes("Deployed(address,address)"))`. uint256 internal constant _DEPLOYED_EVENT_SIGNATURE = 0x09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ERC-1967 storage slot for the implementation in the proxy. /// `uint256(keccak256("eip1967.proxy.implementation")) - 1`. uint256 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* DEPLOY FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Deploys a proxy for `implementation`, with `salt`, /// and returns its deterministic address. /// The value passed into this function will be forwarded to the proxy. /// Then, calls the proxy with abi encoded `data`. function deployDeterministicAndCall(address implementation, bytes32 salt, bytes calldata data) internal returns (address proxy) { /// @solidity memory-safe-assembly assembly { // If the salt does not start with the zero address or the caller. if iszero(or(iszero(shr(96, salt)), eq(caller(), shr(96, salt)))) { mstore(0x00, _SALT_DOES_NOT_START_WITH_CALLER_ERROR_SELECTOR) revert(0x1c, 0x04) } } proxy = _deploy(implementation, salt, data); } /// @dev Deploys the proxy, with optionality to deploy deterministically with a `salt`. function _deploy(address implementation, bytes32 salt, bytes calldata data) internal returns (address proxy) { bytes memory m = _initCode(); /// @solidity memory-safe-assembly assembly { let hash := keccak256(add(m, 0x13), 0x89) // Compute and store the bytecode hash. mstore8(0x00, 0xff) // Write the prefix. mstore(0x35, hash) mstore(0x01, shl(96, address())) mstore(0x15, salt) proxy := keccak256(0x00, 0x55) // Restore the part of the free memory pointer that has been overwritten. mstore(0x35, 0) if iszero(extcodesize(proxy)) { proxy := create2(0, add(m, 0x13), 0x89, salt) if iszero(proxy) { // Revert if the creation fails. mstore(0x00, _DEPLOYMENT_FAILED_ERROR_SELECTOR) revert(0x1c, 0x04) } // Set up the calldata to set the implementation of the proxy. mstore(m, implementation) mstore(add(m, 0x20), _IMPLEMENTATION_SLOT) calldatacopy(add(m, 0x40), data.offset, data.length) // Try setting the implementation on the proxy and revert upon failure. if iszero(call(gas(), proxy, callvalue(), m, add(0x40, data.length), 0x00, 0x00)) { // Revert with the `DeploymentFailed` selector if there is no error returndata. if iszero(returndatasize()) { mstore(0x00, _DEPLOYMENT_FAILED_ERROR_SELECTOR) revert(0x1c, 0x04) } // Otherwise, bubble up the returned error. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // Emit the {Deployed} event. log3(0, 0, _DEPLOYED_EVENT_SIGNATURE, proxy, implementation) } } } /// @dev Returns the address of the proxy deployed with `salt`. function predictDeterministicAddress(bytes32 salt) public view returns (address predicted) { bytes32 hash = initCodeHash(); /// @solidity memory-safe-assembly assembly { // Compute and store the bytecode hash. mstore8(0x00, 0xff) // Write the prefix. mstore(0x35, hash) mstore(0x01, shl(96, address())) mstore(0x15, salt) predicted := keccak256(0x00, 0x55) // Restore the part of the free memory pointer that has been overwritten. mstore(0x35, 0) } } /// @dev Returns the initialization code hash of the proxy. /// Used for mining vanity addresses with create2crunch. function initCodeHash() public view returns (bytes32 result) { bytes memory m = _initCode(); /// @solidity memory-safe-assembly assembly { result := keccak256(add(m, 0x13), 0x89) } } /// @dev Returns the initialization code of a proxy created via this factory. function _initCode() internal view returns (bytes memory m) { /// @solidity memory-safe-assembly assembly { /** * -------------------------------------------------------------------------------------+ * CREATION (9 bytes) | * -------------------------------------------------------------------------------------| * Opcode | Mnemonic | Stack | Memory | * -------------------------------------------------------------------------------------| * 60 runSize | PUSH1 runSize | r | | * 3d | RETURNDATASIZE | 0 r | | * 81 | DUP2 | r 0 r | | * 60 offset | PUSH1 offset | o r 0 r | | * 3d | RETURNDATASIZE | 0 o r 0 r | | * 39 | CODECOPY | 0 r | [0..runSize): runtime code | * f3 | RETURN | | [0..runSize): runtime code | * -------------------------------------------------------------------------------------| * RUNTIME (127 bytes) | * -------------------------------------------------------------------------------------| * Opcode | Mnemonic | Stack | Memory | * -------------------------------------------------------------------------------------| * | * ::: keep some values in stack :::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | 0 | | * 3d | RETURNDATASIZE | 0 0 | | * | * ::: check if caller is factory ::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 33 | CALLER | c 0 0 | | * 73 factory | PUSH20 factory | f c 0 0 | | * 14 | EQ | isf 0 0 | | * 60 0x57 | PUSH1 0x57 | dest isf 0 0 | | * 57 | JUMPI | 0 0 | | * | * ::: copy calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds 0 0 | | * 3d | RETURNDATASIZE | 0 cds 0 0 | | * 3d | RETURNDATASIZE | 0 0 cds 0 0 | | * 37 | CALLDATACOPY | 0 0 | [0..calldatasize): calldata | * | * ::: delegatecall to implementation ::::::::::::::::::::::::::::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds 0 0 | [0..calldatasize): calldata | * 3d | RETURNDATASIZE | 0 cds 0 0 | [0..calldatasize): calldata | * 7f slot | PUSH32 slot | s 0 cds 0 0 | [0..calldatasize): calldata | * 54 | SLOAD | i cds 0 0 | [0..calldatasize): calldata | * 5a | GAS | g i cds 0 0 | [0..calldatasize): calldata | * f4 | DELEGATECALL | succ | [0..calldatasize): calldata | * | * ::: copy returndata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | rds succ | [0..calldatasize): calldata | * 60 0x00 | PUSH1 0x00 | 0 rds succ | [0..calldatasize): calldata | * 80 | DUP1 | 0 0 rds succ | [0..calldatasize): calldata | * 3e | RETURNDATACOPY | succ | [0..returndatasize): returndata | * | * ::: branch on delegatecall status :::::::::::::::::::::::::::::::::::::::::::::::::: | * 60 0x52 | PUSH1 0x52 | dest succ | [0..returndatasize): returndata | * 57 | JUMPI | | [0..returndatasize): returndata | * | * ::: delegatecall failed, revert :::::::::::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | rds | [0..returndatasize): returndata | * 60 0x00 | PUSH1 0x00 | 0 rds | [0..returndatasize): returndata | * fd | REVERT | | [0..returndatasize): returndata | * | * ::: delegatecall succeeded, return ::::::::::::::::::::::::::::::::::::::::::::::::: | * 5b | JUMPDEST | | [0..returndatasize): returndata | * 3d | RETURNDATASIZE | rds | [0..returndatasize): returndata | * 60 0x00 | PUSH1 0x00 | 0 rds | [0..returndatasize): returndata | * f3 | RETURN | | [0..returndatasize): returndata | * | * ::: set new implementation (caller is factory) ::::::::::::::::::::::::::::::::::::: | * 5b | JUMPDEST | 0 0 | | * 3d | RETURNDATASIZE | 0 0 0 | | * 35 | CALLDATALOAD | impl 0 0 | | * 06 0x20 | PUSH1 0x20 | w impl 0 0 | | * 35 | CALLDATALOAD | slot impl 0 0 | | * 55 | SSTORE | 0 0 | | * | * ::: no extra calldata, return :::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 60 0x40 | PUSH1 0x40 | 2w 0 0 | | * 80 | DUP1 | 2w 2w 0 0 | | * 36 | CALLDATASIZE | cds 2w 2w 0 0 | | * 11 | GT | gt 2w 0 0 | | * 15 | ISZERO | lte 2w 0 0 | | * 60 0x52 | PUSH1 0x52 | dest lte 2w 0 0 | | * 57 | JUMPI | 2w 0 0 | | * | * ::: copy extra calldata to memory :::::::::::::::::::::::::::::::::::::::::::::::::: | * 36 | CALLDATASIZE | cds 2w 0 0 | | * 03 | SUB | t 0 0 | | * 80 | DUP1 | t t 0 0 | | * 60 0x40 | PUSH1 0x40 | 2w t t 0 0 | | * 3d | RETURNDATASIZE | 0 2w t t 0 0 | | * 37 | CALLDATACOPY | t 0 0 | [0..t): extra calldata | * | * ::: delegatecall to implementation ::::::::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | 0 t 0 0 | [0..t): extra calldata | * 3d | RETURNDATASIZE | 0 0 t 0 0 | [0..t): extra calldata | * 35 | CALLDATALOAD | i t 0 0 | [0..t): extra calldata | * 5a | GAS | g i t 0 0 | [0..t): extra calldata | * f4 | DELEGATECALL | succ | [0..t): extra calldata | * | * ::: copy returndata to memory :::::::::::::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | rds succ | [0..t): extra calldata | * 60 0x00 | PUSH1 0x00 | 0 rds succ | [0..t): extra calldata | * 80 | DUP1 | 0 0 rds succ | [0..t): extra calldata | * 3e | RETURNDATACOPY | succ | [0..returndatasize): returndata | * | * ::: branch on delegatecall status :::::::::::::::::::::::::::::::::::::::::::::::::: | * 60 0x52 | PUSH1 0x52 | dest succ | [0..returndatasize): returndata | * 57 | JUMPI | | [0..returndatasize): returndata | * | * ::: delegatecall failed, revert :::::::::::::::::::::::::::::::::::::::::::::::::::: | * 3d | RETURNDATASIZE | rds | [0..returndatasize): returndata | * 60 0x00 | PUSH1 0x00 | 0 rds | [0..returndatasize): returndata | * fd | REVERT | | [0..returndatasize): returndata | * -------------------------------------------------------------------------------------+ */ m := mload(0x40) // forgefmt: disable-start switch shr(112, address()) case 0 { // If the factory's address has six or more leading zero bytes. mstore(add(m, 0x75), 0x604c573d6000fd) // 7 mstore(add(m, 0x6e), 0x3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e) // 32 mstore(add(m, 0x4e), 0x3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b) // 32 mstore(add(m, 0x2e), 0x14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc) // 32 mstore(add(m, 0x0e), address()) // 14 mstore(m, 0x60793d8160093d39f33d3d336d) // 9 + 4 } default { mstore(add(m, 0x7b), 0x6052573d6000fd) // 7 mstore(add(m, 0x74), 0x3d356020355560408036111560525736038060403d373d3d355af43d6000803e) // 32 mstore(add(m, 0x54), 0x3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b) // 32 mstore(add(m, 0x34), 0x14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc) // 32 mstore(add(m, 0x14), address()) // 20 mstore(m, 0x607f3d8160093d39f33d3d3373) // 9 + 4 } // forgefmt: disable-end } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* HELPERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Helper function to return an empty bytes calldata. function _emptyData() internal pure returns (bytes calldata data) { /// @solidity memory-safe-assembly assembly { data.length := 0 } } }
/** ** 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. * @param userOpHash - The request unique identifier. * @param sender - The sender of this request. * @param nonce - The nonce used in the request. * @param revertReason - The return bytes from the (reverted) call to "callData". */ event UserOperationRevertReason( bytes32 indexed userOpHash, address indexed sender, uint256 nonce, bytes revertReason ); /** * An event emitted by handleOps(), before starting the execution loop. * Any event emitted before this event, is part of the validation. */ event BeforeExecution(); /** * Signature aggregator used by the following UserOperationEvents within this bundle. * @param aggregator - The aggregator used for the following UserOperationEvents. */ event SignatureAggregatorChanged(address indexed aggregator); /** * A custom revert error of handleOps, to identify the offending op. * Should be caught in off-chain handleOps simulation and not happen on-chain. * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts. * NOTE: If simulateValidation passes successfully, there should be no reason for handleOps to fail on it. * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero). * @param reason - Revert reason. The string starts with a unique code "AAmn", * where "m" is "1" for factory, "2" for account and "3" for paymaster issues, * so a failure can be attributed to the correct entity. */ error FailedOp(uint256 opIndex, string reason); /** * Error case when a signature aggregator fails to verify the aggregated signature it had created. * @param aggregator The aggregator that failed to verify the signature */ error SignatureValidationFailed(address aggregator); // Return value of getSenderAddress. error SenderAddressResult(address sender); // UserOps handled, per aggregator. struct UserOpsPerAggregator { UserOperation[] userOps; // Aggregator address IAggregator aggregator; // Aggregated signature bytes signature; } /** * Execute a batch of UserOperations. * No signature aggregator is used. * If any account requires an aggregator (that is, it returned an aggregator when * performing simulateValidation), then handleAggregatedOps() must be used instead. * @param ops - The operations to execute. * @param beneficiary - The address to receive the fees. */ function handleOps( UserOperation[] calldata ops, address payable beneficiary ) external; /** * Execute a batch of UserOperation with Aggregators * @param opsPerAggregator - The operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts). * @param beneficiary - The address to receive the fees. */ function handleAggregatedOps( UserOpsPerAggregator[] calldata opsPerAggregator, address payable beneficiary ) external; /** * Generate a request Id - unique identifier for this request. * The request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid. * @param userOp - The user operation to generate the request ID for. */ function getUserOpHash( UserOperation calldata userOp ) external view returns (bytes32); /** * Gas and return values during simulation. * @param preOpGas - The gas used for validation (including preValidationGas) * @param prefund - The required prefund for this operation * @param sigFailed - ValidateUserOp's (or paymaster's) signature check failed * @param validAfter - First timestamp this UserOp is valid (merging account and paymaster time-range) * @param validUntil - Last timestamp this UserOp is valid (merging account and paymaster time-range) * @param paymasterContext - Returned by validatePaymasterUserOp (to be passed into postOp) */ struct ReturnInfo { uint256 preOpGas; uint256 prefund; bool sigFailed; uint48 validAfter; uint48 validUntil; bytes paymasterContext; } /** * Returned aggregated signature info: * The aggregator returned by the account, and its current stake. */ struct AggregatorStakeInfo { address aggregator; StakeInfo stakeInfo; } /** * Get counterfactual sender address. * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation. * This method always revert, and returns the address in SenderAddressResult error * @param initCode - The constructor code to be passed into the UserOperation. */ function getSenderAddress(bytes memory initCode) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Simple single owner authorization mixin. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol) /// /// @dev Note: /// This implementation does NOT auto-initialize the owner to `msg.sender`. /// You MUST call the `_initializeOwner` in the constructor / initializer. /// /// While the ownable portion follows /// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility, /// the nomenclature for the 2-step ownership handover may be unique to this codebase. abstract contract Ownable { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The caller is not authorized to call the function. error Unauthorized(); /// @dev The `newOwner` cannot be the zero address. error NewOwnerIsZeroAddress(); /// @dev The `pendingOwner` does not have a valid handover request. error NoHandoverRequest(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* EVENTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ownership is transferred from `oldOwner` to `newOwner`. /// This event is intentionally kept the same as OpenZeppelin's Ownable to be /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173), /// despite it not being as lightweight as a single argument event. event OwnershipTransferred(address indexed oldOwner, address indexed newOwner); /// @dev An ownership handover to `pendingOwner` has been requested. event OwnershipHandoverRequested(address indexed pendingOwner); /// @dev The ownership handover to `pendingOwner` has been canceled. event OwnershipHandoverCanceled(address indexed pendingOwner); /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`. uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE = 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0; /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE = 0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d; /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`. uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE = 0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STORAGE */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The owner slot is given by: `not(_OWNER_SLOT_NOT)`. /// It is intentionally chosen to be a high value /// to avoid collision with lower slots. /// The choice of manual storage layout is to enable compatibility /// with both regular and upgradeable contracts. uint256 private constant _OWNER_SLOT_NOT = 0x8b78c6d8; /// The ownership handover slot of `newOwner` is given by: /// ``` /// mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED)) /// let handoverSlot := keccak256(0x00, 0x20) /// ``` /// It stores the expiry timestamp of the two-step ownership handover. uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* INTERNAL FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Initializes the owner directly without authorization guard. /// This function must be called upon initialization, /// regardless of whether the contract is upgradeable or not. /// This is to enable generalization to both regular and upgradeable contracts, /// and to save gas in case the initial owner is not the caller. /// For performance reasons, this function will not check if there /// is an existing owner. function _initializeOwner(address newOwner) internal virtual { /// @solidity memory-safe-assembly assembly { // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Store the new value. sstore(not(_OWNER_SLOT_NOT), newOwner) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner) } } /// @dev Sets the owner directly without authorization guard. function _setOwner(address newOwner) internal virtual { /// @solidity memory-safe-assembly assembly { let ownerSlot := not(_OWNER_SLOT_NOT) // Clean the upper 96 bits. newOwner := shr(96, shl(96, newOwner)) // Emit the {OwnershipTransferred} event. log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner) // Store the new value. sstore(ownerSlot, newOwner) } } /// @dev Throws if the sender is not the owner. function _checkOwner() internal view virtual { /// @solidity memory-safe-assembly assembly { // If the caller is not the stored owner, revert. if iszero(eq(caller(), sload(not(_OWNER_SLOT_NOT)))) { mstore(0x00, 0x82b42900) // `Unauthorized()`. revert(0x1c, 0x04) } } } /// @dev Returns how long a two-step ownership handover is valid for in seconds. /// Override to return a different value if needed. /// Made internal to conserve bytecode. Wrap it in a public function if needed. function _ownershipHandoverValidFor() internal view virtual returns (uint64) { return 48 * 3600; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC UPDATE FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Allows the owner to transfer the ownership to `newOwner`. function transferOwnership(address newOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { if iszero(shl(96, newOwner)) { mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`. revert(0x1c, 0x04) } } _setOwner(newOwner); } /// @dev Allows the owner to renounce their ownership. function renounceOwnership() public payable virtual onlyOwner { _setOwner(address(0)); } /// @dev Request a two-step ownership handover to the caller. /// The request will automatically expire in 48 hours (172800 seconds) by default. function requestOwnershipHandover() public payable virtual { unchecked { uint256 expires = block.timestamp + _ownershipHandoverValidFor(); /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to `expires`. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), expires) // Emit the {OwnershipHandoverRequested} event. log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller()) } } } /// @dev Cancels the two-step ownership handover to the caller, if any. function cancelOwnershipHandover() public payable virtual { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, caller()) sstore(keccak256(0x0c, 0x20), 0) // Emit the {OwnershipHandoverCanceled} event. log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller()) } } /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`. /// Reverts if there is no existing ownership handover requested by `pendingOwner`. function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner { /// @solidity memory-safe-assembly assembly { // Compute and set the handover slot to 0. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) let handoverSlot := keccak256(0x0c, 0x20) // If the handover does not exist, or has expired. if gt(timestamp(), sload(handoverSlot)) { mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`. revert(0x1c, 0x04) } // Set the handover slot to 0. sstore(handoverSlot, 0) } _setOwner(pendingOwner); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* PUBLIC READ FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the owner of the contract. function owner() public view virtual returns (address result) { /// @solidity memory-safe-assembly assembly { result := sload(not(_OWNER_SLOT_NOT)) } } /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`. function ownershipHandoverExpiresAt(address pendingOwner) public view virtual returns (uint256 result) { /// @solidity memory-safe-assembly assembly { // Compute the handover slot. mstore(0x0c, _HANDOVER_SLOT_SEED) mstore(0x00, pendingOwner) // Load the handover slot. result := sload(keccak256(0x0c, 0x20)) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MODIFIERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Marks a function as only callable by the owner. modifier onlyOwner() virtual { _checkOwner(); _; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.12; /* solhint-disable no-inline-assembly */ /** * 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; }
// 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 ); /** * @param deposit - The entity's deposit. * @param staked - True if this entity is staked. * @param stake - Actual amount of ether staked for this entity. * @param unstakeDelaySec - Minimum delay to withdraw the stake. * @param withdrawTime - First block timestamp where 'withdrawStake' will be callable, or zero if already locked. * @dev Sizes were chosen so that (deposit,staked, stake) fit into one cell (used during handleOps) * and the rest fit into a 2nd cell. * - 112 bit allows for 10^15 eth * - 48 bit for full timestamp * - 32 bit allows 150 years for unstake delay */ struct DepositInfo { uint112 deposit; bool staked; uint112 stake; uint32 unstakeDelaySec; uint48 withdrawTime; } // API struct used by getStakeInfo and simulateValidation. struct StakeInfo { uint256 stake; uint256 unstakeDelaySec; } /** * Get deposit info. * @param account - The account to query. * @return info - Full deposit information of given account. */ function getDepositInfo( address account ) external view returns (DepositInfo memory info); /** * Get account balance. * @param account - The account to query. * @return - The deposit (for gas payment) of the account. */ function balanceOf(address account) external view returns (uint256); /** * Add to the deposit of the given account. * @param account - The account to add to. */ function depositTo(address account) external payable; /** * Add to the account's stake - amount and delay * any pending unstake is first cancelled. * @param _unstakeDelaySec - The new lock duration before the deposit can be withdrawn. */ function addStake(uint32 _unstakeDelaySec) external payable; /** * Attempt to unlock the stake. * The value can be withdrawn (using withdrawStake) after the unstake delay. */ function unlockStake() external; /** * Withdraw from the (unlocked) stake. * Must first call unlockStake and wait for the unstakeDelay to pass. * @param withdrawAddress - The address to send withdrawn value. */ function withdrawStake(address payable withdrawAddress) external; /** * Withdraw from the deposit. * @param withdrawAddress - The address to send withdrawn value. * @param withdrawAmount - The amount to withdraw. */ function withdrawTo( address payable withdrawAddress, uint256 withdrawAmount ) external; }
// 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. * @param userOps - Array of UserOperations to validate the signature for. * @param signature - The aggregated signature. */ 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); }
// 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; }
{ "remappings": [ "zerodev-kernel/=lib/kernel/src/", "solady/=lib/solady/src/", "I4337/=lib/kernel/lib/I4337/src/", "ds-test/=lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "kernel/=lib/kernel/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin-contracts/contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DeploymentFailed","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"SaltDoesNotStartWithCaller","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proxy","type":"address"},{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Deployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"createAccount","outputs":[{"internalType":"address","name":"proxy","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getAccountAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initCodeHash","outputs":[{"internalType":"bytes32","name":"result","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedImplementation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"predictDeterministicAddress","outputs":[{"internalType":"address","name":"predicted","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"name":"setEntryPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"bool","name":"_allow","type":"bool"}],"name":"setImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051610cc0380380610cc083398101604081905261002f916100b2565b6100388261005e565b600080546001600160a01b0319166001600160a01b0392909216919091179055506100ec565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b6001600160a01b03811681146100af57600080fd5b50565b600080604083850312156100c557600080fd5b82516100d08161009a565b60208401519092506100e18161009a565b809150509250929050565b610bc5806100fb6000396000f3fe6080604052600436106101095760003560e01c80638da5cb5b11610095578063c23a5cea11610064578063c23a5cea14610279578063db4c545e14610299578063f04e283e146102bc578063f2fde38b146102cf578063fee81cf4146102e257600080fd5b80638da5cb5b1461020b578063b0d691fe14610224578063bb30a97414610244578063bb9fe6bf1461026457600080fd5b80635414dff0116100dc5780635414dff01461017b57806354d1f13d1461019b578063584465f2146101a35780636544c828146101c3578063715018a61461020357600080fd5b80630396cb601461010e5780632569296214610123578063296601cd1461012b5780634d6cb7001461015b575b600080fd5b61012161011c3660046109d6565b610315565b005b610121610384565b61013e610139366004610a61565b6103d4565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016757600080fd5b5061013e610176366004610abd565b6104a9565b34801561018757600080fd5b5061013e610196366004610b09565b6104fd565b610121610530565b3480156101af57600080fd5b506101216101be366004610b22565b61056c565b3480156101cf57600080fd5b506101f36101de366004610b22565b60016020526000908152604090205460ff1681565b6040519015158152602001610152565b610121610596565b34801561021757600080fd5b50638b78c6d8195461013e565b34801561023057600080fd5b5060005461013e906001600160a01b031681565b34801561025057600080fd5b5061012161025f366004610b3f565b6105aa565b34801561027057600080fd5b506101216105dd565b34801561028557600080fd5b50610121610294366004610b22565b610640565b3480156102a557600080fd5b506102ae6106aa565b604051908152602001610152565b6101216102ca366004610b22565b6106c3565b6101216102dd366004610b22565b610703565b3480156102ee57600080fd5b506102ae6102fd366004610b22565b63389a75e1600c908152600091909152602090205490565b61031d61072a565b600054604051621cb65b60e51b815263ffffffff831660048201526001600160a01b0390911690630396cb609034906024016000604051808303818588803b15801561036857600080fd5b505af115801561037c573d6000803e3d6000fd5b505050505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6001600160a01b03841660009081526001602052604081205460ff166104525760405162461bcd60e51b815260206004820152602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b606482015260840160405180910390fd5b60006bffffffffffffffffffffffff801685858560405160200161047893929190610b7d565b60408051601f19818403018152919052805160209091012016905061049f86828787610745565b9695505050505050565b6000806bffffffffffffffffffffffff80168585856040516020016104d093929190610b7d565b60408051601f1981840301815291905280516020909101201690506104f4816104fd565b95945050505050565b6000806105086106aa565b905060ff600053806035523060601b6001528260155260556000209150600060355250919050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b61057461072a565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b61059e61072a565b6105a86000610771565b565b6105b261072a565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6105e561072a565b600080546040805163bb9fe6bf60e01b815290516001600160a01b039092169263bb9fe6bf9260048084019382900301818387803b15801561062657600080fd5b505af115801561063a573d6000803e3d6000fd5b50505050565b61064861072a565b60005460405163611d2e7560e11b81526001600160a01b0383811660048301529091169063c23a5cea90602401600060405180830381600087803b15801561068f57600080fd5b505af11580156106a3573d6000803e3d6000fd5b5050505050565b6000806106b56107af565b608960139091012092915050565b6106cb61072a565b63389a75e1600c52806000526020600c2080544211156106f357636f5e88186000526004601cfd5b6000905561070081610771565b50565b61070b61072a565b8060601b61072157637448fbae6000526004601cfd5b61070081610771565b638b78c6d8195433146105a8576382b429006000526004601cfd5b60008360601c33148460601c151761076557632f6348366000526004601cfd5b6104f4858585856108ee565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6040513060701c801561085557666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d337382525090565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d82525090565b6000806108f96107af565b90506089601382012060ff60005380603552503060601b60015284601552605560002091506000603552813b6109cd57846089601383016000f59150816109485763301164256000526004601cfd5b8581527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc602082015282846040830137600080846040018334865af16109a5573d61099b5763301164256000526004601cfd5b3d6000803e3d6000fd5b85827f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20600080a35b50949350505050565b6000602082840312156109e857600080fd5b813563ffffffff811681146109fc57600080fd5b9392505050565b6001600160a01b038116811461070057600080fd5b60008083601f840112610a2a57600080fd5b50813567ffffffffffffffff811115610a4257600080fd5b602083019150836020828501011115610a5a57600080fd5b9250929050565b60008060008060608587031215610a7757600080fd5b8435610a8281610a03565b9350602085013567ffffffffffffffff811115610a9e57600080fd5b610aaa87828801610a18565b9598909750949560400135949350505050565b600080600060408486031215610ad257600080fd5b833567ffffffffffffffff811115610ae957600080fd5b610af586828701610a18565b909790965060209590950135949350505050565b600060208284031215610b1b57600080fd5b5035919050565b600060208284031215610b3457600080fd5b81356109fc81610a03565b60008060408385031215610b5257600080fd5b8235610b5d81610a03565b915060208301358015158114610b7257600080fd5b809150509250929050565b8284823790910190815260200191905056fea26469706673582212207fb63c4a747fc7bc3783777ff55e9f886f2592115e1153504435291b38d0e8a064736f6c63430008160033000000000000000000000000817a497fd7316037e545b25e69a7dac35a3ae7750000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789
Deployed Bytecode
0x6080604052600436106101095760003560e01c80638da5cb5b11610095578063c23a5cea11610064578063c23a5cea14610279578063db4c545e14610299578063f04e283e146102bc578063f2fde38b146102cf578063fee81cf4146102e257600080fd5b80638da5cb5b1461020b578063b0d691fe14610224578063bb30a97414610244578063bb9fe6bf1461026457600080fd5b80635414dff0116100dc5780635414dff01461017b57806354d1f13d1461019b578063584465f2146101a35780636544c828146101c3578063715018a61461020357600080fd5b80630396cb601461010e5780632569296214610123578063296601cd1461012b5780634d6cb7001461015b575b600080fd5b61012161011c3660046109d6565b610315565b005b610121610384565b61013e610139366004610a61565b6103d4565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016757600080fd5b5061013e610176366004610abd565b6104a9565b34801561018757600080fd5b5061013e610196366004610b09565b6104fd565b610121610530565b3480156101af57600080fd5b506101216101be366004610b22565b61056c565b3480156101cf57600080fd5b506101f36101de366004610b22565b60016020526000908152604090205460ff1681565b6040519015158152602001610152565b610121610596565b34801561021757600080fd5b50638b78c6d8195461013e565b34801561023057600080fd5b5060005461013e906001600160a01b031681565b34801561025057600080fd5b5061012161025f366004610b3f565b6105aa565b34801561027057600080fd5b506101216105dd565b34801561028557600080fd5b50610121610294366004610b22565b610640565b3480156102a557600080fd5b506102ae6106aa565b604051908152602001610152565b6101216102ca366004610b22565b6106c3565b6101216102dd366004610b22565b610703565b3480156102ee57600080fd5b506102ae6102fd366004610b22565b63389a75e1600c908152600091909152602090205490565b61031d61072a565b600054604051621cb65b60e51b815263ffffffff831660048201526001600160a01b0390911690630396cb609034906024016000604051808303818588803b15801561036857600080fd5b505af115801561037c573d6000803e3d6000fd5b505050505050565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6001600160a01b03841660009081526001602052604081205460ff166104525760405162461bcd60e51b815260206004820152602960248201527f4b65726e656c466163746f72793a20696d706c656d656e746174696f6e206e6f6044820152681d08185b1b1bddd95960ba1b606482015260840160405180910390fd5b60006bffffffffffffffffffffffff801685858560405160200161047893929190610b7d565b60408051601f19818403018152919052805160209091012016905061049f86828787610745565b9695505050505050565b6000806bffffffffffffffffffffffff80168585856040516020016104d093929190610b7d565b60408051601f1981840301815291905280516020909101201690506104f4816104fd565b95945050505050565b6000806105086106aa565b905060ff600053806035523060601b6001528260155260556000209150600060355250919050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b61057461072a565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b61059e61072a565b6105a86000610771565b565b6105b261072a565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6105e561072a565b600080546040805163bb9fe6bf60e01b815290516001600160a01b039092169263bb9fe6bf9260048084019382900301818387803b15801561062657600080fd5b505af115801561063a573d6000803e3d6000fd5b50505050565b61064861072a565b60005460405163611d2e7560e11b81526001600160a01b0383811660048301529091169063c23a5cea90602401600060405180830381600087803b15801561068f57600080fd5b505af11580156106a3573d6000803e3d6000fd5b5050505050565b6000806106b56107af565b608960139091012092915050565b6106cb61072a565b63389a75e1600c52806000526020600c2080544211156106f357636f5e88186000526004601cfd5b6000905561070081610771565b50565b61070b61072a565b8060601b61072157637448fbae6000526004601cfd5b61070081610771565b638b78c6d8195433146105a8576382b429006000526004601cfd5b60008360601c33148460601c151761076557632f6348366000526004601cfd5b6104f4858585856108ee565b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6040513060701c801561085557666052573d6000fd607b8301527f3d356020355560408036111560525736038060403d373d3d355af43d6000803e60748301527f3735a920a3ca505d382bbc545af43d6000803e6052573d6000fd5b3d6000f35b60548301527f14605757363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc60348301523060148301526c607f3d8160093d39f33d3d337382525090565b66604c573d6000fd60758301527f3d3560203555604080361115604c5736038060403d373d3d355af43d6000803e606e8301527f3735a920a3ca505d382bbc545af43d6000803e604c573d6000fd5b3d6000f35b604e8301527f14605157363d3d37363d7f360894a13ba1a3210667c828492db98dca3e2076cc602e83015230600e8301526c60793d8160093d39f33d3d336d82525090565b6000806108f96107af565b90506089601382012060ff60005380603552503060601b60015284601552605560002091506000603552813b6109cd57846089601383016000f59150816109485763301164256000526004601cfd5b8581527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc602082015282846040830137600080846040018334865af16109a5573d61099b5763301164256000526004601cfd5b3d6000803e3d6000fd5b85827f09e48df7857bd0c1e0d31bb8a85d42cf1874817895f171c917f6ee2cea73ec20600080a35b50949350505050565b6000602082840312156109e857600080fd5b813563ffffffff811681146109fc57600080fd5b9392505050565b6001600160a01b038116811461070057600080fd5b60008083601f840112610a2a57600080fd5b50813567ffffffffffffffff811115610a4257600080fd5b602083019150836020828501011115610a5a57600080fd5b9250929050565b60008060008060608587031215610a7757600080fd5b8435610a8281610a03565b9350602085013567ffffffffffffffff811115610a9e57600080fd5b610aaa87828801610a18565b9598909750949560400135949350505050565b600080600060408486031215610ad257600080fd5b833567ffffffffffffffff811115610ae957600080fd5b610af586828701610a18565b909790965060209590950135949350505050565b600060208284031215610b1b57600080fd5b5035919050565b600060208284031215610b3457600080fd5b81356109fc81610a03565b60008060408385031215610b5257600080fd5b8235610b5d81610a03565b915060208301358015158114610b7257600080fd5b809150509250929050565b8284823790910190815260200191905056fea26469706673582212207fb63c4a747fc7bc3783777ff55e9f886f2592115e1153504435291b38d0e8a064736f6c63430008160033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000817a497fd7316037e545b25e69a7dac35a3ae7750000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789
-----Decoded View---------------
Arg [0] : _owner (address): 0x817A497Fd7316037e545B25e69A7dac35A3AE775
Arg [1] : _entryPoint (address): 0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000817a497fd7316037e545b25e69a7dac35a3ae775
Arg [1] : 0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.