Source Code
Overview
ETH Balance
0 ETH
Token Holdings
More Info
ContractCreator
TokenTracker
Multi Chain
Multichain Addresses
1 address found via
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Add Authorized U... | 9037092 | 127 days 12 hrs ago | IN | 0 ETH | 0.00002521 | ||||
Set Token Value | 8752176 | 177 days 19 hrs ago | IN | 0 ETH | 0.00030958 | ||||
Set Token Value | 8752163 | 177 days 19 hrs ago | IN | 0 ETH | 0.00035608 | ||||
Transfer | 8752157 | 177 days 19 hrs ago | IN | 0 ETH | 0.00056046 | ||||
Add Authorized U... | 8752146 | 177 days 19 hrs ago | IN | 0 ETH | 0.00054774 | ||||
Mint Tokens | 8752036 | 177 days 20 hrs ago | IN | 0 ETH | 0.00097153 | ||||
Deposit | 8752019 | 177 days 20 hrs ago | IN | 0.3 ETH | 0.00063485 | ||||
Add Stake | 8752019 | 177 days 20 hrs ago | IN | 0.1 ETH | 0.00134779 | ||||
0x60c06040 | 8751991 | 177 days 20 hrs ago | IN | Create: CustomTokenPaymaster | 0 ETH | 0.5716924 |
Latest 10 internal transactions
Advanced mode:
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
8752179 | 177 days 19 hrs ago | 0 ETH | ||||
8752179 | 177 days 19 hrs ago | 0 ETH | ||||
8752173 | 177 days 19 hrs ago | 0 ETH | ||||
8752173 | 177 days 19 hrs ago | 0 ETH | ||||
8752169 | 177 days 19 hrs ago | 0 ETH | ||||
8752169 | 177 days 19 hrs ago | 0 ETH | ||||
8752159 | 177 days 19 hrs ago | 0 ETH | ||||
8752159 | 177 days 19 hrs ago | 0 ETH | ||||
8752019 | 177 days 20 hrs ago | 0.3 ETH | ||||
8752019 | 177 days 20 hrs ago | 0.1 ETH |
Loading...
Loading
Contract Name:
CustomTokenPaymaster
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; /* solhint-disable reason-string */ import "./TokenPaymaster.sol"; /** Paymaster that allows user to pay for transactions with a custom ERC20 token * Paymaster contract is also the token contract. * There is no oracle or external adress used to determine the token value. * Contract owner can update the token value. * Only authorized users can use paymaster. * Contact based on contract provided by Ethereum Foundation */ contract CustomTokenPaymaster is TokenPaymaster{ uint256 public ethToToken = 100;//Initialized as 100 mapping(address => bool) private authorized;//whitelist for paymaster access constructor(address accountFactory, string memory _name, string memory _symbol, IEntryPoint _entryPoint) TokenPaymaster(accountFactory, _name, _symbol, _entryPoint){} function getTokenValueOfEth(uint256 valueEth) internal view virtual override returns (uint256 valueToken) { return valueEth / ethToToken; } //Owner can update the token value function setTokenValue(uint256 value) public onlyOwner{ ethToToken = value; } function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 userOpHash, uint256 requiredPreFund) internal override view returns (bytes memory context, uint256 validationData) { address user = userOp.sender; require(authorized[user], "User is not authorized."); return super._validatePaymasterUserOp(userOp, userOpHash, requiredPreFund); } //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 (last updated v4.8.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// 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; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.12; /* solhint-disable reason-string */ import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@account-abstraction/contracts/core/BasePaymaster.sol"; /** * A sample paymaster that defines itself as a token to pay for gas. * The paymaster IS the token to use, since a paymaster cannot use an external contract. * Also, the exchange rate has to be fixed, since it can't reference an external Uniswap or other exchange contract. * subclass should override "getTokenValueOfEth" to provide actual token exchange rate, settable by the owner. * Known Limitation: this paymaster is exploitable when put into a batch with multiple ops (of different accounts): * - while a single op can't exploit the paymaster (if postOp fails to withdraw the tokens, the user's op is reverted, * and then we know we can withdraw the tokens), multiple ops with different senders (all using this paymaster) * in a batch can withdraw funds from 2nd and further ops, forcing the paymaster itself to pay (from its deposit) * - Possible workarounds are either use a more complex paymaster scheme (e.g. the DepositPaymaster) or * to whitelist the account and the called method ids. */ contract TokenPaymaster is BasePaymaster, ERC20 { //calculated cost of the postOp uint256 constant public COST_OF_POST = 15000; address public immutable theFactory; //Constructor modified slightly so _name and _symbol are different. constructor(address accountFactory, string memory _name, string memory _symbol, IEntryPoint _entryPoint) ERC20(_name, _symbol) BasePaymaster(_entryPoint) { theFactory = accountFactory; //make it non-empty _mint(address(this), 1); //owner is allowed to withdraw tokens from the paymaster's balance _approve(address(this), msg.sender, type(uint).max); } /** * helpers for owner, to mint and withdraw tokens. * @param recipient - the address that will receive the minted tokens. * @param amount - the amount it will receive. */ function mintTokens(address recipient, uint256 amount) external onlyOwner { _mint(recipient, amount); } /** * transfer paymaster ownership. * owner of this paymaster is allowed to withdraw funds (tokens transferred to this paymaster's balance) * when changing owner, the old owner's withdrawal rights are revoked. */ function transferOwnership(address newOwner) public override virtual onlyOwner { // remove allowance of current owner _approve(address(this), owner(), 0); super.transferOwnership(newOwner); // new owner is allowed to withdraw tokens from the paymaster's balance _approve(address(this), newOwner, type(uint).max); } //Note: this method assumes a fixed ratio of token-to-eth. subclass should override to supply oracle // or a setter. function getTokenValueOfEth(uint256 valueEth) internal view virtual returns (uint256 valueToken) { return valueEth / 100; } /** * validate the request: * if this is a constructor call, make sure it is a known account. * verify the sender has enough tokens. * (since the paymaster is also the token, there is no notion of "approval") */ function _validatePaymasterUserOp(UserOperation calldata userOp, bytes32 /*userOpHash*/, uint256 requiredPreFund) internal view virtual override returns (bytes memory context, uint256 validationData) { uint256 tokenPrefund = getTokenValueOfEth(requiredPreFund); // verificationGasLimit is dual-purposed, as gas limit for postOp. make sure it is high enough // make sure that verificationGasLimit is high enough to handle postOp require(userOp.verificationGasLimit > COST_OF_POST, "TokenPaymaster: gas too low for postOp"); if (userOp.initCode.length != 0) { _validateConstructor(userOp); require(balanceOf(userOp.sender) >= tokenPrefund, "TokenPaymaster: no balance (pre-create)"); } else { require(balanceOf(userOp.sender) >= tokenPrefund, "TokenPaymaster: no balance"); } return (abi.encode(userOp.sender), 0); } // when constructing an account, validate constructor code and parameters // we trust our factory (and that it doesn't have any other public methods) function _validateConstructor(UserOperation calldata userOp) internal virtual view { address factory = address(bytes20(userOp.initCode[0 : 20])); require(factory == theFactory, "TokenPaymaster: wrong account factory"); } /** * actual charge of user. * this method will be called just after the user's TX with mode==OpSucceeded|OpReverted (account pays in both cases) * BUT: if the user changed its balance in a way that will cause postOp to revert, then it gets called again, after reverting * the user's TX , back to the state it was before the transaction started (before the validatePaymasterUserOp), * and the transaction should succeed there. */ function _postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) internal override { //we don't really care about the mode, we just pay the gas with the user's tokens. (mode); address sender = abi.decode(context, (address)); uint256 charge = getTokenValueOfEth(actualGasCost + COST_OF_POST); //actualGasCost is known to be no larger than the above requiredPreFund, so the transfer should succeed. _transfer(sender, address(this), charge); } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"inputs":[{"internalType":"address","name":"accountFactory","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"contract IEntryPoint","name":"_entryPoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"COST_OF_POST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"ethToToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"value","type":"uint256"}],"name":"setTokenValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"theFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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
60c060405260646006553480156200001657600080fd5b5060405162003b7738038062003b7783398181016040528101906200003c919062000860565b8383838382828262000063620000576200015460201b60201c565b6200015c60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050508160049080519060200190620000b092919062000569565b508060059080519060200190620000c992919062000569565b5050508373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620001133060016200022060201b60201c565b6200014630337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6200038e60201b60201c565b505050505050505062000beb565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000292576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002899062000971565b60405180910390fd5b620002a6600083836200055f60201b60201c565b8060036000828254620002ba9190620009cc565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200036e919062000a3a565b60405180910390a36200038a600083836200056460201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000400576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f79062000acd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000472576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004699062000b65565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000552919062000a3a565b60405180910390a3505050565b505050565b505050565b828054620005779062000bb6565b90600052602060002090601f0160209004810192826200059b5760008555620005e7565b82601f10620005b657805160ff1916838001178555620005e7565b82800160010185558215620005e7579182015b82811115620005e6578251825591602001919060010190620005c9565b5b509050620005f69190620005fa565b5090565b5b8082111562000615576000816000905550600101620005fb565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200065a826200062d565b9050919050565b6200066c816200064d565b81146200067857600080fd5b50565b6000815190506200068c8162000661565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006e7826200069c565b810181811067ffffffffffffffff82111715620007095762000708620006ad565b5b80604052505050565b60006200071e62000619565b90506200072c8282620006dc565b919050565b600067ffffffffffffffff8211156200074f576200074e620006ad565b5b6200075a826200069c565b9050602081019050919050565b60005b83811015620007875780820151818401526020810190506200076a565b8381111562000797576000848401525b50505050565b6000620007b4620007ae8462000731565b62000712565b905082815260208101848484011115620007d357620007d262000697565b5b620007e084828562000767565b509392505050565b600082601f8301126200080057620007ff62000692565b5b8151620008128482602086016200079d565b91505092915050565b600062000828826200064d565b9050919050565b6200083a816200081b565b81146200084657600080fd5b50565b6000815190506200085a816200082f565b92915050565b600080600080608085870312156200087d576200087c62000623565b5b60006200088d878288016200067b565b945050602085015167ffffffffffffffff811115620008b157620008b062000628565b5b620008bf87828801620007e8565b935050604085015167ffffffffffffffff811115620008e357620008e262000628565b5b620008f187828801620007e8565b9250506060620009048782880162000849565b91505092959194509250565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000959601f8362000910565b9150620009668262000921565b602082019050919050565b600060208201905081810360008301526200098c816200094a565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620009d98262000993565b9150620009e68362000993565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a1e5762000a1d6200099d565b5b828201905092915050565b62000a348162000993565b82525050565b600060208201905062000a51600083018462000a29565b92915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600062000ab560248362000910565b915062000ac28262000a57565b604082019050919050565b6000602082019050818103600083015262000ae88162000aa6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600062000b4d60228362000910565b915062000b5a8262000aef565b604082019050919050565b6000602082019050818103600083015262000b808162000b3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bcf57607f821691505b60208210810362000be55762000be462000b87565b5b50919050565b60805160a051612f2e62000c4960003960008181610b970152611bac0152600081816107570152818161091001528181610c8101528181610cad01528181610d3701528181610dc701528181610e6601526116740152612f2e6000f3fe6080604052600436106101d85760003560e01c806395d89b4111610102578063c23a5cea11610095578063f0dda65c11610064578063f0dda65c14610680578063f2fde38b146106a9578063f465c77e146106d2578063fe9fbb8014610710576101d8565b8063c23a5cea146105e5578063c399ec881461060e578063d0e30db014610639578063dd62ed3e14610643576101d8565b8063a9059cbb116100d1578063a9059cbb1461053d578063a9a234091461057a578063b0d691fe146105a3578063bb9fe6bf146105ce576101d8565b806395d89b41146104815780639f5ca221146104ac578063a2bf6939146104d7578063a457c2d714610500576101d8565b8063313ce5671161017a578063789770f411610149578063789770f4146103d7578063796d43711461040257806389fabc801461042d5780638da5cb5b14610456576101d8565b8063313ce5671461031b578063395093511461034657806370a0823114610383578063715018a6146103c0576101d8565b8063177d2a74116101b6578063177d2a741461026157806318160ddd1461028a578063205c2878146102b557806323b872dd146102de576101d8565b80630396cb60146101dd57806306fdde03146101f9578063095ea7b314610224575b600080fd5b6101f760048036038101906101f29190611c82565b61074d565b005b34801561020557600080fd5b5061020e6107e4565b60405161021b9190611d48565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190611dfe565b610876565b6040516102589190611e59565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190611e74565b610899565b005b34801561029657600080fd5b5061029f6108fc565b6040516102ac9190611eb0565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190611f09565b610906565b005b3480156102ea57600080fd5b5061030560048036038101906103009190611f49565b61099f565b6040516103129190611e59565b60405180910390f35b34801561032757600080fd5b506103306109ce565b60405161033d9190611fb8565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190611dfe565b6109d7565b60405161037a9190611e59565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190611e74565b610a0e565b6040516103b79190611eb0565b60405180910390f35b3480156103cc57600080fd5b506103d5610a57565b005b3480156103e357600080fd5b506103ec610a6b565b6040516103f99190611eb0565b60405180910390f35b34801561040e57600080fd5b50610417610a71565b6040516104249190611eb0565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190611e74565b610a77565b005b34801561046257600080fd5b5061046b610ada565b6040516104789190611fe2565b60405180910390f35b34801561048d57600080fd5b50610496610b03565b6040516104a39190611d48565b60405180910390f35b3480156104b857600080fd5b506104c1610b95565b6040516104ce9190611fe2565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190611ffd565b610bb9565b005b34801561050c57600080fd5b5061052760048036038101906105229190611dfe565b610bcb565b6040516105349190611e59565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190611dfe565b610c42565b6040516105719190611e59565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c91906120b4565b610c65565b005b3480156105af57600080fd5b506105b8610c7f565b6040516105c59190612187565b60405180910390f35b3480156105da57600080fd5b506105e3610ca3565b005b3480156105f157600080fd5b5061060c600480360381019061060791906121a2565b610d2d565b005b34801561061a57600080fd5b50610623610dc3565b6040516106309190611eb0565b60405180910390f35b610641610e64565b005b34801561064f57600080fd5b5061066a600480360381019061066591906121cf565b610ef2565b6040516106779190611eb0565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a29190611dfe565b610f79565b005b3480156106b557600080fd5b506106d060048036038101906106cb9190611e74565b610f8f565b005b3480156106de57600080fd5b506106f960048036038101906106f4919061226a565b610fe1565b60405161070792919061232e565b60405180910390f35b34801561071c57600080fd5b5061073760048036038101906107329190611e74565b611004565b6040516107449190611e59565b60405180910390f35b61075561105a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630396cb6034836040518363ffffffff1660e01b81526004016107af919061236d565b6000604051808303818588803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b505050505050565b6060600480546107f3906123b7565b80601f016020809104026020016040519081016040528092919081815260200182805461081f906123b7565b801561086c5780601f106108415761010080835404028352916020019161086c565b820191906000526020600020905b81548152906001019060200180831161084f57829003601f168201915b5050505050905090565b6000806108816110d8565b905061088e8185856110e0565b600191505092915050565b6108a161105a565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600354905090565b61090e61105a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663205c287883836040518363ffffffff1660e01b81526004016109699291906123f7565b600060405180830381600087803b15801561098357600080fd5b505af1158015610997573d6000803e3d6000fd5b505050505050565b6000806109aa6110d8565b90506109b78582856112a9565b6109c2858585611335565b60019150509392505050565b60006012905090565b6000806109e26110d8565b9050610a038185856109f48589610ef2565b6109fe919061244f565b6110e0565b600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a5f61105a565b610a6960006115ae565b565b60065481565b613a9881565b610a7f61105a565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054610b12906123b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3e906123b7565b8015610b8b5780601f10610b6057610100808354040283529160200191610b8b565b820191906000526020600020905b815481529060010190602001808311610b6e57829003601f168201915b5050505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b610bc161105a565b8060068190555050565b600080610bd66110d8565b90506000610be48286610ef2565b905083811015610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090612517565b60405180910390fd5b610c3682868684036110e0565b60019250505092915050565b600080610c4d6110d8565b9050610c5a818585611335565b600191505092915050565b610c6d611672565b610c7984848484611702565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cab61105a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d1357600080fd5b505af1158015610d27573d6000803e3d6000fd5b50505050565b610d3561105a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c23a5cea826040518263ffffffff1660e01b8152600401610d8e9190612537565b600060405180830381600087803b158015610da857600080fd5b505af1158015610dbc573d6000803e3d6000fd5b5050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1e9190611fe2565b602060405180830381865afa158015610e3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5f9190612567565b905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b760faf934306040518363ffffffff1660e01b8152600401610ebe9190611fe2565b6000604051808303818588803b158015610ed757600080fd5b505af1158015610eeb573d6000803e3d6000fd5b5050505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f8161105a565b610f8b8282611742565b5050565b610f9761105a565b610faa30610fa3610ada565b60006110e0565b610fb381611899565b610fde30827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6110e0565b50565b60606000610fed611672565b610ff885858561191c565b91509150935093915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6110626110d8565b73ffffffffffffffffffffffffffffffffffffffff16611080610ada565b73ffffffffffffffffffffffffffffffffffffffff16146110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd906125e0565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114690612672565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590612704565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161129c9190611eb0565b60405180910390a3505050565b60006112b58484610ef2565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461132f5781811015611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890612770565b60405180910390fd5b61132e84848484036110e0565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90612802565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90612894565b60405180910390fd5b61141e8383836119da565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90612926565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115959190611eb0565b60405180910390a36115a88484846119df565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790612992565b60405180910390fd5b565b6000838381019061171391906121a2565b9050600061172d613a9884611728919061244f565b6119e4565b905061173a823083611335565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a8906129fe565b60405180910390fd5b6117bd600083836119da565b80600360008282546117cf919061244f565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118819190611eb0565b60405180910390a3611895600083836119df565b5050565b6118a161105a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790612a90565b60405180910390fd5b611919816115ae565b50565b60606000808560000160208101906119349190611e74565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990612afc565b60405180910390fd5b6119cd8686866119fb565b9250925050935093915050565b505050565b505050565b6000600654826119f49190612b4b565b9050919050565b6060600080611a09846119e4565b9050613a988660a0013511611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90612bee565b60405180910390fd5b6000868060400190611a659190612c1d565b905014611ad757611a7586611b76565b80611a91876000016020810190611a8c9190611e74565b610a0e565b1015611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac990612cf2565b60405180910390fd5b611b35565b80611af3876000016020810190611aee9190611e74565b610a0e565b1015611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90612d5e565b60405180910390fd5b5b856000016020810190611b489190611e74565b604051602001611b589190611fe2565b60405160208183030381529060405260009250925050935093915050565b6000818060400190611b889190612c1d565b600090601492611b9a93929190612d88565b90611ba59190612e07565b60601c90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2f90612ed8565b60405180910390fd5b5050565b600080fd5b600080fd5b600063ffffffff82169050919050565b611c5f81611c46565b8114611c6a57600080fd5b50565b600081359050611c7c81611c56565b92915050565b600060208284031215611c9857611c97611c3c565b5b6000611ca684828501611c6d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ce9578082015181840152602081019050611cce565b83811115611cf8576000848401525b50505050565b6000601f19601f8301169050919050565b6000611d1a82611caf565b611d248185611cba565b9350611d34818560208601611ccb565b611d3d81611cfe565b840191505092915050565b60006020820190508181036000830152611d628184611d0f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d9582611d6a565b9050919050565b611da581611d8a565b8114611db057600080fd5b50565b600081359050611dc281611d9c565b92915050565b6000819050919050565b611ddb81611dc8565b8114611de657600080fd5b50565b600081359050611df881611dd2565b92915050565b60008060408385031215611e1557611e14611c3c565b5b6000611e2385828601611db3565b9250506020611e3485828601611de9565b9150509250929050565b60008115159050919050565b611e5381611e3e565b82525050565b6000602082019050611e6e6000830184611e4a565b92915050565b600060208284031215611e8a57611e89611c3c565b5b6000611e9884828501611db3565b91505092915050565b611eaa81611dc8565b82525050565b6000602082019050611ec56000830184611ea1565b92915050565b6000611ed682611d6a565b9050919050565b611ee681611ecb565b8114611ef157600080fd5b50565b600081359050611f0381611edd565b92915050565b60008060408385031215611f2057611f1f611c3c565b5b6000611f2e85828601611ef4565b9250506020611f3f85828601611de9565b9150509250929050565b600080600060608486031215611f6257611f61611c3c565b5b6000611f7086828701611db3565b9350506020611f8186828701611db3565b9250506040611f9286828701611de9565b9150509250925092565b600060ff82169050919050565b611fb281611f9c565b82525050565b6000602082019050611fcd6000830184611fa9565b92915050565b611fdc81611d8a565b82525050565b6000602082019050611ff76000830184611fd3565b92915050565b60006020828403121561201357612012611c3c565b5b600061202184828501611de9565b91505092915050565b6003811061203757600080fd5b50565b6000813590506120498161202a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126120745761207361204f565b5b8235905067ffffffffffffffff81111561209157612090612054565b5b6020830191508360018202830111156120ad576120ac612059565b5b9250929050565b600080600080606085870312156120ce576120cd611c3c565b5b60006120dc8782880161203a565b945050602085013567ffffffffffffffff8111156120fd576120fc611c41565b5b6121098782880161205e565b9350935050604061211c87828801611de9565b91505092959194509250565b6000819050919050565b600061214d61214861214384611d6a565b612128565b611d6a565b9050919050565b600061215f82612132565b9050919050565b600061217182612154565b9050919050565b61218181612166565b82525050565b600060208201905061219c6000830184612178565b92915050565b6000602082840312156121b8576121b7611c3c565b5b60006121c684828501611ef4565b91505092915050565b600080604083850312156121e6576121e5611c3c565b5b60006121f485828601611db3565b925050602061220585828601611db3565b9150509250929050565b600080fd5b6000610160828403121561222b5761222a61220f565b5b81905092915050565b6000819050919050565b61224781612234565b811461225257600080fd5b50565b6000813590506122648161223e565b92915050565b60008060006060848603121561228357612282611c3c565b5b600084013567ffffffffffffffff8111156122a1576122a0611c41565b5b6122ad86828701612214565b93505060206122be86828701612255565b92505060406122cf86828701611de9565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000612300826122d9565b61230a81856122e4565b935061231a818560208601611ccb565b61232381611cfe565b840191505092915050565b6000604082019050818103600083015261234881856122f5565b90506123576020830184611ea1565b9392505050565b61236781611c46565b82525050565b6000602082019050612382600083018461235e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806123cf57607f821691505b6020821081036123e2576123e1612388565b5b50919050565b6123f181611ecb565b82525050565b600060408201905061240c60008301856123e8565b6124196020830184611ea1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061245a82611dc8565b915061246583611dc8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561249a57612499612420565b5b828201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612501602583611cba565b915061250c826124a5565b604082019050919050565b60006020820190508181036000830152612530816124f4565b9050919050565b600060208201905061254c60008301846123e8565b92915050565b60008151905061256181611dd2565b92915050565b60006020828403121561257d5761257c611c3c565b5b600061258b84828501612552565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125ca602083611cba565b91506125d582612594565b602082019050919050565b600060208201905081810360008301526125f9816125bd565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061265c602483611cba565b915061266782612600565b604082019050919050565b6000602082019050818103600083015261268b8161264f565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006126ee602283611cba565b91506126f982612692565b604082019050919050565b6000602082019050818103600083015261271d816126e1565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061275a601d83611cba565b915061276582612724565b602082019050919050565b600060208201905081810360008301526127898161274d565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006127ec602583611cba565b91506127f782612790565b604082019050919050565b6000602082019050818103600083015261281b816127df565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061287e602383611cba565b915061288982612822565b604082019050919050565b600060208201905081810360008301526128ad81612871565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612910602683611cba565b915061291b826128b4565b604082019050919050565b6000602082019050818103600083015261293f81612903565b9050919050565b7f53656e646572206e6f7420456e747279506f696e740000000000000000000000600082015250565b600061297c601583611cba565b915061298782612946565b602082019050919050565b600060208201905081810360008301526129ab8161296f565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006129e8601f83611cba565b91506129f3826129b2565b602082019050919050565b60006020820190508181036000830152612a17816129db565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612a7a602683611cba565b9150612a8582612a1e565b604082019050919050565b60006020820190508181036000830152612aa981612a6d565b9050919050565b7f55736572206973206e6f7420617574686f72697a65642e000000000000000000600082015250565b6000612ae6601783611cba565b9150612af182612ab0565b602082019050919050565b60006020820190508181036000830152612b1581612ad9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612b5682611dc8565b9150612b6183611dc8565b925082612b7157612b70612b1c565b5b828204905092915050565b7f546f6b656e5061796d61737465723a2067617320746f6f206c6f7720666f722060008201527f706f73744f700000000000000000000000000000000000000000000000000000602082015250565b6000612bd8602683611cba565b9150612be382612b7c565b604082019050919050565b60006020820190508181036000830152612c0781612bcb565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612c3a57612c39612c0e565b5b80840192508235915067ffffffffffffffff821115612c5c57612c5b612c13565b5b602083019250600182023603831315612c7857612c77612c18565b5b509250929050565b7f546f6b656e5061796d61737465723a206e6f2062616c616e636520287072652d60008201527f6372656174652900000000000000000000000000000000000000000000000000602082015250565b6000612cdc602783611cba565b9150612ce782612c80565b604082019050919050565b60006020820190508181036000830152612d0b81612ccf565b9050919050565b7f546f6b656e5061796d61737465723a206e6f2062616c616e6365000000000000600082015250565b6000612d48601a83611cba565b9150612d5382612d12565b602082019050919050565b60006020820190508181036000830152612d7781612d3b565b9050919050565b600080fd5b600080fd5b60008085851115612d9c57612d9b612d7e565b5b83861115612dad57612dac612d83565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b6000612e138383612dc3565b82612e1e8135612dce565b92506014821015612e5e57612e597fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083601403600802612dfa565b831692505b505092915050565b7f546f6b656e5061796d61737465723a2077726f6e67206163636f756e7420666160008201527f63746f7279000000000000000000000000000000000000000000000000000000602082015250565b6000612ec2602583611cba565b9150612ecd82612e66565b604082019050919050565b60006020820190508181036000830152612ef181612eb5565b905091905056fea264697066735822122061bff95f9ab77d2fb098f8a4d265beb16b4aabba90f8663d515e0c13d19ecc1d64736f6c634300080d003300000000000000000000000009c58cf6be8e25560d479bd52b4417d15bca2845000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b57000000000000000000000000000000000000000000000000000000000000000c437573746f6d20546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044353544d00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101d85760003560e01c806395d89b4111610102578063c23a5cea11610095578063f0dda65c11610064578063f0dda65c14610680578063f2fde38b146106a9578063f465c77e146106d2578063fe9fbb8014610710576101d8565b8063c23a5cea146105e5578063c399ec881461060e578063d0e30db014610639578063dd62ed3e14610643576101d8565b8063a9059cbb116100d1578063a9059cbb1461053d578063a9a234091461057a578063b0d691fe146105a3578063bb9fe6bf146105ce576101d8565b806395d89b41146104815780639f5ca221146104ac578063a2bf6939146104d7578063a457c2d714610500576101d8565b8063313ce5671161017a578063789770f411610149578063789770f4146103d7578063796d43711461040257806389fabc801461042d5780638da5cb5b14610456576101d8565b8063313ce5671461031b578063395093511461034657806370a0823114610383578063715018a6146103c0576101d8565b8063177d2a74116101b6578063177d2a741461026157806318160ddd1461028a578063205c2878146102b557806323b872dd146102de576101d8565b80630396cb60146101dd57806306fdde03146101f9578063095ea7b314610224575b600080fd5b6101f760048036038101906101f29190611c82565b61074d565b005b34801561020557600080fd5b5061020e6107e4565b60405161021b9190611d48565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190611dfe565b610876565b6040516102589190611e59565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190611e74565b610899565b005b34801561029657600080fd5b5061029f6108fc565b6040516102ac9190611eb0565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190611f09565b610906565b005b3480156102ea57600080fd5b5061030560048036038101906103009190611f49565b61099f565b6040516103129190611e59565b60405180910390f35b34801561032757600080fd5b506103306109ce565b60405161033d9190611fb8565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190611dfe565b6109d7565b60405161037a9190611e59565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190611e74565b610a0e565b6040516103b79190611eb0565b60405180910390f35b3480156103cc57600080fd5b506103d5610a57565b005b3480156103e357600080fd5b506103ec610a6b565b6040516103f99190611eb0565b60405180910390f35b34801561040e57600080fd5b50610417610a71565b6040516104249190611eb0565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190611e74565b610a77565b005b34801561046257600080fd5b5061046b610ada565b6040516104789190611fe2565b60405180910390f35b34801561048d57600080fd5b50610496610b03565b6040516104a39190611d48565b60405180910390f35b3480156104b857600080fd5b506104c1610b95565b6040516104ce9190611fe2565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190611ffd565b610bb9565b005b34801561050c57600080fd5b5061052760048036038101906105229190611dfe565b610bcb565b6040516105349190611e59565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190611dfe565b610c42565b6040516105719190611e59565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c91906120b4565b610c65565b005b3480156105af57600080fd5b506105b8610c7f565b6040516105c59190612187565b60405180910390f35b3480156105da57600080fd5b506105e3610ca3565b005b3480156105f157600080fd5b5061060c600480360381019061060791906121a2565b610d2d565b005b34801561061a57600080fd5b50610623610dc3565b6040516106309190611eb0565b60405180910390f35b610641610e64565b005b34801561064f57600080fd5b5061066a600480360381019061066591906121cf565b610ef2565b6040516106779190611eb0565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a29190611dfe565b610f79565b005b3480156106b557600080fd5b506106d060048036038101906106cb9190611e74565b610f8f565b005b3480156106de57600080fd5b506106f960048036038101906106f4919061226a565b610fe1565b60405161070792919061232e565b60405180910390f35b34801561071c57600080fd5b5061073760048036038101906107329190611e74565b611004565b6040516107449190611e59565b60405180910390f35b61075561105a565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff16630396cb6034836040518363ffffffff1660e01b81526004016107af919061236d565b6000604051808303818588803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b505050505050565b6060600480546107f3906123b7565b80601f016020809104026020016040519081016040528092919081815260200182805461081f906123b7565b801561086c5780601f106108415761010080835404028352916020019161086c565b820191906000526020600020905b81548152906001019060200180831161084f57829003601f168201915b5050505050905090565b6000806108816110d8565b905061088e8185856110e0565b600191505092915050565b6108a161105a565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600354905090565b61090e61105a565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff1663205c287883836040518363ffffffff1660e01b81526004016109699291906123f7565b600060405180830381600087803b15801561098357600080fd5b505af1158015610997573d6000803e3d6000fd5b505050505050565b6000806109aa6110d8565b90506109b78582856112a9565b6109c2858585611335565b60019150509392505050565b60006012905090565b6000806109e26110d8565b9050610a038185856109f48589610ef2565b6109fe919061244f565b6110e0565b600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a5f61105a565b610a6960006115ae565b565b60065481565b613a9881565b610a7f61105a565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054610b12906123b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3e906123b7565b8015610b8b5780601f10610b6057610100808354040283529160200191610b8b565b820191906000526020600020905b815481529060010190602001808311610b6e57829003601f168201915b5050505050905090565b7f00000000000000000000000009c58cf6be8e25560d479bd52b4417d15bca284581565b610bc161105a565b8060068190555050565b600080610bd66110d8565b90506000610be48286610ef2565b905083811015610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090612517565b60405180910390fd5b610c3682868684036110e0565b60019250505092915050565b600080610c4d6110d8565b9050610c5a818585611335565b600191505092915050565b610c6d611672565b610c7984848484611702565b50505050565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5781565b610cab61105a565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610d1357600080fd5b505af1158015610d27573d6000803e3d6000fd5b50505050565b610d3561105a565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff1663c23a5cea826040518263ffffffff1660e01b8152600401610d8e9190612537565b600060405180830381600087803b158015610da857600080fd5b505af1158015610dbc573d6000803e3d6000fd5b5050505050565b60007f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e1e9190611fe2565b602060405180830381865afa158015610e3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5f9190612567565b905090565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff1663b760faf934306040518363ffffffff1660e01b8152600401610ebe9190611fe2565b6000604051808303818588803b158015610ed757600080fd5b505af1158015610eeb573d6000803e3d6000fd5b5050505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f8161105a565b610f8b8282611742565b5050565b610f9761105a565b610faa30610fa3610ada565b60006110e0565b610fb381611899565b610fde30827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6110e0565b50565b60606000610fed611672565b610ff885858561191c565b91509150935093915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6110626110d8565b73ffffffffffffffffffffffffffffffffffffffff16611080610ada565b73ffffffffffffffffffffffffffffffffffffffff16146110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd906125e0565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361114f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114690612672565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b590612704565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161129c9190611eb0565b60405180910390a3505050565b60006112b58484610ef2565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461132f5781811015611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890612770565b60405180910390fd5b61132e84848484036110e0565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90612802565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90612894565b60405180910390fd5b61141e8383836119da565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90612926565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115959190611eb0565b60405180910390a36115a88484846119df565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b5773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790612992565b60405180910390fd5b565b6000838381019061171391906121a2565b9050600061172d613a9884611728919061244f565b6119e4565b905061173a823083611335565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a8906129fe565b60405180910390fd5b6117bd600083836119da565b80600360008282546117cf919061244f565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118819190611eb0565b60405180910390a3611895600083836119df565b5050565b6118a161105a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190790612a90565b60405180910390fd5b611919816115ae565b50565b60606000808560000160208101906119349190611e74565b9050600760008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990612afc565b60405180910390fd5b6119cd8686866119fb565b9250925050935093915050565b505050565b505050565b6000600654826119f49190612b4b565b9050919050565b6060600080611a09846119e4565b9050613a988660a0013511611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90612bee565b60405180910390fd5b6000868060400190611a659190612c1d565b905014611ad757611a7586611b76565b80611a91876000016020810190611a8c9190611e74565b610a0e565b1015611ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac990612cf2565b60405180910390fd5b611b35565b80611af3876000016020810190611aee9190611e74565b610a0e565b1015611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90612d5e565b60405180910390fd5b5b856000016020810190611b489190611e74565b604051602001611b589190611fe2565b60405160208183030381529060405260009250925050935093915050565b6000818060400190611b889190612c1d565b600090601492611b9a93929190612d88565b90611ba59190612e07565b60601c90507f00000000000000000000000009c58cf6be8e25560d479bd52b4417d15bca284573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2f90612ed8565b60405180910390fd5b5050565b600080fd5b600080fd5b600063ffffffff82169050919050565b611c5f81611c46565b8114611c6a57600080fd5b50565b600081359050611c7c81611c56565b92915050565b600060208284031215611c9857611c97611c3c565b5b6000611ca684828501611c6d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611ce9578082015181840152602081019050611cce565b83811115611cf8576000848401525b50505050565b6000601f19601f8301169050919050565b6000611d1a82611caf565b611d248185611cba565b9350611d34818560208601611ccb565b611d3d81611cfe565b840191505092915050565b60006020820190508181036000830152611d628184611d0f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d9582611d6a565b9050919050565b611da581611d8a565b8114611db057600080fd5b50565b600081359050611dc281611d9c565b92915050565b6000819050919050565b611ddb81611dc8565b8114611de657600080fd5b50565b600081359050611df881611dd2565b92915050565b60008060408385031215611e1557611e14611c3c565b5b6000611e2385828601611db3565b9250506020611e3485828601611de9565b9150509250929050565b60008115159050919050565b611e5381611e3e565b82525050565b6000602082019050611e6e6000830184611e4a565b92915050565b600060208284031215611e8a57611e89611c3c565b5b6000611e9884828501611db3565b91505092915050565b611eaa81611dc8565b82525050565b6000602082019050611ec56000830184611ea1565b92915050565b6000611ed682611d6a565b9050919050565b611ee681611ecb565b8114611ef157600080fd5b50565b600081359050611f0381611edd565b92915050565b60008060408385031215611f2057611f1f611c3c565b5b6000611f2e85828601611ef4565b9250506020611f3f85828601611de9565b9150509250929050565b600080600060608486031215611f6257611f61611c3c565b5b6000611f7086828701611db3565b9350506020611f8186828701611db3565b9250506040611f9286828701611de9565b9150509250925092565b600060ff82169050919050565b611fb281611f9c565b82525050565b6000602082019050611fcd6000830184611fa9565b92915050565b611fdc81611d8a565b82525050565b6000602082019050611ff76000830184611fd3565b92915050565b60006020828403121561201357612012611c3c565b5b600061202184828501611de9565b91505092915050565b6003811061203757600080fd5b50565b6000813590506120498161202a565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126120745761207361204f565b5b8235905067ffffffffffffffff81111561209157612090612054565b5b6020830191508360018202830111156120ad576120ac612059565b5b9250929050565b600080600080606085870312156120ce576120cd611c3c565b5b60006120dc8782880161203a565b945050602085013567ffffffffffffffff8111156120fd576120fc611c41565b5b6121098782880161205e565b9350935050604061211c87828801611de9565b91505092959194509250565b6000819050919050565b600061214d61214861214384611d6a565b612128565b611d6a565b9050919050565b600061215f82612132565b9050919050565b600061217182612154565b9050919050565b61218181612166565b82525050565b600060208201905061219c6000830184612178565b92915050565b6000602082840312156121b8576121b7611c3c565b5b60006121c684828501611ef4565b91505092915050565b600080604083850312156121e6576121e5611c3c565b5b60006121f485828601611db3565b925050602061220585828601611db3565b9150509250929050565b600080fd5b6000610160828403121561222b5761222a61220f565b5b81905092915050565b6000819050919050565b61224781612234565b811461225257600080fd5b50565b6000813590506122648161223e565b92915050565b60008060006060848603121561228357612282611c3c565b5b600084013567ffffffffffffffff8111156122a1576122a0611c41565b5b6122ad86828701612214565b93505060206122be86828701612255565b92505060406122cf86828701611de9565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000612300826122d9565b61230a81856122e4565b935061231a818560208601611ccb565b61232381611cfe565b840191505092915050565b6000604082019050818103600083015261234881856122f5565b90506123576020830184611ea1565b9392505050565b61236781611c46565b82525050565b6000602082019050612382600083018461235e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806123cf57607f821691505b6020821081036123e2576123e1612388565b5b50919050565b6123f181611ecb565b82525050565b600060408201905061240c60008301856123e8565b6124196020830184611ea1565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061245a82611dc8565b915061246583611dc8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561249a57612499612420565b5b828201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612501602583611cba565b915061250c826124a5565b604082019050919050565b60006020820190508181036000830152612530816124f4565b9050919050565b600060208201905061254c60008301846123e8565b92915050565b60008151905061256181611dd2565b92915050565b60006020828403121561257d5761257c611c3c565b5b600061258b84828501612552565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006125ca602083611cba565b91506125d582612594565b602082019050919050565b600060208201905081810360008301526125f9816125bd565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061265c602483611cba565b915061266782612600565b604082019050919050565b6000602082019050818103600083015261268b8161264f565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006126ee602283611cba565b91506126f982612692565b604082019050919050565b6000602082019050818103600083015261271d816126e1565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061275a601d83611cba565b915061276582612724565b602082019050919050565b600060208201905081810360008301526127898161274d565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006127ec602583611cba565b91506127f782612790565b604082019050919050565b6000602082019050818103600083015261281b816127df565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061287e602383611cba565b915061288982612822565b604082019050919050565b600060208201905081810360008301526128ad81612871565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612910602683611cba565b915061291b826128b4565b604082019050919050565b6000602082019050818103600083015261293f81612903565b9050919050565b7f53656e646572206e6f7420456e747279506f696e740000000000000000000000600082015250565b600061297c601583611cba565b915061298782612946565b602082019050919050565b600060208201905081810360008301526129ab8161296f565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006129e8601f83611cba565b91506129f3826129b2565b602082019050919050565b60006020820190508181036000830152612a17816129db565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612a7a602683611cba565b9150612a8582612a1e565b604082019050919050565b60006020820190508181036000830152612aa981612a6d565b9050919050565b7f55736572206973206e6f7420617574686f72697a65642e000000000000000000600082015250565b6000612ae6601783611cba565b9150612af182612ab0565b602082019050919050565b60006020820190508181036000830152612b1581612ad9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612b5682611dc8565b9150612b6183611dc8565b925082612b7157612b70612b1c565b5b828204905092915050565b7f546f6b656e5061796d61737465723a2067617320746f6f206c6f7720666f722060008201527f706f73744f700000000000000000000000000000000000000000000000000000602082015250565b6000612bd8602683611cba565b9150612be382612b7c565b604082019050919050565b60006020820190508181036000830152612c0781612bcb565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112612c3a57612c39612c0e565b5b80840192508235915067ffffffffffffffff821115612c5c57612c5b612c13565b5b602083019250600182023603831315612c7857612c77612c18565b5b509250929050565b7f546f6b656e5061796d61737465723a206e6f2062616c616e636520287072652d60008201527f6372656174652900000000000000000000000000000000000000000000000000602082015250565b6000612cdc602783611cba565b9150612ce782612c80565b604082019050919050565b60006020820190508181036000830152612d0b81612ccf565b9050919050565b7f546f6b656e5061796d61737465723a206e6f2062616c616e6365000000000000600082015250565b6000612d48601a83611cba565b9150612d5382612d12565b602082019050919050565b60006020820190508181036000830152612d7781612d3b565b9050919050565b600080fd5b600080fd5b60008085851115612d9c57612d9b612d7e565b5b83861115612dad57612dac612d83565b5b6001850283019150848603905094509492505050565b600082905092915050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b600082821b905092915050565b6000612e138383612dc3565b82612e1e8135612dce565b92506014821015612e5e57612e597fffffffffffffffffffffffffffffffffffffffff00000000000000000000000083601403600802612dfa565b831692505b505092915050565b7f546f6b656e5061796d61737465723a2077726f6e67206163636f756e7420666160008201527f63746f7279000000000000000000000000000000000000000000000000000000602082015250565b6000612ec2602583611cba565b9150612ecd82612e66565b604082019050919050565b60006020820190508181036000830152612ef181612eb5565b905091905056fea264697066735822122061bff95f9ab77d2fb098f8a4d265beb16b4aabba90f8663d515e0c13d19ecc1d64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000009c58cf6be8e25560d479bd52b4417d15bca2845000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b57000000000000000000000000000000000000000000000000000000000000000c437573746f6d20546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044353544d00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : accountFactory (address): 0x09c58cf6be8E25560d479bd52B4417d15bCA2845
Arg [1] : _name (string): Custom Token
Arg [2] : _symbol (string): CSTM
Arg [3] : _entryPoint (address): 0x0576a174D229E3cFA37253523E645A78A0C91B57
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000009c58cf6be8e25560d479bd52b4417d15bca2845
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000576a174d229e3cfa37253523e645a78a0c91b57
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 437573746f6d20546f6b656e0000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 4353544d00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
494:1452:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3094:141:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2154:98:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4431:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1629:97:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3242:106:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2721:149:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5190:286:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3091:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5871:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3406:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:7;;;;;;;;;;;;;:::i;:::-;;547:31:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1331:44:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1732:102:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2365:102:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1382:35:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1054:89:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6592:427:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3727:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::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;:::-;;3974:149:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2096:115:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2454:358;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;632:290:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1840:103:12;;;;;;;;;;;;;;;;;;;;;;;:::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;2154:98:8:-;2208:13;2240:5;2233:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2154:98;:::o;4431:197::-;4514:4;4530:13;4546:12;:10;:12::i;:::-;4530:28;;4568:32;4577:5;4584:7;4593:6;4568:8;:32::i;:::-;4617:4;4610:11;;;4431:197;;;;:::o;1629:97:12:-;1094:13:7;:11;:13::i;:::-;1715:4:12::1;1696:10;:16;1707:4;1696:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;1629:97:::0;:::o;3242:106:8:-;3303:7;3329:12;;3322:19;;3242:106;:::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;5190:286:8:-;5317:4;5333:15;5351:12;:10;:12::i;:::-;5333:30;;5373:38;5389:4;5395:7;5404:6;5373:15;:38::i;:::-;5421:27;5431:4;5437:2;5441:6;5421:9;:27::i;:::-;5465:4;5458:11;;;5190:286;;;;;:::o;3091:91::-;3149:5;3173:2;3166:9;;3091:91;:::o;5871:234::-;5959:4;5975:13;5991:12;:10;:12::i;:::-;5975:28;;6013:64;6022:5;6029:7;6066:10;6038:25;6048:5;6055:7;6038:9;:25::i;:::-;:38;;;;:::i;:::-;6013:8;:64::i;:::-;6094:4;6087:11;;;5871:234;;;;:::o;3406:125::-;3480:7;3506:9;:18;3516:7;3506:18;;;;;;;;;;;;;;;;3499:25;;3406:125;;;:::o;1831:101:7:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;547:31:12:-;;;;:::o;1331:44:13:-;1370:5;1331:44;:::o;1732:102:12:-;1094:13:7;:11;:13::i;:::-;1822:5:12::1;1803:10;:16;1814:4;1803:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;1732:102:::0;:::o;1201:85:7:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;2365:102:8:-;2421:13;2453:7;2446:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2365:102;:::o;1382:35:13:-;;;:::o;1054:89:12:-;1094:13:7;:11;:13::i;:::-;1131:5:12::1;1118:10;:18;;;;1054:89:::0;:::o;6592:427:8:-;6685:4;6701:13;6717:12;:10;:12::i;:::-;6701:28;;6739:24;6766:25;6776:5;6783:7;6766:9;:25::i;:::-;6739:52;;6829:15;6809:16;:35;;6801:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6920:60;6929:5;6936:7;6964:15;6945:16;:34;6920:8;:60::i;:::-;7008:4;7001:11;;;;6592:427;;;;:::o;3727:189::-;3806:4;3822:13;3838:12;:10;:12::i;:::-;3822:28;;3860;3870:5;3877:2;3881:6;3860:9;:28::i;:::-;3905:4;3898:11;;;3727:189;;;;:::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;3974:149:8:-;4063:7;4089:11;:18;4101:5;4089:18;;;;;;;;;;;;;;;:27;4108:7;4089:27;;;;;;;;;;;;;;;;4082:34;;3974:149;;;;:::o;2096:115:13:-;1094:13:7;:11;:13::i;:::-;2180:24:13::1;2186:9;2197:6;2180:5;:24::i;:::-;2096:115:::0;;:::o;2454:358::-;1094:13:7;:11;:13::i;:::-;2588:35:13::1;2605:4;2612:7;:5;:7::i;:::-;2621:1;2588:8;:35::i;:::-;2633:33;2657:8;2633:23;:33::i;:::-;2756:49;2773:4;2780:8;2790:14;2756:8;:49::i;:::-;2454:358:::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;1840:103:12:-;1897:4;1920:10;:16;1931:4;1920:16;;;;;;;;;;;;;;;;;;;;;;;;;1913:23;;1840:103;;;:::o;1359:130:7:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;640:96:11:-;693:7;719:10;712:17;;640:96;:::o;10504:370:8:-;10652:1;10635:19;;:5;:19;;;10627:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10732:1;10713:21;;:7;:21;;;10705:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10814:6;10784:11;:18;10796:5;10784:18;;;;;;;;;;;;;;;:27;10803:7;10784:27;;;;;;;;;;;;;;;:36;;;;10851:7;10835:32;;10844:5;10835:32;;;10860:6;10835:32;;;;;;:::i;:::-;;;;;;;;10504:370;;;:::o;11155:441::-;11285:24;11312:25;11322:5;11329:7;11312:9;:25::i;:::-;11285:52;;11371:17;11351:16;:37;11347:243;;11432:6;11412:16;:26;;11404:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11514:51;11523:5;11530:7;11558:6;11539:16;:25;11514:8;:51::i;:::-;11347:243;11275:321;11155:441;;;:::o;7473:818::-;7615:1;7599:18;;:4;:18;;;7591:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7691:1;7677:16;;:2;:16;;;7669:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7744:38;7765:4;7771:2;7775:6;7744:20;:38::i;:::-;7793:19;7815:9;:15;7825:4;7815:15;;;;;;;;;;;;;;;;7793:37;;7863:6;7848:11;:21;;7840:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;7978:6;7964:11;:20;7946:9;:15;7956:4;7946:15;;;;;;;;;;;;;;;:38;;;;8178:6;8161:9;:13;8171:2;8161:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;8225:2;8210:26;;8219:4;8210:26;;;8229:6;8210:26;;;;;;:::i;:::-;;;;;;;;8247:37;8267:4;8273:2;8277:6;8247:19;:37::i;:::-;7581:710;7473:818;;;:::o;2433:187:7:-;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;5131:508:13:-;5347:14;5375:7;;5364:30;;;;;;;:::i;:::-;5347:47;;5404:14;5421:48;1370:5;5440:13;:28;;;;:::i;:::-;5421:18;:48::i;:::-;5404:65;;5592:40;5602:6;5618:4;5625:6;5592:9;:40::i;:::-;5230:409;;5131:508;;;;:::o;8567:535:8:-;8669:1;8650:21;;:7;:21;;;8642:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;8718:49;8747:1;8751:7;8760:6;8718:20;:49::i;:::-;8794:6;8778:12;;:22;;;;;;;:::i;:::-;;;;;;;;8968:6;8946:9;:18;8956:7;8946:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;9020:7;8999:37;;9016:1;8999:37;;;9029:6;8999:37;;;;;;:::i;:::-;;;;;;;;9047:48;9075:1;9079:7;9088:6;9047:19;:48::i;:::-;8567:535;;:::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;1149:397:12:-;1299:20;1321:22;1364:12;1379:6;:13;;;;;;;;;;:::i;:::-;1364:28;;1410:10;:16;1421:4;1410:16;;;;;;;;;;;;;;;;;;;;;;;;;1402:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1472:67;1503:6;1511:10;1523:15;1472:30;:67::i;:::-;1465:74;;;;;1149:397;;;;;;:::o;12180:121:8:-;;;;:::o;12889:120::-;;;;:::o;858:151:12:-;944:18;992:10;;981:8;:21;;;;:::i;:::-;974:28;;858:151;;;:::o;3330:926:13:-;3488:20;3510:22;3544:20;3567:35;3586:15;3567:18;:35::i;:::-;3544:58;;1370:5;3803:6;:27;;;:42;3795:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;3929:1;3903:6;:15;;;;;;;;:::i;:::-;:22;;:27;3899:303;;3946:28;3967:6;3946:20;:28::i;:::-;4024:12;3996:24;4006:6;:13;;;;;;;;;;:::i;:::-;3996:9;:24::i;:::-;:40;;3988:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;3899:303;;;4148:12;4120:24;4130:6;:13;;;;;;;;;;:::i;:::-;4120:9;:24::i;:::-;:40;;4112:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;3899:303;4231:6;:13;;;;;;;;;;:::i;:::-;4220:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;4247:1;4212:37;;;;;3330:926;;;;;;:::o;4420:240::-;4513:15;4547:6;:15;;;;;;;;:::i;:::-;4563:1;4547:23;4567:2;4547:23;;;;;;;:::i;:::-;4539:32;;;;;:::i;:::-;4531:41;;4513:59;;4601:10;4590:21;;:7;:21;;;4582:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;4503:157;4420:240;:::o;88:117:14:-;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:99::-;1087:6;1121:5;1115:12;1105:22;;1035:99;;;:::o;1140:169::-;1224:11;1258:6;1253:3;1246:19;1298:4;1293:3;1289:14;1274:29;;1140:169;;;;:::o;1315:307::-;1383:1;1393:113;1407:6;1404:1;1401:13;1393:113;;;1492:1;1487:3;1483:11;1477:18;1473:1;1468:3;1464:11;1457:39;1429:2;1426:1;1422:10;1417:15;;1393:113;;;1524:6;1521:1;1518:13;1515:101;;;1604:1;1595:6;1590:3;1586:16;1579:27;1515:101;1364:258;1315:307;;;:::o;1628:102::-;1669:6;1720:2;1716:7;1711:2;1704:5;1700:14;1696:28;1686:38;;1628:102;;;:::o;1736:364::-;1824:3;1852:39;1885:5;1852:39;:::i;:::-;1907:71;1971:6;1966:3;1907:71;:::i;:::-;1900:78;;1987:52;2032:6;2027:3;2020:4;2013:5;2009:16;1987:52;:::i;:::-;2064:29;2086:6;2064:29;:::i;:::-;2059:3;2055:39;2048:46;;1828:272;1736:364;;;;:::o;2106:313::-;2219:4;2257:2;2246:9;2242:18;2234:26;;2306:9;2300:4;2296:20;2292:1;2281:9;2277:17;2270:47;2334:78;2407:4;2398:6;2334:78;:::i;:::-;2326:86;;2106:313;;;;:::o;2425:126::-;2462:7;2502:42;2495:5;2491:54;2480:65;;2425:126;;;:::o;2557:96::-;2594:7;2623:24;2641:5;2623:24;:::i;:::-;2612:35;;2557:96;;;:::o;2659:122::-;2732:24;2750:5;2732:24;:::i;:::-;2725:5;2722:35;2712:63;;2771:1;2768;2761:12;2712:63;2659:122;:::o;2787:139::-;2833:5;2871:6;2858:20;2849:29;;2887:33;2914:5;2887:33;:::i;:::-;2787:139;;;;:::o;2932:77::-;2969:7;2998:5;2987:16;;2932:77;;;:::o;3015:122::-;3088:24;3106:5;3088:24;:::i;:::-;3081:5;3078:35;3068:63;;3127:1;3124;3117:12;3068:63;3015:122;:::o;3143:139::-;3189:5;3227:6;3214:20;3205:29;;3243:33;3270:5;3243:33;:::i;:::-;3143:139;;;;:::o;3288:474::-;3356:6;3364;3413:2;3401:9;3392:7;3388:23;3384:32;3381:119;;;3419:79;;:::i;:::-;3381:119;3539:1;3564:53;3609:7;3600:6;3589:9;3585:22;3564:53;:::i;:::-;3554:63;;3510:117;3666:2;3692:53;3737:7;3728:6;3717:9;3713:22;3692:53;:::i;:::-;3682:63;;3637:118;3288:474;;;;;:::o;3768:90::-;3802:7;3845:5;3838:13;3831:21;3820:32;;3768:90;;;:::o;3864:109::-;3945:21;3960:5;3945:21;:::i;:::-;3940:3;3933:34;3864:109;;:::o;3979:210::-;4066:4;4104:2;4093:9;4089:18;4081:26;;4117:65;4179:1;4168:9;4164:17;4155:6;4117:65;:::i;:::-;3979:210;;;;:::o;4195:329::-;4254:6;4303:2;4291:9;4282:7;4278:23;4274:32;4271:119;;;4309:79;;:::i;:::-;4271:119;4429:1;4454:53;4499:7;4490:6;4479:9;4475:22;4454:53;:::i;:::-;4444:63;;4400:117;4195:329;;;;:::o;4530:118::-;4617:24;4635:5;4617:24;:::i;:::-;4612:3;4605:37;4530:118;;:::o;4654:222::-;4747:4;4785:2;4774:9;4770:18;4762:26;;4798:71;4866:1;4855:9;4851:17;4842:6;4798:71;:::i;:::-;4654:222;;;;:::o;4882:104::-;4927:7;4956:24;4974:5;4956:24;:::i;:::-;4945:35;;4882:104;;;:::o;4992:138::-;5073:32;5099:5;5073:32;:::i;:::-;5066:5;5063:43;5053:71;;5120:1;5117;5110:12;5053:71;4992:138;:::o;5136:155::-;5190:5;5228:6;5215:20;5206:29;;5244:41;5279:5;5244:41;:::i;:::-;5136:155;;;;:::o;5297:490::-;5373:6;5381;5430:2;5418:9;5409:7;5405:23;5401:32;5398:119;;;5436:79;;:::i;:::-;5398:119;5556:1;5581:61;5634:7;5625:6;5614:9;5610:22;5581:61;:::i;:::-;5571:71;;5527:125;5691:2;5717:53;5762:7;5753:6;5742:9;5738:22;5717:53;:::i;:::-;5707:63;;5662:118;5297:490;;;;;:::o;5793:619::-;5870:6;5878;5886;5935:2;5923:9;5914:7;5910:23;5906:32;5903:119;;;5941:79;;:::i;:::-;5903:119;6061:1;6086:53;6131:7;6122:6;6111:9;6107:22;6086:53;:::i;:::-;6076:63;;6032:117;6188:2;6214:53;6259:7;6250:6;6239:9;6235:22;6214:53;:::i;:::-;6204:63;;6159:118;6316:2;6342:53;6387:7;6378:6;6367:9;6363:22;6342:53;:::i;:::-;6332:63;;6287:118;5793:619;;;;;:::o;6418:86::-;6453:7;6493:4;6486:5;6482:16;6471:27;;6418:86;;;:::o;6510:112::-;6593:22;6609:5;6593:22;:::i;:::-;6588:3;6581:35;6510:112;;:::o;6628:214::-;6717:4;6755:2;6744:9;6740:18;6732:26;;6768:67;6832:1;6821:9;6817:17;6808:6;6768:67;:::i;:::-;6628:214;;;;:::o;6848:118::-;6935:24;6953:5;6935:24;:::i;:::-;6930:3;6923:37;6848:118;;:::o;6972:222::-;7065:4;7103:2;7092:9;7088:18;7080:26;;7116:71;7184:1;7173:9;7169:17;7160:6;7116:71;:::i;:::-;6972:222;;;;:::o;7200:329::-;7259:6;7308:2;7296:9;7287:7;7283:23;7279:32;7276:119;;;7314:79;;:::i;:::-;7276:119;7434:1;7459:53;7504:7;7495:6;7484:9;7480:22;7459:53;:::i;:::-;7449:63;;7405:117;7200:329;;;;:::o;7535:113::-;7622:1;7615:5;7612:12;7602:40;;7638:1;7635;7628:12;7602:40;7535:113;:::o;7654:167::-;7714:5;7752:6;7739:20;7730:29;;7768:47;7809:5;7768:47;:::i;:::-;7654:167;;;;:::o;7827:117::-;7936:1;7933;7926:12;7950:117;8059:1;8056;8049:12;8073:117;8182:1;8179;8172:12;8209:552;8266:8;8276:6;8326:3;8319:4;8311:6;8307:17;8303:27;8293:122;;8334:79;;:::i;:::-;8293:122;8447:6;8434:20;8424:30;;8477:18;8469:6;8466:30;8463:117;;;8499:79;;:::i;:::-;8463:117;8613:4;8605:6;8601:17;8589:29;;8667:3;8659:4;8651:6;8647:17;8637:8;8633:32;8630:41;8627:128;;;8674:79;;:::i;:::-;8627:128;8209:552;;;;;:::o;8767:845::-;8869:6;8877;8885;8893;8942:2;8930:9;8921:7;8917:23;8913:32;8910:119;;;8948:79;;:::i;:::-;8910:119;9068:1;9093:67;9152:7;9143:6;9132:9;9128:22;9093:67;:::i;:::-;9083:77;;9039:131;9237:2;9226:9;9222:18;9209:32;9268:18;9260:6;9257:30;9254:117;;;9290:79;;:::i;:::-;9254:117;9403:64;9459:7;9450:6;9439:9;9435:22;9403:64;:::i;:::-;9385:82;;;;9180:297;9516:2;9542:53;9587:7;9578:6;9567:9;9563:22;9542:53;:::i;:::-;9532:63;;9487:118;8767:845;;;;;;;:::o;9618:60::-;9646:3;9667:5;9660:12;;9618:60;;;:::o;9684:142::-;9734:9;9767:53;9785:34;9794:24;9812:5;9794:24;:::i;:::-;9785:34;:::i;:::-;9767:53;:::i;:::-;9754:66;;9684:142;;;:::o;9832:126::-;9882:9;9915:37;9946:5;9915:37;:::i;:::-;9902:50;;9832:126;;;:::o;9964:145::-;10033:9;10066:37;10097:5;10066:37;:::i;:::-;10053:50;;9964:145;;;:::o;10115:169::-;10221:56;10271:5;10221:56;:::i;:::-;10216:3;10209:69;10115:169;;:::o;10290:260::-;10402:4;10440:2;10429:9;10425:18;10417:26;;10453:90;10540:1;10529:9;10525:17;10516:6;10453:90;:::i;:::-;10290:260;;;;:::o;10556:345::-;10623:6;10672:2;10660:9;10651:7;10647:23;10643:32;10640:119;;;10678:79;;:::i;:::-;10640:119;10798:1;10823:61;10876:7;10867:6;10856:9;10852:22;10823:61;:::i;:::-;10813:71;;10769:125;10556:345;;;;:::o;10907:474::-;10975:6;10983;11032:2;11020:9;11011:7;11007:23;11003:32;11000:119;;;11038:79;;:::i;:::-;11000:119;11158:1;11183:53;11228:7;11219:6;11208:9;11204:22;11183:53;:::i;:::-;11173:63;;11129:117;11285:2;11311:53;11356:7;11347:6;11336:9;11332:22;11311:53;:::i;:::-;11301:63;;11256:118;10907:474;;;;;:::o;11387:117::-;11496:1;11493;11486:12;11538:237;11616:5;11657:3;11648:6;11643:3;11639:16;11635:26;11632:113;;;11664:79;;:::i;:::-;11632:113;11763:6;11754:15;;11538:237;;;;:::o;11781:77::-;11818:7;11847:5;11836:16;;11781:77;;;:::o;11864:122::-;11937:24;11955:5;11937:24;:::i;:::-;11930:5;11927:35;11917:63;;11976:1;11973;11966:12;11917:63;11864:122;:::o;11992:139::-;12038:5;12076:6;12063:20;12054:29;;12092:33;12119:5;12092:33;:::i;:::-;11992:139;;;;:::o;12137:843::-;12246:6;12254;12262;12311:2;12299:9;12290:7;12286:23;12282:32;12279:119;;;12317:79;;:::i;:::-;12279:119;12465:1;12454:9;12450:17;12437:31;12495:18;12487:6;12484:30;12481:117;;;12517:79;;:::i;:::-;12481:117;12622:85;12699:7;12690:6;12679:9;12675:22;12622:85;:::i;:::-;12612:95;;12408:309;12756:2;12782:53;12827:7;12818:6;12807:9;12803:22;12782:53;:::i;:::-;12772:63;;12727:118;12884:2;12910:53;12955:7;12946:6;12935:9;12931:22;12910:53;:::i;:::-;12900:63;;12855:118;12137:843;;;;;:::o;12986:98::-;13037:6;13071:5;13065:12;13055:22;;12986:98;;;:::o;13090:168::-;13173:11;13207:6;13202:3;13195:19;13247:4;13242:3;13238:14;13223:29;;13090:168;;;;:::o;13264:360::-;13350:3;13378:38;13410:5;13378:38;:::i;:::-;13432:70;13495:6;13490:3;13432:70;:::i;:::-;13425:77;;13511:52;13556:6;13551:3;13544:4;13537:5;13533:16;13511:52;:::i;:::-;13588:29;13610:6;13588:29;:::i;:::-;13583:3;13579:39;13572:46;;13354:270;13264:360;;;;:::o;13630:419::-;13769:4;13807:2;13796:9;13792:18;13784:26;;13856:9;13850:4;13846:20;13842:1;13831:9;13827:17;13820:47;13884:76;13955:4;13946:6;13884:76;:::i;:::-;13876:84;;13970:72;14038:2;14027:9;14023:18;14014:6;13970:72;:::i;:::-;13630:419;;;;;:::o;14055:115::-;14140:23;14157:5;14140:23;:::i;:::-;14135:3;14128:36;14055:115;;:::o;14176:218::-;14267:4;14305:2;14294:9;14290:18;14282:26;;14318:69;14384:1;14373:9;14369:17;14360:6;14318:69;:::i;:::-;14176:218;;;;:::o;14400:180::-;14448:77;14445:1;14438:88;14545:4;14542:1;14535:15;14569:4;14566:1;14559:15;14586:320;14630:6;14667:1;14661:4;14657:12;14647:22;;14714:1;14708:4;14704:12;14735:18;14725:81;;14791:4;14783:6;14779:17;14769:27;;14725:81;14853:2;14845:6;14842:14;14822:18;14819:38;14816:84;;14872:18;;:::i;:::-;14816:84;14637:269;14586:320;;;:::o;14912:142::-;15015:32;15041:5;15015:32;:::i;:::-;15010:3;15003:45;14912:142;;:::o;15060:364::-;15197:4;15235:2;15224:9;15220:18;15212:26;;15248:87;15332:1;15321:9;15317:17;15308:6;15248:87;:::i;:::-;15345:72;15413:2;15402:9;15398:18;15389:6;15345:72;:::i;:::-;15060:364;;;;;:::o;15430:180::-;15478:77;15475:1;15468:88;15575:4;15572:1;15565:15;15599:4;15596:1;15589:15;15616:305;15656:3;15675:20;15693:1;15675:20;:::i;:::-;15670:25;;15709:20;15727:1;15709:20;:::i;:::-;15704:25;;15863:1;15795:66;15791:74;15788:1;15785:81;15782:107;;;15869:18;;:::i;:::-;15782:107;15913:1;15910;15906:9;15899:16;;15616:305;;;;:::o;15927:224::-;16067:34;16063:1;16055:6;16051:14;16044:58;16136:7;16131:2;16123:6;16119:15;16112:32;15927:224;:::o;16157:366::-;16299:3;16320:67;16384:2;16379:3;16320:67;:::i;:::-;16313:74;;16396:93;16485:3;16396:93;:::i;:::-;16514:2;16509:3;16505:12;16498:19;;16157:366;;;:::o;16529:419::-;16695:4;16733:2;16722:9;16718:18;16710:26;;16782:9;16776:4;16772:20;16768:1;16757:9;16753:17;16746:47;16810:131;16936:4;16810:131;:::i;:::-;16802:139;;16529:419;;;:::o;16954:254::-;17063:4;17101:2;17090:9;17086:18;17078:26;;17114:87;17198:1;17187:9;17183:17;17174:6;17114:87;:::i;:::-;16954:254;;;;:::o;17214:143::-;17271:5;17302:6;17296:13;17287:22;;17318:33;17345:5;17318:33;:::i;:::-;17214:143;;;;:::o;17363:351::-;17433:6;17482:2;17470:9;17461:7;17457:23;17453:32;17450:119;;;17488:79;;:::i;:::-;17450:119;17608:1;17633:64;17689:7;17680:6;17669:9;17665:22;17633:64;:::i;:::-;17623:74;;17579:128;17363:351;;;;:::o;17720:182::-;17860:34;17856:1;17848:6;17844:14;17837:58;17720:182;:::o;17908:366::-;18050:3;18071:67;18135:2;18130:3;18071:67;:::i;:::-;18064:74;;18147:93;18236:3;18147:93;:::i;:::-;18265:2;18260:3;18256:12;18249:19;;17908:366;;;:::o;18280:419::-;18446:4;18484:2;18473:9;18469:18;18461:26;;18533:9;18527:4;18523:20;18519:1;18508:9;18504:17;18497:47;18561:131;18687:4;18561:131;:::i;:::-;18553:139;;18280:419;;;:::o;18705:223::-;18845:34;18841:1;18833:6;18829:14;18822:58;18914:6;18909:2;18901:6;18897:15;18890:31;18705:223;:::o;18934:366::-;19076:3;19097:67;19161:2;19156:3;19097:67;:::i;:::-;19090:74;;19173:93;19262:3;19173:93;:::i;:::-;19291:2;19286:3;19282:12;19275:19;;18934:366;;;:::o;19306:419::-;19472:4;19510:2;19499:9;19495:18;19487:26;;19559:9;19553:4;19549:20;19545:1;19534:9;19530:17;19523:47;19587:131;19713:4;19587:131;:::i;:::-;19579:139;;19306:419;;;:::o;19731:221::-;19871:34;19867:1;19859:6;19855:14;19848:58;19940:4;19935:2;19927:6;19923:15;19916:29;19731:221;:::o;19958:366::-;20100:3;20121:67;20185:2;20180:3;20121:67;:::i;:::-;20114:74;;20197:93;20286:3;20197:93;:::i;:::-;20315:2;20310:3;20306:12;20299:19;;19958:366;;;:::o;20330:419::-;20496:4;20534:2;20523:9;20519:18;20511:26;;20583:9;20577:4;20573:20;20569:1;20558:9;20554:17;20547:47;20611:131;20737:4;20611:131;:::i;:::-;20603:139;;20330:419;;;:::o;20755:179::-;20895:31;20891:1;20883:6;20879:14;20872:55;20755:179;:::o;20940:366::-;21082:3;21103:67;21167:2;21162:3;21103:67;:::i;:::-;21096:74;;21179:93;21268:3;21179:93;:::i;:::-;21297:2;21292:3;21288:12;21281:19;;20940:366;;;:::o;21312:419::-;21478:4;21516:2;21505:9;21501:18;21493:26;;21565:9;21559:4;21555:20;21551:1;21540:9;21536:17;21529:47;21593:131;21719:4;21593:131;:::i;:::-;21585:139;;21312:419;;;:::o;21737:224::-;21877:34;21873:1;21865:6;21861:14;21854:58;21946:7;21941:2;21933:6;21929:15;21922:32;21737:224;:::o;21967:366::-;22109:3;22130:67;22194:2;22189:3;22130:67;:::i;:::-;22123:74;;22206:93;22295:3;22206:93;:::i;:::-;22324:2;22319:3;22315:12;22308:19;;21967:366;;;:::o;22339:419::-;22505:4;22543:2;22532:9;22528:18;22520:26;;22592:9;22586:4;22582:20;22578:1;22567:9;22563:17;22556:47;22620:131;22746:4;22620:131;:::i;:::-;22612:139;;22339:419;;;:::o;22764:222::-;22904:34;22900:1;22892:6;22888:14;22881:58;22973:5;22968:2;22960:6;22956:15;22949:30;22764:222;:::o;22992:366::-;23134:3;23155:67;23219:2;23214:3;23155:67;:::i;:::-;23148:74;;23231:93;23320:3;23231:93;:::i;:::-;23349:2;23344:3;23340:12;23333:19;;22992:366;;;:::o;23364:419::-;23530:4;23568:2;23557:9;23553:18;23545:26;;23617:9;23611:4;23607:20;23603:1;23592:9;23588:17;23581:47;23645:131;23771:4;23645:131;:::i;:::-;23637:139;;23364:419;;;:::o;23789:225::-;23929:34;23925:1;23917:6;23913:14;23906:58;23998:8;23993:2;23985:6;23981:15;23974:33;23789:225;:::o;24020:366::-;24162:3;24183:67;24247:2;24242:3;24183:67;:::i;:::-;24176:74;;24259:93;24348:3;24259:93;:::i;:::-;24377:2;24372:3;24368:12;24361:19;;24020:366;;;:::o;24392:419::-;24558:4;24596:2;24585:9;24581:18;24573:26;;24645:9;24639:4;24635:20;24631:1;24620:9;24616:17;24609:47;24673:131;24799:4;24673:131;:::i;:::-;24665:139;;24392:419;;;:::o;24817:171::-;24957:23;24953:1;24945:6;24941:14;24934:47;24817:171;:::o;24994:366::-;25136:3;25157:67;25221:2;25216:3;25157:67;:::i;:::-;25150:74;;25233:93;25322:3;25233:93;:::i;:::-;25351:2;25346:3;25342:12;25335:19;;24994:366;;;:::o;25366:419::-;25532:4;25570:2;25559:9;25555:18;25547:26;;25619:9;25613:4;25609:20;25605:1;25594:9;25590:17;25583:47;25647:131;25773:4;25647:131;:::i;:::-;25639:139;;25366:419;;;:::o;25791:181::-;25931:33;25927:1;25919:6;25915:14;25908:57;25791:181;:::o;25978:366::-;26120:3;26141:67;26205:2;26200:3;26141:67;:::i;:::-;26134:74;;26217:93;26306:3;26217:93;:::i;:::-;26335:2;26330:3;26326:12;26319:19;;25978:366;;;:::o;26350:419::-;26516:4;26554:2;26543:9;26539:18;26531:26;;26603:9;26597:4;26593:20;26589:1;26578:9;26574:17;26567:47;26631:131;26757:4;26631:131;:::i;:::-;26623:139;;26350:419;;;:::o;26775:225::-;26915:34;26911:1;26903:6;26899:14;26892:58;26984:8;26979:2;26971:6;26967:15;26960:33;26775:225;:::o;27006:366::-;27148:3;27169:67;27233:2;27228:3;27169:67;:::i;:::-;27162:74;;27245:93;27334:3;27245:93;:::i;:::-;27363:2;27358:3;27354:12;27347:19;;27006:366;;;:::o;27378:419::-;27544:4;27582:2;27571:9;27567:18;27559:26;;27631:9;27625:4;27621:20;27617:1;27606:9;27602:17;27595:47;27659:131;27785:4;27659:131;:::i;:::-;27651:139;;27378:419;;;:::o;27803:173::-;27943:25;27939:1;27931:6;27927:14;27920:49;27803:173;:::o;27982:366::-;28124:3;28145:67;28209:2;28204:3;28145:67;:::i;:::-;28138:74;;28221:93;28310:3;28221:93;:::i;:::-;28339:2;28334:3;28330:12;28323:19;;27982:366;;;:::o;28354:419::-;28520:4;28558:2;28547:9;28543:18;28535:26;;28607:9;28601:4;28597:20;28593:1;28582:9;28578:17;28571:47;28635:131;28761:4;28635:131;:::i;:::-;28627:139;;28354:419;;;:::o;28779:180::-;28827:77;28824:1;28817:88;28924:4;28921:1;28914:15;28948:4;28945:1;28938:15;28965:185;29005:1;29022:20;29040:1;29022:20;:::i;:::-;29017:25;;29056:20;29074:1;29056:20;:::i;:::-;29051:25;;29095:1;29085:35;;29100:18;;:::i;:::-;29085:35;29142:1;29139;29135:9;29130:14;;28965:185;;;;:::o;29156:225::-;29296:34;29292:1;29284:6;29280:14;29273:58;29365:8;29360:2;29352:6;29348:15;29341:33;29156:225;:::o;29387:366::-;29529:3;29550:67;29614:2;29609:3;29550:67;:::i;:::-;29543:74;;29626:93;29715:3;29626:93;:::i;:::-;29744:2;29739:3;29735:12;29728:19;;29387:366;;;:::o;29759:419::-;29925:4;29963:2;29952:9;29948:18;29940:26;;30012:9;30006:4;30002:20;29998:1;29987:9;29983:17;29976:47;30040:131;30166:4;30040:131;:::i;:::-;30032:139;;29759:419;;;:::o;30184:117::-;30293:1;30290;30283:12;30307:117;30416:1;30413;30406:12;30430:117;30539:1;30536;30529:12;30553:724;30630:4;30636:6;30692:11;30679:25;30792:1;30786:4;30782:12;30771:8;30755:14;30751:29;30747:48;30727:18;30723:73;30713:168;;30800:79;;:::i;:::-;30713:168;30912:18;30902:8;30898:33;30890:41;;30964:4;30951:18;30941:28;;30992:18;30984:6;30981:30;30978:117;;;31014:79;;:::i;:::-;30978:117;31122:2;31116:4;31112:13;31104:21;;31179:4;31171:6;31167:17;31151:14;31147:38;31141:4;31137:49;31134:136;;;31189:79;;:::i;:::-;31134:136;30643:634;30553:724;;;;;:::o;31283:226::-;31423:34;31419:1;31411:6;31407:14;31400:58;31492:9;31487:2;31479:6;31475:15;31468:34;31283:226;:::o;31515:366::-;31657:3;31678:67;31742:2;31737:3;31678:67;:::i;:::-;31671:74;;31754:93;31843:3;31754:93;:::i;:::-;31872:2;31867:3;31863:12;31856:19;;31515:366;;;:::o;31887:419::-;32053:4;32091:2;32080:9;32076:18;32068:26;;32140:9;32134:4;32130:20;32126:1;32115:9;32111:17;32104:47;32168:131;32294:4;32168:131;:::i;:::-;32160:139;;31887:419;;;:::o;32312:176::-;32452:28;32448:1;32440:6;32436:14;32429:52;32312:176;:::o;32494:366::-;32636:3;32657:67;32721:2;32716:3;32657:67;:::i;:::-;32650:74;;32733:93;32822:3;32733:93;:::i;:::-;32851:2;32846:3;32842:12;32835:19;;32494:366;;;:::o;32866:419::-;33032:4;33070:2;33059:9;33055:18;33047:26;;33119:9;33113:4;33109:20;33105:1;33094:9;33090:17;33083:47;33147:131;33273:4;33147:131;:::i;:::-;33139:139;;32866:419;;;:::o;33291:117::-;33400:1;33397;33390:12;33414:117;33523:1;33520;33513:12;33537:469;33642:9;33653;33691:8;33679:10;33676:24;33673:111;;;33703:79;;:::i;:::-;33673:111;33809:6;33799:8;33796:20;33793:107;;;33819:79;;:::i;:::-;33793:107;33950:1;33938:10;33934:18;33926:6;33922:31;33909:44;;33989:10;33979:8;33975:25;33962:38;;33537:469;;;;;;;:::o;34012:96::-;34070:6;34098:3;34088:13;;34012:96;;;;:::o;34206:150::-;34243:7;34283:66;34276:5;34272:78;34261:89;;34206:150;;;:::o;34362:107::-;34406:8;34456:5;34450:4;34446:16;34425:37;;34362:107;;;;:::o;34475:552::-;34566:5;34597:45;34638:3;34631:5;34597:45;:::i;:::-;34667:5;34691:41;34722:8;34709:22;34691:41;:::i;:::-;34682:50;;34756:2;34748:6;34745:14;34742:278;;;34827:169;34912:66;34882:6;34878:2;34874:15;34871:1;34867:23;34827:169;:::i;:::-;34804:5;34783:227;34774:236;;34742:278;34572:455;;34475:552;;;;:::o;35033:224::-;35173:34;35169:1;35161:6;35157:14;35150:58;35242:7;35237:2;35229:6;35225:15;35218:32;35033:224;:::o;35263:366::-;35405:3;35426:67;35490:2;35485:3;35426:67;:::i;:::-;35419:74;;35502:93;35591:3;35502:93;:::i;:::-;35620:2;35615:3;35611:12;35604:19;;35263:366;;;:::o;35635:419::-;35801:4;35839:2;35828:9;35824:18;35816:26;;35888:9;35882:4;35878:20;35874:1;35863:9;35859:17;35852:47;35916:131;36042:4;35916:131;:::i;:::-;35908:139;;35635:419;;;:::o
Swarm Source
ipfs://61bff95f9ab77d2fb098f8a4d265beb16b4aabba90f8663d515e0c13d19ecc1d
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.