Source Code
Overview
ETH Balance
0 ETH
Token Holdings
More Info
ContractCreator
Multi Chain
Multichain Addresses
6 addresses found via
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 9148308 | 110 days 7 hrs ago | IN | 0.0001 ETH | 0.0000315 | ||||
Remove Authorize... | 8752096 | 179 days 16 hrs ago | IN | 0 ETH | 0.00054588 | ||||
Add Authorized U... | 8752052 | 179 days 16 hrs ago | IN | 0 ETH | 0.00109083 | ||||
Deposit | 8752015 | 179 days 16 hrs ago | IN | 0.3 ETH | 0.00060318 | ||||
Add Stake | 8752015 | 179 days 16 hrs ago | IN | 0.1 ETH | 0.00128244 | ||||
0x60a06040 | 8751990 | 179 days 16 hrs ago | IN | Create: SponsorPaymaster | 0 ETH | 0.2432774 |
Latest 7 internal transactions
Advanced mode:
Loading...
Loading
Contract Name:
SponsorPaymaster
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.12; import "@account-abstraction/contracts/core/BasePaymaster.sol"; /** * Paymaster that pays for everything, given the user is authorized. * Based on contract provided by Ethereum Foundation. */ contract SponsorPaymaster is BasePaymaster{ mapping(address => bool) private authorized;//whitelist for paymaster access constructor(IEntryPoint _entryPoint) BasePaymaster(_entryPoint) { // to support "deterministic address" factory // solhint-disable avoid-tx-origin if (tx.origin != msg.sender) { _transferOwnership(tx.origin); } } function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost) internal virtual override view returns (bytes memory context, uint256 validationData) { //Check if the user is authorized to use the paymaster. address user = userOp.sender; require(authorized[user], "User is not authorized."); (userOp, userOpHash, maxCost); return ("", 0);//There is no paymaster data to send (e.g., time range) } //Functions to read/write whitelist //Only paymaster owner can write function addAuthorizedUser(address user) public onlyOwner{ authorized[user] = true; } function removeAuthorizedUser(address user) public onlyOwner { authorized[user] = false; } function isAuthorized(address user) public view returns (bool) { return authorized[user]; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.12; /* solhint-disable reason-string */ import "@openzeppelin/contracts/access/Ownable.sol"; import "../interfaces/IPaymaster.sol"; import "../interfaces/IEntryPoint.sol"; import "./Helpers.sol"; /** * Helper class for creating a paymaster. * provides helper methods for staking. * validates that the postOp is called only by the entryPoint */ abstract contract BasePaymaster is IPaymaster, Ownable { IEntryPoint immutable public entryPoint; constructor(IEntryPoint _entryPoint) { entryPoint = _entryPoint; } /// @inheritdoc IPaymaster function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost) external override returns (bytes memory context, uint256 validationData) { _requireFromEntryPoint(); return _validatePaymasterUserOp(userOp, userOpHash, maxCost); } function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost) internal virtual returns (bytes memory context, uint256 validationData); /// @inheritdoc IPaymaster function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external override { _requireFromEntryPoint(); _postOp(mode, context, actualGasCost); } /** * post-operation handler. * (verified to be called only through the entryPoint) * @dev if subclass returns a non-empty context from validatePaymasterUserOp, it must also implement this method. * @param mode enum with the following options: * opSucceeded - user operation succeeded. * opReverted - user op reverted. still has to pay for gas. * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. * Now this is the 2nd call, after user's op was deliberately reverted. * @param context - the context value returned by validatePaymasterUserOp * @param actualGasCost - actual gas used so far (without this postOp call). */ function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal virtual { (mode,context,actualGasCost); // unused params // subclass must override this method if validatePaymasterUserOp returns a context revert("must override"); } /** * add a deposit for this paymaster, used for paying for transaction fees */ function deposit() public payable { entryPoint.depositTo{value : msg.value}(address(this)); } /** * withdraw value from the deposit * @param withdrawAddress target to send to * @param amount to withdraw */ function withdrawTo(address payable withdrawAddress, uint256 amount) public onlyOwner { entryPoint.withdrawTo(withdrawAddress, amount); } /** * add stake for this paymaster. * This method can also carry eth value to add to the current stake. * @param unstakeDelaySec - the unstake delay for this paymaster. Can only be increased. */ function addStake(uint32 unstakeDelaySec) external payable onlyOwner { entryPoint.addStake{value : msg.value}(unstakeDelaySec); } /** * return current paymaster's deposit on the entryPoint. */ function getDeposit() public view returns (uint256) { return entryPoint.balanceOf(address(this)); } /** * unlock the stake, in order to withdraw it. * The paymaster can't serve requests once unlocked, until it calls addStake again */ function unlockStake() external onlyOwner { entryPoint.unlockStake(); } /** * withdraw the entire paymaster's stake. * stake must be unlocked first (and then wait for the unstakeDelay to be over) * @param withdrawAddress the address to send withdrawn value. */ function withdrawStake(address payable withdrawAddress) external onlyOwner { entryPoint.withdrawStake(withdrawAddress); } /// validate the call is made from a valid entrypoint function _requireFromEntryPoint() internal virtual { require(msg.sender == address(entryPoint), "Sender not EntryPoint"); } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.12; /** * 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; uint48 validUntil = accountValidationData.validUntil; uint48 pmValidAfter = pmValidationData.validAfter; uint48 pmValidUntil = pmValidationData.validUntil; if (validAfter < pmValidAfter) validAfter = pmValidAfter; if (validUntil > pmValidUntil) validUntil = pmValidUntil; return ValidationData(aggregator, validAfter, validUntil); } /** * helper to pack the return value for validateUserOp * @param data - the ValidationData to pack */ function _packValidationData(ValidationData memory data) pure returns (uint256) { return uint160(data.aggregator) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48)); } /** * helper to pack the return value for validateUserOp, when not using an aggregator * @param sigFailed - true for signature failure, false for success * @param validUntil last timestamp this UserOperation is valid (or zero for infinite) * @param validAfter first timestamp this UserOperation is valid */ function _packValidationData(bool sigFailed, uint48 validUntil, uint48 validAfter) pure returns (uint256) { return (sigFailed ? 1 : 0) | (uint256(validUntil) << 160) | (uint256(validAfter) << (160 + 48)); }
// 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); }
/** ** 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"; interface IEntryPoint is IStakeManager { /*** * 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); /** * signature aggregator used by the following UserOperationEvents within this bundle. */ event SignatureAggregatorChanged(address indexed aggregator); /** * a custom revert error of handleOps, to identify the offending op. * 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. * 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. */ error FailedOp(uint256 opIndex, string reason); /** * error case when a signature aggregator fails to verify the aggregated signature it had created. */ error SignatureValidationFailed(address aggregator); /** * Successful result from simulateValidation. * @param returnInfo gas and time-range returned values * @param senderInfo stake information about the sender * @param factoryInfo stake information about the factory (if any) * @param paymasterInfo stake information about the paymaster (if any) */ error ValidationResult(ReturnInfo returnInfo, StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo); /** * Successful result from simulateValidation, if the account returns a signature aggregator * @param returnInfo gas and time-range returned values * @param senderInfo stake information about the sender * @param factoryInfo stake information about the factory (if any) * @param paymasterInfo stake information about the paymaster (if any) * @param aggregatorInfo signature aggregation info (if the account requires signature aggregator) * bundler MUST use it to verify the signature, or reject the UserOperation */ error ValidationResultWithAggregation(ReturnInfo returnInfo, StakeInfo senderInfo, StakeInfo factoryInfo, StakeInfo paymasterInfo, AggregatorStakeInfo aggregatorInfo); /** * return value of getSenderAddress */ error SenderAddressResult(address sender); /** * return value of simulateHandleOp */ error ExecutionResult(uint256 preOpGas, uint256 paid, uint48 validAfter, uint48 validUntil, bool targetSuccess, bytes targetResult); //UserOps handled, per aggregator struct UserOpsPerAggregator { UserOperation[] userOps; // aggregator address IAggregator aggregator; // aggregated signature bytes signature; } /** * Execute a batch of UserOperation. * 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. */ function getUserOpHash(UserOperation calldata userOp) external view returns (bytes32); /** * Simulate a call to account.validateUserOp and paymaster.validatePaymasterUserOp. * @dev this method always revert. Successful result is ValidationResult error. other errors are failures. * @dev The node must also verify it doesn't use banned opcodes, and that it doesn't reference storage outside the account's data. * @param userOp the user operation to validate. */ function simulateValidation(UserOperation calldata userOp) external; /** * 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; /** * simulate full execution of a UserOperation (including both validation and target execution) * this method will always revert with "ExecutionResult". * it performs full validation of the UserOperation, but ignores signature error. * an optional target address is called after the userop succeeds, and its value is returned * (before the entire call is reverted) * Note that in order to collect the the success/failure of the target call, it must be executed * with trace enabled to track the emitted events. * @param op the UserOperation to simulate * @param target if nonzero, a target address to call after userop simulation. If called, the targetSuccess and targetResult * are set to the return from that call. * @param targetCallData callData to pass to target address */ function simulateHandleOp(UserOperation calldata op, address target, bytes calldata targetCallData) external; }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.12; import "./UserOperation.sol"; /** * the interface exposed by a paymaster contract, who agrees to pay the gas for user's operations. * a paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction. */ interface IPaymaster { enum PostOpMode { opSucceeded, // user op succeeded opReverted, // user op reverted. still has to pay for gas. postOpReverted //user op succeeded, but caused postOp to revert. Now it's a 2nd call, after user's op was deliberately reverted. } /** * payment validation: check if paymaster agrees to pay. * Must verify sender is the entryPoint. * Revert to reject this request. * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted) * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns. * @param userOp the user operation * @param userOpHash hash of the user's request data. * @param maxCost the maximum cost of this transaction (based on maximum gas and gas price from userOp) * @return context value to send to a postOp * zero length to signify postOp is not required. * @return validationData signature and time-range of this operation, encoded the same as the return value of validateUserOperation * <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 * Note that the validation code cannot use block.timestamp (or block.number) directly. */ function validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost) external returns (bytes memory context, uint256 validationData); /** * post-operation handler. * Must verify sender is the entryPoint * @param mode enum with the following options: * opSucceeded - user operation succeeded. * opReverted - user op reverted. still has to pay for gas. * postOpReverted - user op succeeded, but caused postOp (in mode=opSucceeded) to revert. * Now this is the 2nd call, after user's op was deliberately reverted. * @param context - the context value returned by validatePaymasterUserOp * @param actualGasCost - actual gas used so far (without this postOp call). */ function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external; }
// 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; } /// @return info - full deposit information of given account function getDepositInfo(address account) external view returns (DepositInfo memory info); /// @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 */ 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; /* 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; } /** * Utility functions helpful when working with UserOperation structs. */ library UserOperationLib { function getSender(UserOperation calldata userOp) internal pure returns (address) { address data; //read sender from userOp, which is first userOp member (saves 800 gas...) assembly {data := calldataload(userOp)} return address(uint160(data)); } //relayer/block builder might submit the TX with higher priorityFee, but the user should not // pay above what he signed for. function gasPrice(UserOperation calldata userOp) internal view returns (uint256) { unchecked { uint256 maxFeePerGas = userOp.maxFeePerGas; uint256 maxPriorityFeePerGas = userOp.maxPriorityFeePerGas; if (maxFeePerGas == maxPriorityFeePerGas) { //legacy mode (for networks that don't support basefee opcode) return maxFeePerGas; } return min(maxFeePerGas, maxPriorityFeePerGas + block.basefee); } } function pack(UserOperation calldata userOp) internal pure returns (bytes memory ret) { //lighter signature scheme. must match UserOp.ts#packUserOp bytes calldata sig = userOp.signature; // copy directly the userOp from calldata up to (but not including) the signature. // this encoding depends on the ABI encoding of calldata, but is much lighter to copy // than referencing each field separately. assembly { let ofs := userOp let len := sub(sub(sig.offset, ofs), 32) ret := mload(0x40) mstore(0x40, add(ret, add(len, 32))) mstore(ret, len) calldatacopy(add(ret, 32), ofs, len) } } function hash(UserOperation calldata userOp) internal pure returns (bytes32) { return keccak256(pack(userOp)); } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"inputs":[{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"addAuthorizedUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unstakeDelaySec","type":"uint32"}],"name":"addStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"entryPoint","outputs":[{"internalType":"contract IEntryPoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum IPaymaster.PostOpMode","name":"mode","type":"uint8"},{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"actualGasCost","type":"uint256"}],"name":"postOp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeAuthorizedUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"initCode","type":"bytes"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"callGasLimit","type":"uint256"},{"internalType":"uint256","name":"verificationGasLimit","type":"uint256"},{"internalType":"uint256","name":"preVerificationGas","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"bytes","name":"paymasterAndData","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct UserOperation","name":"userOp","type":"tuple"},{"internalType":"bytes32","name":"userOpHash","type":"bytes32"},{"internalType":"uint256","name":"maxCost","type":"uint256"}],"name":"validatePaymasterUserOp","outputs":[{"internalType":"bytes","name":"context","type":"bytes"},{"internalType":"uint256","name":"validationData","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"}],"name":"withdrawStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"withdrawAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200172838038062001728833981810160405281019062000037919062000224565b80620000586200004c620000da60201b60201c565b620000e260201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050503373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614620000d357620000d232620000e260201b60201c565b5b5062000256565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d882620001ab565b9050919050565b6000620001ec82620001cb565b9050919050565b620001fe81620001df565b81146200020a57600080fd5b50565b6000815190506200021e81620001f3565b92915050565b6000602082840312156200023d576200023c620001a6565b5b60006200024d848285016200020d565b91505092915050565b608051611485620002a36000396000818161033d0152818161043601528181610581015281816105ad01528181610637015281816106c7015281816107660152610a3201526114856000f3fe6080604052600436106100e85760003560e01c8063b0d691fe1161008a578063d0e30db011610059578063d0e30db014610285578063f2fde38b1461028f578063f465c77e146102b8578063fe9fbb80146102f6576100e8565b8063b0d691fe146101ef578063bb9fe6bf1461021a578063c23a5cea14610231578063c399ec881461025a576100e8565b8063715018a6116100c6578063715018a61461015b57806389fabc80146101725780638da5cb5b1461019b578063a9a23409146101c6576100e8565b80630396cb60146100ed578063177d2a7414610109578063205c287814610132575b600080fd5b61010760048036038101906101029190610c0f565b610333565b005b34801561011557600080fd5b50610130600480360381019061012b9190610c9a565b6103ca565b005b34801561013e57600080fd5b5061015960048036038101906101549190610d3b565b61042c565b005b34801561016757600080fd5b506101706104c5565b005b34801561017e57600080fd5b5061019960048036038101906101949190610c9a565b6104d9565b005b3480156101a757600080fd5b506101b061053c565b6040516101bd9190610d8a565b60405180910390f35b3480156101d257600080fd5b506101ed60048036038101906101e89190610e2f565b610565565b005b3480156101fb57600080fd5b5061020461057f565b6040516102119190610f02565b60405180910390f35b34801561022657600080fd5b5061022f6105a3565b005b34801561023d57600080fd5b5061025860048036038101906102539190610f1d565b61062d565b005b34801561026657600080fd5b5061026f6106c3565b60405161027c9190610f59565b60405180910390f35b61028d610764565b005b34801561029b57600080fd5b506102b660048036038101906102b19190610c9a565b6107f2565b005b3480156102c457600080fd5b506102df60048036038101906102da9190610fcf565b610875565b6040516102ed9291906110d7565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190610c9a565b610898565b60405161032a9190611122565b60405180910390f35b61033b6108ee565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630396cb6034836040518363ffffffff1660e01b8152600401610395919061114c565b6000604051808303818588803b1580156103ae57600080fd5b505af11580156103c2573d6000803e3d6000fd5b505050505050565b6103d26108ee565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6104346108ee565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663205c287883836040518363ffffffff1660e01b815260040161048f929190611176565b600060405180830381600087803b1580156104a957600080fd5b505af11580156104bd573d6000803e3d6000fd5b505050505050565b6104cd6108ee565b6104d7600061096c565b565b6104e16108ee565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61056d610a30565b61057984848484610ac0565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6105ab6108ee565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561061357600080fd5b505af1158015610627573d6000803e3d6000fd5b50505050565b6106356108ee565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c23a5cea826040518263ffffffff1660e01b815260040161068e919061119f565b600060405180830381600087803b1580156106a857600080fd5b505af11580156106bc573d6000803e3d6000fd5b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161071e9190610d8a565b602060405180830381865afa15801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f91906111cf565b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b760faf934306040518363ffffffff1660e01b81526004016107be9190610d8a565b6000604051808303818588803b1580156107d757600080fd5b505af11580156107eb573d6000803e3d6000fd5b5050505050565b6107fa6108ee565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108609061127f565b60405180910390fd5b6108728161096c565b50565b60606000610881610a30565b61088c858585610afb565b91509150935093915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6108f6610bc1565b73ffffffffffffffffffffffffffffffffffffffff1661091461053c565b73ffffffffffffffffffffffffffffffffffffffff161461096a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610961906112eb565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab590611357565b60405180910390fd5b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af2906113c3565b60405180910390fd5b6060600080856000016020810190610b139190610c9a565b9050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b989061142f565b60405180910390fd5b600060405180602001604052806000815250909250925050935093915050565b600033905090565b600080fd5b600080fd5b600063ffffffff82169050919050565b610bec81610bd3565b8114610bf757600080fd5b50565b600081359050610c0981610be3565b92915050565b600060208284031215610c2557610c24610bc9565b5b6000610c3384828501610bfa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c6782610c3c565b9050919050565b610c7781610c5c565b8114610c8257600080fd5b50565b600081359050610c9481610c6e565b92915050565b600060208284031215610cb057610caf610bc9565b5b6000610cbe84828501610c85565b91505092915050565b6000610cd282610c3c565b9050919050565b610ce281610cc7565b8114610ced57600080fd5b50565b600081359050610cff81610cd9565b92915050565b6000819050919050565b610d1881610d05565b8114610d2357600080fd5b50565b600081359050610d3581610d0f565b92915050565b60008060408385031215610d5257610d51610bc9565b5b6000610d6085828601610cf0565b9250506020610d7185828601610d26565b9150509250929050565b610d8481610c5c565b82525050565b6000602082019050610d9f6000830184610d7b565b92915050565b60038110610db257600080fd5b50565b600081359050610dc481610da5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610def57610dee610dca565b5b8235905067ffffffffffffffff811115610e0c57610e0b610dcf565b5b602083019150836001820283011115610e2857610e27610dd4565b5b9250929050565b60008060008060608587031215610e4957610e48610bc9565b5b6000610e5787828801610db5565b945050602085013567ffffffffffffffff811115610e7857610e77610bce565b5b610e8487828801610dd9565b93509350506040610e9787828801610d26565b91505092959194509250565b6000819050919050565b6000610ec8610ec3610ebe84610c3c565b610ea3565b610c3c565b9050919050565b6000610eda82610ead565b9050919050565b6000610eec82610ecf565b9050919050565b610efc81610ee1565b82525050565b6000602082019050610f176000830184610ef3565b92915050565b600060208284031215610f3357610f32610bc9565b5b6000610f4184828501610cf0565b91505092915050565b610f5381610d05565b82525050565b6000602082019050610f6e6000830184610f4a565b92915050565b600080fd5b60006101608284031215610f9057610f8f610f74565b5b81905092915050565b6000819050919050565b610fac81610f99565b8114610fb757600080fd5b50565b600081359050610fc981610fa3565b92915050565b600080600060608486031215610fe857610fe7610bc9565b5b600084013567ffffffffffffffff81111561100657611005610bce565b5b61101286828701610f79565b935050602061102386828701610fba565b925050604061103486828701610d26565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561107857808201518184015260208101905061105d565b83811115611087576000848401525b50505050565b6000601f19601f8301169050919050565b60006110a98261103e565b6110b38185611049565b93506110c381856020860161105a565b6110cc8161108d565b840191505092915050565b600060408201905081810360008301526110f1818561109e565b90506111006020830184610f4a565b9392505050565b60008115159050919050565b61111c81611107565b82525050565b60006020820190506111376000830184611113565b92915050565b61114681610bd3565b82525050565b6000602082019050611161600083018461113d565b92915050565b61117081610cc7565b82525050565b600060408201905061118b6000830185611167565b6111986020830184610f4a565b9392505050565b60006020820190506111b46000830184611167565b92915050565b6000815190506111c981610d0f565b92915050565b6000602082840312156111e5576111e4610bc9565b5b60006111f3848285016111ba565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006112696026836111fc565b91506112748261120d565b604082019050919050565b600060208201905081810360008301526112988161125c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006112d56020836111fc565b91506112e08261129f565b602082019050919050565b60006020820190508181036000830152611304816112c8565b9050919050565b7f53656e646572206e6f7420456e747279506f696e740000000000000000000000600082015250565b60006113416015836111fc565b915061134c8261130b565b602082019050919050565b6000602082019050818103600083015261137081611334565b9050919050565b7f6d757374206f7665727269646500000000000000000000000000000000000000600082015250565b60006113ad600d836111fc565b91506113b882611377565b602082019050919050565b600060208201905081810360008301526113dc816113a0565b9050919050565b7f55736572206973206e6f7420617574686f72697a65642e000000000000000000600082015250565b60006114196017836111fc565b9150611424826113e3565b602082019050919050565b600060208201905081810360008301526114488161140c565b905091905056fea2646970667358221220e65a5c1acbe32cf1ddf3f80d4cd1ef12639985fdab25bed64392a23c272886df64736f6c634300080d00330000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b57
Deployed Bytecode
0x6080604052600436106100e85760003560e01c8063b0d691fe1161008a578063d0e30db011610059578063d0e30db014610285578063f2fde38b1461028f578063f465c77e146102b8578063fe9fbb80146102f6576100e8565b8063b0d691fe146101ef578063bb9fe6bf1461021a578063c23a5cea14610231578063c399ec881461025a576100e8565b8063715018a6116100c6578063715018a61461015b57806389fabc80146101725780638da5cb5b1461019b578063a9a23409146101c6576100e8565b80630396cb60146100ed578063177d2a7414610109578063205c287814610132575b600080fd5b61010760048036038101906101029190610c0f565b610333565b005b34801561011557600080fd5b50610130600480360381019061012b9190610c9a565b6103ca565b005b34801561013e57600080fd5b5061015960048036038101906101549190610d3b565b61042c565b005b34801561016757600080fd5b506101706104c5565b005b34801561017e57600080fd5b5061019960048036038101906101949190610c9a565b6104d9565b005b3480156101a757600080fd5b506101b061053c565b6040516101bd9190610d8a565b60405180910390f35b3480156101d257600080fd5b506101ed60048036038101906101e89190610e2f565b610565565b005b3480156101fb57600080fd5b5061020461057f565b6040516102119190610f02565b60405180910390f35b34801561022657600080fd5b5061022f6105a3565b005b34801561023d57600080fd5b5061025860048036038101906102539190610f1d565b61062d565b005b34801561026657600080fd5b5061026f6106c3565b60405161027c9190610f59565b60405180910390f35b61028d610764565b005b34801561029b57600080fd5b506102b660048036038101906102b19190610c9a565b6107f2565b005b3480156102c457600080fd5b506102df60048036038101906102da9190610fcf565b610875565b6040516102ed9291906110d7565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190610c9a565b610898565b60405161032a9190611122565b60405180910390f35b61033b6108ee565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff16630396cb6034836040518363ffffffff1660e01b8152600401610395919061114c565b6000604051808303818588803b1580156103ae57600080fd5b505af11580156103c2573d6000803e3d6000fd5b505050505050565b6103d26108ee565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6104346108ee565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff1663205c287883836040518363ffffffff1660e01b815260040161048f929190611176565b600060405180830381600087803b1580156104a957600080fd5b505af11580156104bd573d6000803e3d6000fd5b505050505050565b6104cd6108ee565b6104d7600061096c565b565b6104e16108ee565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61056d610a30565b61057984848484610ac0565b50505050565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5781565b6105ab6108ee565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561061357600080fd5b505af1158015610627573d6000803e3d6000fd5b50505050565b6106356108ee565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff1663c23a5cea826040518263ffffffff1660e01b815260040161068e919061119f565b600060405180830381600087803b1580156106a857600080fd5b505af11580156106bc573d6000803e3d6000fd5b5050505050565b60007f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161071e9190610d8a565b602060405180830381865afa15801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f91906111cf565b905090565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff1663b760faf934306040518363ffffffff1660e01b81526004016107be9190610d8a565b6000604051808303818588803b1580156107d757600080fd5b505af11580156107eb573d6000803e3d6000fd5b5050505050565b6107fa6108ee565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108609061127f565b60405180910390fd5b6108728161096c565b50565b60606000610881610a30565b61088c858585610afb565b91509150935093915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6108f6610bc1565b73ffffffffffffffffffffffffffffffffffffffff1661091461053c565b73ffffffffffffffffffffffffffffffffffffffff161461096a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610961906112eb565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab590611357565b60405180910390fd5b565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af2906113c3565b60405180910390fd5b6060600080856000016020810190610b139190610c9a565b9050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b989061142f565b60405180910390fd5b600060405180602001604052806000815250909250925050935093915050565b600033905090565b600080fd5b600080fd5b600063ffffffff82169050919050565b610bec81610bd3565b8114610bf757600080fd5b50565b600081359050610c0981610be3565b92915050565b600060208284031215610c2557610c24610bc9565b5b6000610c3384828501610bfa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c6782610c3c565b9050919050565b610c7781610c5c565b8114610c8257600080fd5b50565b600081359050610c9481610c6e565b92915050565b600060208284031215610cb057610caf610bc9565b5b6000610cbe84828501610c85565b91505092915050565b6000610cd282610c3c565b9050919050565b610ce281610cc7565b8114610ced57600080fd5b50565b600081359050610cff81610cd9565b92915050565b6000819050919050565b610d1881610d05565b8114610d2357600080fd5b50565b600081359050610d3581610d0f565b92915050565b60008060408385031215610d5257610d51610bc9565b5b6000610d6085828601610cf0565b9250506020610d7185828601610d26565b9150509250929050565b610d8481610c5c565b82525050565b6000602082019050610d9f6000830184610d7b565b92915050565b60038110610db257600080fd5b50565b600081359050610dc481610da5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610def57610dee610dca565b5b8235905067ffffffffffffffff811115610e0c57610e0b610dcf565b5b602083019150836001820283011115610e2857610e27610dd4565b5b9250929050565b60008060008060608587031215610e4957610e48610bc9565b5b6000610e5787828801610db5565b945050602085013567ffffffffffffffff811115610e7857610e77610bce565b5b610e8487828801610dd9565b93509350506040610e9787828801610d26565b91505092959194509250565b6000819050919050565b6000610ec8610ec3610ebe84610c3c565b610ea3565b610c3c565b9050919050565b6000610eda82610ead565b9050919050565b6000610eec82610ecf565b9050919050565b610efc81610ee1565b82525050565b6000602082019050610f176000830184610ef3565b92915050565b600060208284031215610f3357610f32610bc9565b5b6000610f4184828501610cf0565b91505092915050565b610f5381610d05565b82525050565b6000602082019050610f6e6000830184610f4a565b92915050565b600080fd5b60006101608284031215610f9057610f8f610f74565b5b81905092915050565b6000819050919050565b610fac81610f99565b8114610fb757600080fd5b50565b600081359050610fc981610fa3565b92915050565b600080600060608486031215610fe857610fe7610bc9565b5b600084013567ffffffffffffffff81111561100657611005610bce565b5b61101286828701610f79565b935050602061102386828701610fba565b925050604061103486828701610d26565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561107857808201518184015260208101905061105d565b83811115611087576000848401525b50505050565b6000601f19601f8301169050919050565b60006110a98261103e565b6110b38185611049565b93506110c381856020860161105a565b6110cc8161108d565b840191505092915050565b600060408201905081810360008301526110f1818561109e565b90506111006020830184610f4a565b9392505050565b60008115159050919050565b61111c81611107565b82525050565b60006020820190506111376000830184611113565b92915050565b61114681610bd3565b82525050565b6000602082019050611161600083018461113d565b92915050565b61117081610cc7565b82525050565b600060408201905061118b6000830185611167565b6111986020830184610f4a565b9392505050565b60006020820190506111b46000830184611167565b92915050565b6000815190506111c981610d0f565b92915050565b6000602082840312156111e5576111e4610bc9565b5b60006111f3848285016111ba565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006112696026836111fc565b91506112748261120d565b604082019050919050565b600060208201905081810360008301526112988161125c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006112d56020836111fc565b91506112e08261129f565b602082019050919050565b60006020820190508181036000830152611304816112c8565b9050919050565b7f53656e646572206e6f7420456e747279506f696e740000000000000000000000600082015250565b60006113416015836111fc565b915061134c8261130b565b602082019050919050565b6000602082019050818103600083015261137081611334565b9050919050565b7f6d757374206f7665727269646500000000000000000000000000000000000000600082015250565b60006113ad600d836111fc565b91506113b882611377565b602082019050919050565b600060208201905081810360008301526113dc816113a0565b9050919050565b7f55736572206973206e6f7420617574686f72697a65642e000000000000000000600082015250565b60006114196017836111fc565b9150611424826113e3565b602082019050919050565b600060208201905081810360008301526114488161140c565b905091905056fea2646970667358221220e65a5c1acbe32cf1ddf3f80d4cd1ef12639985fdab25bed64392a23c272886df64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b57
-----Decoded View---------------
Arg [0] : _entryPoint (address): 0x0576a174D229E3cFA37253523E645A78A0C91B57
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b57
Deployed Bytecode Sourcemap
258:1294:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1236:97:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2721:149:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1831:101:7;;;;;;;;;;;;;:::i;:::-;;1339:102:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1143:186:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;471:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3588:83;;;;;;;;;;;;;:::i;:::-;;3890:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3318:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2474:105;;;:::i;:::-;;2081:198:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;632:290:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1447:103:9;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3094:141:0;1094:13:7;:11;:13::i;:::-;3173:10:0::1;:19;;;3201:9;3212:15;3173:55;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;3094:141:::0;:::o;1236:97:9:-;1094:13:7;:11;:13::i;:::-;1322:4:9::1;1303:10:::0;:16:::1;1314:4;1303:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;1236:97:::0;:::o;2721:149:0:-;1094:13:7;:11;:13::i;:::-;2817:10:0::1;:21;;;2839:15;2856:6;2817:46;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2721:149:::0;;:::o;1831:101:7:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1339:102:9:-;1094:13:7;:11;:13::i;:::-;1429:5:9::1;1410:10;:16;1421:4;1410:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;1339:102:::0;:::o;1201:85:7:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;1143:186:0:-;1251:24;:22;:24::i;:::-;1285:37;1293:4;1299:7;;1308:13;1285:7;:37::i;:::-;1143:186;;;;:::o;471:39::-;;;:::o;3588:83::-;1094:13:7;:11;:13::i;:::-;3640:10:0::1;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3588:83::o:0;3890:133::-;1094:13:7;:11;:13::i;:::-;3975:10:0::1;:24;;;4000:15;3975:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3890:133:::0;:::o;3318:111::-;3361:7;3387:10;:20;;;3416:4;3387:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3380:42;;3318:111;:::o;2474:105::-;2518:10;:20;;;2547:9;2566:4;2518:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2474:105::o;2081:198:7:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;632:290:0:-;764:20;786:22;821:24;:22;:24::i;:::-;862:53;887:6;895:10;907:7;862:24;:53::i;:::-;855:60;;;;632:290;;;;;;:::o;1447:103:9:-;1504:4;1527:10;:16;1538:4;1527:16;;;;;;;;;;;;;;;;;;;;;;;;;1520:23;;1447:103;;;:::o;1359:130:7:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;2433:187::-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;4087:135:0:-;4178:10;4156:33;;:10;:33;;;4148:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;4087:135::o;2089:285::-;2344:23;;;;;;;;;;:::i;:::-;;;;;;;;661:487:9;811:20;833:22;932:12;947:6;:13;;;;;;;;;;:::i;:::-;932:28;;978:10;:16;989:4;978:16;;;;;;;;;;;;;;;;;;;;;;;;;970:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1084:1;1072:14;;;;;;;;;;;;;;;;;;661:487;;;;;;:::o;640:96:8:-;693:7;719:10;712:17;;640:96;:::o;88:117:10:-;197:1;194;187:12;211:117;320:1;317;310:12;334:93;370:7;410:10;403:5;399:22;388:33;;334:93;;;:::o;433:120::-;505:23;522:5;505:23;:::i;:::-;498:5;495:34;485:62;;543:1;540;533:12;485:62;433:120;:::o;559:137::-;604:5;642:6;629:20;620:29;;658:32;684:5;658:32;:::i;:::-;559:137;;;;:::o;702:327::-;760:6;809:2;797:9;788:7;784:23;780:32;777:119;;;815:79;;:::i;:::-;777:119;935:1;960:52;1004:7;995:6;984:9;980:22;960:52;:::i;:::-;950:62;;906:116;702:327;;;;:::o;1035:126::-;1072:7;1112:42;1105:5;1101:54;1090:65;;1035:126;;;:::o;1167:96::-;1204:7;1233:24;1251:5;1233:24;:::i;:::-;1222:35;;1167:96;;;:::o;1269:122::-;1342:24;1360:5;1342:24;:::i;:::-;1335:5;1332:35;1322:63;;1381:1;1378;1371:12;1322:63;1269:122;:::o;1397:139::-;1443:5;1481:6;1468:20;1459:29;;1497:33;1524:5;1497:33;:::i;:::-;1397:139;;;;:::o;1542:329::-;1601:6;1650:2;1638:9;1629:7;1625:23;1621:32;1618:119;;;1656:79;;:::i;:::-;1618:119;1776:1;1801:53;1846:7;1837:6;1826:9;1822:22;1801:53;:::i;:::-;1791:63;;1747:117;1542:329;;;;:::o;1877:104::-;1922:7;1951:24;1969:5;1951:24;:::i;:::-;1940:35;;1877:104;;;:::o;1987:138::-;2068:32;2094:5;2068:32;:::i;:::-;2061:5;2058:43;2048:71;;2115:1;2112;2105:12;2048:71;1987:138;:::o;2131:155::-;2185:5;2223:6;2210:20;2201:29;;2239:41;2274:5;2239:41;:::i;:::-;2131:155;;;;:::o;2292:77::-;2329:7;2358:5;2347:16;;2292:77;;;:::o;2375:122::-;2448:24;2466:5;2448:24;:::i;:::-;2441:5;2438:35;2428:63;;2487:1;2484;2477:12;2428:63;2375:122;:::o;2503:139::-;2549:5;2587:6;2574:20;2565:29;;2603:33;2630:5;2603:33;:::i;:::-;2503:139;;;;:::o;2648:490::-;2724:6;2732;2781:2;2769:9;2760:7;2756:23;2752:32;2749:119;;;2787:79;;:::i;:::-;2749:119;2907:1;2932:61;2985:7;2976:6;2965:9;2961:22;2932:61;:::i;:::-;2922:71;;2878:125;3042:2;3068:53;3113:7;3104:6;3093:9;3089:22;3068:53;:::i;:::-;3058:63;;3013:118;2648:490;;;;;:::o;3144:118::-;3231:24;3249:5;3231:24;:::i;:::-;3226:3;3219:37;3144:118;;:::o;3268:222::-;3361:4;3399:2;3388:9;3384:18;3376:26;;3412:71;3480:1;3469:9;3465:17;3456:6;3412:71;:::i;:::-;3268:222;;;;:::o;3496:113::-;3583:1;3576:5;3573:12;3563:40;;3599:1;3596;3589:12;3563:40;3496:113;:::o;3615:167::-;3675:5;3713:6;3700:20;3691:29;;3729:47;3770:5;3729:47;:::i;:::-;3615:167;;;;:::o;3788:117::-;3897:1;3894;3887:12;3911:117;4020:1;4017;4010:12;4034:117;4143:1;4140;4133:12;4170:552;4227:8;4237:6;4287:3;4280:4;4272:6;4268:17;4264:27;4254:122;;4295:79;;:::i;:::-;4254:122;4408:6;4395:20;4385:30;;4438:18;4430:6;4427:30;4424:117;;;4460:79;;:::i;:::-;4424:117;4574:4;4566:6;4562:17;4550:29;;4628:3;4620:4;4612:6;4608:17;4598:8;4594:32;4591:41;4588:128;;;4635:79;;:::i;:::-;4588:128;4170:552;;;;;:::o;4728:845::-;4830:6;4838;4846;4854;4903:2;4891:9;4882:7;4878:23;4874:32;4871:119;;;4909:79;;:::i;:::-;4871:119;5029:1;5054:67;5113:7;5104:6;5093:9;5089:22;5054:67;:::i;:::-;5044:77;;5000:131;5198:2;5187:9;5183:18;5170:32;5229:18;5221:6;5218:30;5215:117;;;5251:79;;:::i;:::-;5215:117;5364:64;5420:7;5411:6;5400:9;5396:22;5364:64;:::i;:::-;5346:82;;;;5141:297;5477:2;5503:53;5548:7;5539:6;5528:9;5524:22;5503:53;:::i;:::-;5493:63;;5448:118;4728:845;;;;;;;:::o;5579:60::-;5607:3;5628:5;5621:12;;5579:60;;;:::o;5645:142::-;5695:9;5728:53;5746:34;5755:24;5773:5;5755:24;:::i;:::-;5746:34;:::i;:::-;5728:53;:::i;:::-;5715:66;;5645:142;;;:::o;5793:126::-;5843:9;5876:37;5907:5;5876:37;:::i;:::-;5863:50;;5793:126;;;:::o;5925:145::-;5994:9;6027:37;6058:5;6027:37;:::i;:::-;6014:50;;5925:145;;;:::o;6076:169::-;6182:56;6232:5;6182:56;:::i;:::-;6177:3;6170:69;6076:169;;:::o;6251:260::-;6363:4;6401:2;6390:9;6386:18;6378:26;;6414:90;6501:1;6490:9;6486:17;6477:6;6414:90;:::i;:::-;6251:260;;;;:::o;6517:345::-;6584:6;6633:2;6621:9;6612:7;6608:23;6604:32;6601:119;;;6639:79;;:::i;:::-;6601:119;6759:1;6784:61;6837:7;6828:6;6817:9;6813:22;6784:61;:::i;:::-;6774:71;;6730:125;6517:345;;;;:::o;6868:118::-;6955:24;6973:5;6955:24;:::i;:::-;6950:3;6943:37;6868:118;;:::o;6992:222::-;7085:4;7123:2;7112:9;7108:18;7100:26;;7136:71;7204:1;7193:9;7189:17;7180:6;7136:71;:::i;:::-;6992:222;;;;:::o;7220:117::-;7329:1;7326;7319:12;7371:237;7449:5;7490:3;7481:6;7476:3;7472:16;7468:26;7465:113;;;7497:79;;:::i;:::-;7465:113;7596:6;7587:15;;7371:237;;;;:::o;7614:77::-;7651:7;7680:5;7669:16;;7614:77;;;:::o;7697:122::-;7770:24;7788:5;7770:24;:::i;:::-;7763:5;7760:35;7750:63;;7809:1;7806;7799:12;7750:63;7697:122;:::o;7825:139::-;7871:5;7909:6;7896:20;7887:29;;7925:33;7952:5;7925:33;:::i;:::-;7825:139;;;;:::o;7970:843::-;8079:6;8087;8095;8144:2;8132:9;8123:7;8119:23;8115:32;8112:119;;;8150:79;;:::i;:::-;8112:119;8298:1;8287:9;8283:17;8270:31;8328:18;8320:6;8317:30;8314:117;;;8350:79;;:::i;:::-;8314:117;8455:85;8532:7;8523:6;8512:9;8508:22;8455:85;:::i;:::-;8445:95;;8241:309;8589:2;8615:53;8660:7;8651:6;8640:9;8636:22;8615:53;:::i;:::-;8605:63;;8560:118;8717:2;8743:53;8788:7;8779:6;8768:9;8764:22;8743:53;:::i;:::-;8733:63;;8688:118;7970:843;;;;;:::o;8819:98::-;8870:6;8904:5;8898:12;8888:22;;8819:98;;;:::o;8923:168::-;9006:11;9040:6;9035:3;9028:19;9080:4;9075:3;9071:14;9056:29;;8923:168;;;;:::o;9097:307::-;9165:1;9175:113;9189:6;9186:1;9183:13;9175:113;;;9274:1;9269:3;9265:11;9259:18;9255:1;9250:3;9246:11;9239:39;9211:2;9208:1;9204:10;9199:15;;9175:113;;;9306:6;9303:1;9300:13;9297:101;;;9386:1;9377:6;9372:3;9368:16;9361:27;9297:101;9146:258;9097:307;;;:::o;9410:102::-;9451:6;9502:2;9498:7;9493:2;9486:5;9482:14;9478:28;9468:38;;9410:102;;;:::o;9518:360::-;9604:3;9632:38;9664:5;9632:38;:::i;:::-;9686:70;9749:6;9744:3;9686:70;:::i;:::-;9679:77;;9765:52;9810:6;9805:3;9798:4;9791:5;9787:16;9765:52;:::i;:::-;9842:29;9864:6;9842:29;:::i;:::-;9837:3;9833:39;9826:46;;9608:270;9518:360;;;;:::o;9884:419::-;10023:4;10061:2;10050:9;10046:18;10038:26;;10110:9;10104:4;10100:20;10096:1;10085:9;10081:17;10074:47;10138:76;10209:4;10200:6;10138:76;:::i;:::-;10130:84;;10224:72;10292:2;10281:9;10277:18;10268:6;10224:72;:::i;:::-;9884:419;;;;;:::o;10309:90::-;10343:7;10386:5;10379:13;10372:21;10361:32;;10309:90;;;:::o;10405:109::-;10486:21;10501:5;10486:21;:::i;:::-;10481:3;10474:34;10405:109;;:::o;10520:210::-;10607:4;10645:2;10634:9;10630:18;10622:26;;10658:65;10720:1;10709:9;10705:17;10696:6;10658:65;:::i;:::-;10520:210;;;;:::o;10736:115::-;10821:23;10838:5;10821:23;:::i;:::-;10816:3;10809:36;10736:115;;:::o;10857:218::-;10948:4;10986:2;10975:9;10971:18;10963:26;;10999:69;11065:1;11054:9;11050:17;11041:6;10999:69;:::i;:::-;10857:218;;;;:::o;11081:142::-;11184:32;11210:5;11184:32;:::i;:::-;11179:3;11172:45;11081:142;;:::o;11229:364::-;11366:4;11404:2;11393:9;11389:18;11381:26;;11417:87;11501:1;11490:9;11486:17;11477:6;11417:87;:::i;:::-;11514:72;11582:2;11571:9;11567:18;11558:6;11514:72;:::i;:::-;11229:364;;;;;:::o;11599:254::-;11708:4;11746:2;11735:9;11731:18;11723:26;;11759:87;11843:1;11832:9;11828:17;11819:6;11759:87;:::i;:::-;11599:254;;;;:::o;11859:143::-;11916:5;11947:6;11941:13;11932:22;;11963:33;11990:5;11963:33;:::i;:::-;11859:143;;;;:::o;12008:351::-;12078:6;12127:2;12115:9;12106:7;12102:23;12098:32;12095:119;;;12133:79;;:::i;:::-;12095:119;12253:1;12278:64;12334:7;12325:6;12314:9;12310:22;12278:64;:::i;:::-;12268:74;;12224:128;12008:351;;;;:::o;12365:169::-;12449:11;12483:6;12478:3;12471:19;12523:4;12518:3;12514:14;12499:29;;12365:169;;;;:::o;12540:225::-;12680:34;12676:1;12668:6;12664:14;12657:58;12749:8;12744:2;12736:6;12732:15;12725:33;12540:225;:::o;12771:366::-;12913:3;12934:67;12998:2;12993:3;12934:67;:::i;:::-;12927:74;;13010:93;13099:3;13010:93;:::i;:::-;13128:2;13123:3;13119:12;13112:19;;12771:366;;;:::o;13143:419::-;13309:4;13347:2;13336:9;13332:18;13324:26;;13396:9;13390:4;13386:20;13382:1;13371:9;13367:17;13360:47;13424:131;13550:4;13424:131;:::i;:::-;13416:139;;13143:419;;;:::o;13568:182::-;13708:34;13704:1;13696:6;13692:14;13685:58;13568:182;:::o;13756:366::-;13898:3;13919:67;13983:2;13978:3;13919:67;:::i;:::-;13912:74;;13995:93;14084:3;13995:93;:::i;:::-;14113:2;14108:3;14104:12;14097:19;;13756:366;;;:::o;14128:419::-;14294:4;14332:2;14321:9;14317:18;14309:26;;14381:9;14375:4;14371:20;14367:1;14356:9;14352:17;14345:47;14409:131;14535:4;14409:131;:::i;:::-;14401:139;;14128:419;;;:::o;14553:171::-;14693:23;14689:1;14681:6;14677:14;14670:47;14553:171;:::o;14730:366::-;14872:3;14893:67;14957:2;14952:3;14893:67;:::i;:::-;14886:74;;14969:93;15058:3;14969:93;:::i;:::-;15087:2;15082:3;15078:12;15071:19;;14730:366;;;:::o;15102:419::-;15268:4;15306:2;15295:9;15291:18;15283:26;;15355:9;15349:4;15345:20;15341:1;15330:9;15326:17;15319:47;15383:131;15509:4;15383:131;:::i;:::-;15375:139;;15102:419;;;:::o;15527:163::-;15667:15;15663:1;15655:6;15651:14;15644:39;15527:163;:::o;15696:366::-;15838:3;15859:67;15923:2;15918:3;15859:67;:::i;:::-;15852:74;;15935:93;16024:3;15935:93;:::i;:::-;16053:2;16048:3;16044:12;16037:19;;15696:366;;;:::o;16068:419::-;16234:4;16272:2;16261:9;16257:18;16249:26;;16321:9;16315:4;16311:20;16307:1;16296:9;16292:17;16285:47;16349:131;16475:4;16349:131;:::i;:::-;16341:139;;16068:419;;;:::o;16493:173::-;16633:25;16629:1;16621:6;16617:14;16610:49;16493:173;:::o;16672:366::-;16814:3;16835:67;16899:2;16894:3;16835:67;:::i;:::-;16828:74;;16911:93;17000:3;16911:93;:::i;:::-;17029:2;17024:3;17020:12;17013:19;;16672:366;;;:::o;17044:419::-;17210:4;17248:2;17237:9;17233:18;17225:26;;17297:9;17291:4;17287:20;17283:1;17272:9;17268:17;17261:47;17325:131;17451:4;17325:131;:::i;:::-;17317:139;;17044:419;;;:::o
Swarm Source
ipfs://e65a5c1acbe32cf1ddf3f80d4cd1ef12639985fdab25bed64392a23c272886df
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.