More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15732775 | 873 days ago | 0.018458 ETH | ||||
15732775 | 873 days ago | 0.00909125 ETH | ||||
15732775 | 873 days ago | 0.02754926 ETH | ||||
15582101 | 894 days ago | 0.00744602 ETH | ||||
15582101 | 894 days ago | 0.00366744 ETH | ||||
15582101 | 894 days ago | 0.01111347 ETH | ||||
15516610 | 904 days ago | 0.01807035 ETH | ||||
15516610 | 904 days ago | 0.00890032 ETH | ||||
15516610 | 904 days ago | 0.02697068 ETH | ||||
15516342 | 904 days ago | 0.01114553 ETH | ||||
15516342 | 904 days ago | 0.00548958 ETH | ||||
15516342 | 904 days ago | 0.01663512 ETH | ||||
15404225 | 922 days ago | 0.01952151 ETH | ||||
15404225 | 922 days ago | 0.00961507 ETH | ||||
15404225 | 922 days ago | 0.02913659 ETH | ||||
15397098 | 923 days ago | 0.00739026 ETH | ||||
15397098 | 923 days ago | 0.00363997 ETH | ||||
15397098 | 923 days ago | 0.01103023 ETH | ||||
15390401 | 924 days ago | 0.00856067 ETH | ||||
15390401 | 924 days ago | 0.00421645 ETH | ||||
15390401 | 924 days ago | 0.01277712 ETH | ||||
15390339 | 924 days ago | 0.00646948 ETH | ||||
15390339 | 924 days ago | 0.00318646 ETH | ||||
15390339 | 924 days ago | 0.00965594 ETH | ||||
15372959 | 927 days ago | 0.00959997 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SwapC
Compiler Version
v0.8.15+commit.e14f2714
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.15; pragma abicoder v2; // import "@openzeppelin/[email protected]/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; import "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol"; import "@uniswap/v3-periphery/contracts/interfaces/IPeripheryPayments.sol"; import "@opengsn/contracts/src/BaseRelayRecipient.sol"; interface IWETH9 { function withdraw(uint256 wad) external; } contract SwapC is BaseRelayRecipient, Ownable { using Strings for uint256; using ECDSA for bytes32; address public signer; address public paymaster; mapping(address => uint256) walletToAmountWithdrawn; string public override versionRecipient = "2.2.5"; ISwapRouter public immutable swapRouter = ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564); // mainnet address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address public constant WETH9 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address public constant FORWARDER = 0xAa3E82b4c4093b4bA13Cb5714382C99ADBf750cA; // goerli // address public constant USDC = 0xD87Ba7A50B2E7E660f678A895E4B72E7CB4CCd9C; // address public constant WETH9 = 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6; // address public constant FORWARDER = 0x7A95fA73250dc53556d264522150A940d4C50238; // rinkeby // address public constant USDC = 0xeb8f08a975Ab53E34D8a0330E0D34de942C95926; // address public constant WETH9 = 0xc778417E063141139Fce010982780140Aa0cD5Ab; // address public constant FORWARDER = 0x83A54884bE4657706785D7309cf46B58FE5f6e8a; uint24 public poolFee = 3000; uint256 public paymasterFee = 33000; constructor(address _signer, address _paymaster) { signer = _signer; paymaster = _paymaster; _setTrustedForwarder(FORWARDER); IERC20(USDC).approve(address(swapRouter), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); } function updateSigner(address _signer) external onlyOwner { signer = _signer; } function updatePaymaster(address _paymaster) external onlyOwner { paymaster = _paymaster; } function updateForwarder(address _forwarder) external onlyOwner { _setTrustedForwarder(_forwarder); } function updatePoolFee(uint24 _poolFee) external onlyOwner { poolFee = _poolFee; } function updatePaymasterFee(uint256 _paymasterFee) external onlyOwner { paymasterFee = _paymasterFee; } function collectEth(uint256 totalAmountUSDC, bytes calldata signature) public { address sender = _msgSender(); require(totalAmountUSDC > walletToAmountWithdrawn[sender], "Already collected"); string memory message = string(abi.encodePacked("swapc|", Strings.toHexString(uint256(uint160(sender)), 20), "|", totalAmountUSDC.toString())); bytes32 hashedMessage = keccak256(abi.encodePacked(message)); address recoveredAddress = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hashedMessage)).recover(signature); require(recoveredAddress == signer, "Unauthorized signature"); uint256 usdcToConvert = totalAmountUSDC - walletToAmountWithdrawn[sender]; walletToAmountWithdrawn[sender] = totalAmountUSDC; uint256 ethAmount = swapToEth(usdcToConvert); uint256 ethForPaymaster = ethAmount * paymasterFee / 100000; (bool ret, ) = paymaster.call{value: ethForPaymaster}(""); require(ret); payable(sender).transfer(ethAmount - ethForPaymaster); } function swapToEth( uint256 amountIn ) internal returns (uint256 amountOut) { ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ tokenIn: USDC, tokenOut: WETH9, fee: poolFee, recipient: address(this), deadline: block.timestamp, amountIn: amountIn, amountOutMinimum: 0, sqrtPriceLimitX96: 0 }); amountOut = swapRouter.exactInputSingle(params); IWETH9(WETH9).withdraw(amountOut); } /** * @dev Accept direct ether transfers */ receive() external payable {} function _msgData() internal override (Context, BaseRelayRecipient) virtual view returns (bytes calldata ret) { return BaseRelayRecipient._msgData(); } function _msgSender() internal override (Context, BaseRelayRecipient) virtual view returns (address ret) { return BaseRelayRecipient._msgSender(); } }
// 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.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.7.5; pragma abicoder v2; import '@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol'; /// @title Router token swapping functionality /// @notice Functions for swapping tokens via Uniswap V3 interface ISwapRouter is IUniswapV3SwapCallback { struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } /// @notice Swaps `amountIn` of one token for as much as possible of another token /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata /// @return amountOut The amount of the received token function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } /// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata /// @return amountOut The amount of the received token function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); struct ExactOutputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; uint160 sqrtPriceLimitX96; } /// @notice Swaps as little as possible of one token for `amountOut` of another token /// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata /// @return amountIn The amount of the input token function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn); struct ExactOutputParams { bytes path; address recipient; uint256 deadline; uint256 amountOut; uint256 amountInMaximum; } /// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed) /// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata /// @return amountIn The amount of the input token function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.6.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.7.5; /// @title Periphery Payments /// @notice Functions to ease deposits and withdrawals of ETH interface IPeripheryPayments { /// @notice Unwraps the contract's WETH9 balance and sends it to recipient as ETH. /// @dev The amountMinimum parameter prevents malicious contracts from stealing WETH9 from users. /// @param amountMinimum The minimum amount of WETH9 to unwrap /// @param recipient The address receiving ETH function unwrapWETH9(uint256 amountMinimum, address recipient) external payable; /// @notice Refunds any ETH balance held by this contract to the `msg.sender` /// @dev Useful for bundling with mint or increase liquidity that uses ether, or exact output swaps /// that use ether for the input amount function refundETH() external payable; /// @notice Transfers the full amount of a token held by this contract to recipient /// @dev The amountMinimum parameter prevents malicious contracts from stealing the token from users /// @param token The contract address of the token which will be transferred to `recipient` /// @param amountMinimum The minimum amount of token required for a transfer /// @param recipient The destination address of the token function sweepToken( address token, uint256 amountMinimum, address recipient ) external payable; }
// SPDX-License-Identifier: MIT // solhint-disable no-inline-assembly pragma solidity >=0.6.9; import "./interfaces/IRelayRecipient.sol"; /** * A base contract to be inherited by any contract that want to receive relayed transactions * A subclass must use "_msgSender()" instead of "msg.sender" */ abstract contract BaseRelayRecipient is IRelayRecipient { /* * Forwarder singleton we accept calls from */ address private _trustedForwarder; function trustedForwarder() public virtual view returns (address){ return _trustedForwarder; } function _setTrustedForwarder(address _forwarder) internal { _trustedForwarder = _forwarder; } function isTrustedForwarder(address forwarder) public virtual override view returns(bool) { return forwarder == _trustedForwarder; } /** * return the sender of this call. * if the call came through our trusted forwarder, return the original sender. * otherwise, return `msg.sender`. * should be used in the contract anywhere instead of msg.sender */ function _msgSender() internal override virtual view returns (address ret) { if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) { // At this point we know that the sender is a trusted forwarder, // so we trust that the last bytes of msg.data are the verified sender address. // extract sender address from the end of msg.data assembly { ret := shr(96,calldataload(sub(calldatasize(),20))) } } else { ret = msg.sender; } } /** * return the msg.data of this call. * if the call came through our trusted forwarder, then the real sender was appended as the last 20 bytes * of the msg.data - so this method will strip those 20 bytes off. * otherwise (if the call was made directly and not through the forwarder), return `msg.data` * should be used in the contract instead of msg.data, where this difference matters. */ function _msgData() internal override virtual view returns (bytes calldata ret) { if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) { return msg.data[0:msg.data.length-20]; } else { return msg.data; } } }
// 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-2.0-or-later pragma solidity >=0.5.0; /// @title Callback for IUniswapV3PoolActions#swap /// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface interface IUniswapV3SwapCallback { /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap. /// @dev In the implementation you must pay the pool tokens owed for the swap. /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory. /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped. /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call function uniswapV3SwapCallback( int256 amount0Delta, int256 amount1Delta, bytes calldata data ) external; }
// 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 pragma solidity >=0.6.0; /** * a contract must implement this interface in order to support relayed transaction. * It is better to inherit the BaseRelayRecipient as its implementation. */ abstract contract IRelayRecipient { /** * return if the forwarder is trusted to forward relayed transactions to us. * the forwarder is required to verify the sender's signature, and verify * the call is not a replay. */ function isTrustedForwarder(address forwarder) public virtual view returns(bool); /** * return the sender of this call. * if the call came through our trusted forwarder, then the real sender is appended as the last 20 bytes * of the msg.data. * otherwise, return `msg.sender` * should be used in the contract anywhere instead of msg.sender */ function _msgSender() internal virtual view returns (address); /** * return the msg.data of this call. * if the call came through our trusted forwarder, then the real sender was appended as the last 20 bytes * of the msg.data - so this method will strip those 20 bytes off. * otherwise (if the call was made directly and not through the forwarder), return `msg.data` * should be used in the contract instead of msg.data, where this difference matters. */ function _msgData() internal virtual view returns (bytes calldata); function versionRecipient() external virtual view returns (string memory); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"address","name":"_paymaster","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"FORWARDER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH9","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalAmountUSDC","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"collectEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymaster","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymasterFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_forwarder","type":"address"}],"name":"updateForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymaster","type":"address"}],"name":"updatePaymaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_paymasterFee","type":"uint256"}],"name":"updatePaymasterFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_poolFee","type":"uint24"}],"name":"updatePoolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"updateSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"versionRecipient","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526040518060400160405280600581526020017f322e322e35000000000000000000000000000000000000000000000000000000815250600590816200004a9190620006af565b5073e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff16815250610bb8600660006101000a81548162ffffff021916908362ffffff1602179055506180e8600755348015620000c657600080fd5b5060405162002fa938038062002fa98339818101604052810190620000ec919062000800565b6200010c620001006200027560201b60201c565b6200029160201b60201c565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001b373aa3e82b4c4093b4ba13cb5714382c99adbf750ca6200035760201b60201c565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff1663095ea7b36080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620002269291906200089b565b6020604051808303816000875af115801562000246573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026c919062000905565b50505062000937565b60006200028c6200039a60201b62000bd51760201c565b905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006014600036905010158015620003bf5750620003be33620003dc60201b60201c565b5b15620003d557601436033560601c9050620003d9565b3390505b90565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004b757607f821691505b602082108103620004cd57620004cc6200046f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004f8565b620005438683620004f8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005906200058a62000584846200055b565b62000565565b6200055b565b9050919050565b6000819050919050565b620005ac836200056f565b620005c4620005bb8262000597565b84845462000505565b825550505050565b600090565b620005db620005cc565b620005e8818484620005a1565b505050565b5b81811015620006105762000604600082620005d1565b600181019050620005ee565b5050565b601f8211156200065f576200062981620004d3565b6200063484620004e8565b8101602085101562000644578190505b6200065c6200065385620004e8565b830182620005ed565b50505b505050565b600082821c905092915050565b6000620006846000198460080262000664565b1980831691505092915050565b60006200069f838362000671565b9150826002028217905092915050565b620006ba8262000435565b67ffffffffffffffff811115620006d657620006d562000440565b5b620006e282546200049e565b620006ef82828562000614565b600060209050601f83116001811462000727576000841562000712578287015190505b6200071e858262000691565b8655506200078e565b601f1984166200073786620004d3565b60005b8281101562000761578489015182556001820191506020850194506020810190506200073a565b868310156200078157848901516200077d601f89168262000671565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007c8826200079b565b9050919050565b620007da81620007bb565b8114620007e657600080fd5b50565b600081519050620007fa81620007cf565b92915050565b600080604083850312156200081a576200081962000796565b5b60006200082a85828601620007e9565b92505060206200083d85828601620007e9565b9150509250929050565b6200085281620007bb565b82525050565b6000819050919050565b6000620008836200087d620008778462000858565b62000565565b6200055b565b9050919050565b620008958162000862565b82525050565b6000604082019050620008b2600083018562000847565b620008c160208301846200088a565b9392505050565b60008115159050919050565b620008df81620008c8565b8114620008eb57600080fd5b50565b600081519050620008ff81620008d4565b92915050565b6000602082840312156200091e576200091d62000796565b5b60006200092e84828501620008ee565b91505092915050565b60805161264f6200095a60003960008181610aa201526110b7015261264f6000f3fe6080604052600436106101235760003560e01c806389a30271116100a0578063c31c9c0711610064578063c31c9c07146103aa578063ca2ad973146103d5578063daf6a3f614610400578063f2fde38b14610429578063fcddef95146104525761012a565b806389a30271146102d75780638da5cb5b146103025780639fc82fa91461032d578063a7ecd37e14610358578063b44db1c0146103815761012a565b8063486ff0cd116100e7578063486ff0cd146102025780634aa4a4fc1461022d578063572b6c0514610258578063715018a6146102955780637da0a877146102ac5761012a565b8063089fe6aa1461012f578063143de6d81461015a57806316e4cbf9146101835780632291237e146101ae578063238ac933146101d75761012a565b3661012a57005b600080fd5b34801561013b57600080fd5b5061014461047b565b6040516101519190611735565b60405180910390f35b34801561016657600080fd5b50610181600480360381019061017c91906117f5565b610490565b005b34801561018f57600080fd5b5061019861085e565b6040516101a59190611896565b60405180910390f35b3480156101ba57600080fd5b506101d560048036038101906101d091906118dd565b610884565b005b3480156101e357600080fd5b506101ec610898565b6040516101f99190611896565b60405180910390f35b34801561020e57600080fd5b506102176108be565b60405161022491906119a3565b60405180910390f35b34801561023957600080fd5b5061024261094c565b60405161024f9190611896565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a91906118dd565b610964565b60405161028c91906119e0565b60405180910390f35b3480156102a157600080fd5b506102aa6109bd565b005b3480156102b857600080fd5b506102c16109d1565b6040516102ce9190611896565b60405180910390f35b3480156102e357600080fd5b506102ec6109fa565b6040516102f99190611896565b60405180910390f35b34801561030e57600080fd5b50610317610a12565b6040516103249190611896565b60405180910390f35b34801561033957600080fd5b50610342610a3c565b60405161034f9190611a0a565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906118dd565b610a42565b005b34801561038d57600080fd5b506103a860048036038101906103a39190611a25565b610a8e565b005b3480156103b657600080fd5b506103bf610aa0565b6040516103cc9190611ab1565b60405180910390f35b3480156103e157600080fd5b506103ea610ac4565b6040516103f79190611896565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906118dd565b610adc565b005b34801561043557600080fd5b50610450600480360381019061044b91906118dd565b610b28565b005b34801561045e57600080fd5b5061047960048036038101906104749190611af8565b610bab565b005b600660009054906101000a900462ffffff1681565b600061049a610c0c565b9050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841161051d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051490611b71565b60405180910390fd5b60006105408273ffffffffffffffffffffffffffffffffffffffff166014610c1b565b61054986610e57565b60405160200161055a929190611c65565b604051602081830303815290604052905060008160405160200161057e9190611c9f565b604051602081830303815290604052805190602001209050600061061586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050836040516020016105f19190611d2d565b60405160208183030381529060405280519060200120610fb790919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069e90611d9f565b60405180910390fd5b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054886106f49190611dee565b905087600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061074582610fde565b90506000620186a06007548361075b9190611e22565b6107659190611eab565b90506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516107af90611f0d565b60006040518083038185875af1925050503d80600081146107ec576040519150601f19603f3d011682016040523d82523d6000602084013e6107f1565b606091505b50509050806107ff57600080fd5b8773ffffffffffffffffffffffffffffffffffffffff166108fc83856108259190611dee565b9081150290604051600060405180830381858888f19350505050158015610850573d6000803e3d6000fd5b505050505050505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61088c6111d8565b61089581611256565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600580546108cb90611f51565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790611f51565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b505050505081565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6109c56111d8565b6109cf6000611299565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075481565b610a4a6111d8565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610a966111d8565b8060078190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b73aa3e82b4c4093b4ba13cb5714382c99adbf750ca81565b610ae46111d8565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b306111d8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690611ff4565b60405180910390fd5b610ba881611299565b50565b610bb36111d8565b80600660006101000a81548162ffffff021916908362ffffff16021790555050565b60006014600036905010158015610bf15750610bf033610964565b5b15610c0557601436033560601c9050610c09565b3390505b90565b6000610c16610bd5565b905090565b606060006002836002610c2e9190611e22565b610c389190612014565b67ffffffffffffffff811115610c5157610c5061206a565b5b6040519080825280601f01601f191660200182016040528015610c835781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110610cbb57610cba612099565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610d1f57610d1e612099565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002610d5f9190611e22565b610d699190612014565b90505b6001811115610e09577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110610dab57610daa612099565b5b1a60f81b828281518110610dc257610dc1612099565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080610e02906120c8565b9050610d6c565b5060008414610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e449061213d565b60405180910390fd5b8091505092915050565b606060008203610e9e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050610fb2565b600082905060005b60008214610ed0578080610eb99061215d565b915050600a82610ec99190611eab565b9150610ea6565b60008167ffffffffffffffff811115610eec57610eeb61206a565b5b6040519080825280601f01601f191660200182016040528015610f1e5781602001600182028036833780820191505090505b5090505b60008514610fab57600182610f379190611dee565b9150600a85610f4691906121a5565b6030610f529190612014565b60f81b818381518110610f6857610f67612099565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85610fa49190611eab565b9450610f22565b8093505050505b919050565b6000806000610fc6858561135f565b91509150610fd3816113e0565b819250505092915050565b60008060405180610100016040528073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff16815260200173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168152602001600660009054906101000a900462ffffff1662ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200142815260200184815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b815260040161110e91906122b4565b6020604051808303816000875af115801561112d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115191906122e5565b915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016111a09190611a0a565b600060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b5050505050919050565b6111e0610c0c565b73ffffffffffffffffffffffffffffffffffffffff166111fe610a12565b73ffffffffffffffffffffffffffffffffffffffff1614611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b9061235e565b60405180910390fd5b565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060418351036113a05760008060006020860151925060408601519150606086015160001a9050611394878285856115ac565b945094505050506113d9565b60408351036113d05760008060208501519150604085015190506113c58683836116b8565b9350935050506113d9565b60006002915091505b9250929050565b600060048111156113f4576113f361237e565b5b8160048111156114075761140661237e565b5b03156115a957600160048111156114215761142061237e565b5b8160048111156114345761143361237e565b5b03611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b906123f9565b60405180910390fd5b600260048111156114885761148761237e565b5b81600481111561149b5761149a61237e565b5b036114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290612465565b60405180910390fd5b600360048111156114ef576114ee61237e565b5b8160048111156115025761150161237e565b5b03611542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611539906124f7565b60405180910390fd5b6004808111156115555761155461237e565b5b8160048111156115685761156761237e565b5b036115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90612589565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156115e75760006003915091506116af565b601b8560ff16141580156115ff5750601c8560ff1614155b156116115760006004915091506116af565b60006001878787876040516000815260200160405260405161163694939291906125d4565b6020604051602081039080840390855afa158015611658573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116a6576000600192509250506116af565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6116fb9190612014565b9050611709878288856115ac565b935093505050935093915050565b600062ffffff82169050919050565b61172f81611717565b82525050565b600060208201905061174a6000830184611726565b92915050565b600080fd5b600080fd5b6000819050919050565b61176d8161175a565b811461177857600080fd5b50565b60008135905061178a81611764565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126117b5576117b4611790565b5b8235905067ffffffffffffffff8111156117d2576117d1611795565b5b6020830191508360018202830111156117ee576117ed61179a565b5b9250929050565b60008060006040848603121561180e5761180d611750565b5b600061181c8682870161177b565b935050602084013567ffffffffffffffff81111561183d5761183c611755565b5b6118498682870161179f565b92509250509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061188082611855565b9050919050565b61189081611875565b82525050565b60006020820190506118ab6000830184611887565b92915050565b6118ba81611875565b81146118c557600080fd5b50565b6000813590506118d7816118b1565b92915050565b6000602082840312156118f3576118f2611750565b5b6000611901848285016118c8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611944578082015181840152602081019050611929565b83811115611953576000848401525b50505050565b6000601f19601f8301169050919050565b60006119758261190a565b61197f8185611915565b935061198f818560208601611926565b61199881611959565b840191505092915050565b600060208201905081810360008301526119bd818461196a565b905092915050565b60008115159050919050565b6119da816119c5565b82525050565b60006020820190506119f560008301846119d1565b92915050565b611a048161175a565b82525050565b6000602082019050611a1f60008301846119fb565b92915050565b600060208284031215611a3b57611a3a611750565b5b6000611a498482850161177b565b91505092915050565b6000819050919050565b6000611a77611a72611a6d84611855565b611a52565b611855565b9050919050565b6000611a8982611a5c565b9050919050565b6000611a9b82611a7e565b9050919050565b611aab81611a90565b82525050565b6000602082019050611ac66000830184611aa2565b92915050565b611ad581611717565b8114611ae057600080fd5b50565b600081359050611af281611acc565b92915050565b600060208284031215611b0e57611b0d611750565b5b6000611b1c84828501611ae3565b91505092915050565b7f416c726561647920636f6c6c6563746564000000000000000000000000000000600082015250565b6000611b5b601183611915565b9150611b6682611b25565b602082019050919050565b60006020820190508181036000830152611b8a81611b4e565b9050919050565b600081905092915050565b7f73776170637c0000000000000000000000000000000000000000000000000000600082015250565b6000611bd2600683611b91565b9150611bdd82611b9c565b600682019050919050565b6000611bf38261190a565b611bfd8185611b91565b9350611c0d818560208601611926565b80840191505092915050565b7f7c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000611c4f600183611b91565b9150611c5a82611c19565b600182019050919050565b6000611c7082611bc5565b9150611c7c8285611be8565b9150611c8782611c42565b9150611c938284611be8565b91508190509392505050565b6000611cab8284611be8565b915081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000611cec601c83611b91565b9150611cf782611cb6565b601c82019050919050565b6000819050919050565b6000819050919050565b611d27611d2282611d02565b611d0c565b82525050565b6000611d3882611cdf565b9150611d448284611d16565b60208201915081905092915050565b7f556e617574686f72697a6564207369676e617475726500000000000000000000600082015250565b6000611d89601683611915565b9150611d9482611d53565b602082019050919050565b60006020820190508181036000830152611db881611d7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611df98261175a565b9150611e048361175a565b925082821015611e1757611e16611dbf565b5b828203905092915050565b6000611e2d8261175a565b9150611e388361175a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611e7157611e70611dbf565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611eb68261175a565b9150611ec18361175a565b925082611ed157611ed0611e7c565b5b828204905092915050565b600081905092915050565b50565b6000611ef7600083611edc565b9150611f0282611ee7565b600082019050919050565b6000611f1882611eea565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f6957607f821691505b602082108103611f7c57611f7b611f22565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611fde602683611915565b9150611fe982611f82565b604082019050919050565b6000602082019050818103600083015261200d81611fd1565b9050919050565b600061201f8261175a565b915061202a8361175a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561205f5761205e611dbf565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006120d38261175a565b9150600082036120e6576120e5611dbf565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612127602083611915565b9150612132826120f1565b602082019050919050565b600060208201905081810360008301526121568161211a565b9050919050565b60006121688261175a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361219a57612199611dbf565b5b600182019050919050565b60006121b08261175a565b91506121bb8361175a565b9250826121cb576121ca611e7c565b5b828206905092915050565b6121df81611875565b82525050565b6121ee81611717565b82525050565b6121fd8161175a565b82525050565b61220c81611855565b82525050565b6101008201600082015161222960008501826121d6565b50602082015161223c60208501826121d6565b50604082015161224f60408501826121e5565b50606082015161226260608501826121d6565b50608082015161227560808501826121f4565b5060a082015161228860a08501826121f4565b5060c082015161229b60c08501826121f4565b5060e08201516122ae60e0850182612203565b50505050565b6000610100820190506122ca6000830184612212565b92915050565b6000815190506122df81611764565b92915050565b6000602082840312156122fb576122fa611750565b5b6000612309848285016122d0565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612348602083611915565b915061235382612312565b602082019050919050565b600060208201905081810360008301526123778161233b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006123e3601883611915565b91506123ee826123ad565b602082019050919050565b60006020820190508181036000830152612412816123d6565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061244f601f83611915565b915061245a82612419565b602082019050919050565b6000602082019050818103600083015261247e81612442565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006124e1602283611915565b91506124ec82612485565b604082019050919050565b60006020820190508181036000830152612510816124d4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612573602283611915565b915061257e82612517565b604082019050919050565b600060208201905081810360008301526125a281612566565b9050919050565b6125b281611d02565b82525050565b600060ff82169050919050565b6125ce816125b8565b82525050565b60006080820190506125e960008301876125a9565b6125f660208301866125c5565b61260360408301856125a9565b61261060608301846125a9565b9594505050505056fea2646970667358221220808eac243d6eaa57fe8e4aca1458110451cd8f5bbe2cc3f8a772a0b327981bfd64736f6c634300080f0033000000000000000000000000abeca293f1887e98b19a0a3867b8b8f4e63f4c77000000000000000000000000ba1800db8dc66851956104182adb63efcb2d85db
Deployed Bytecode
0x6080604052600436106101235760003560e01c806389a30271116100a0578063c31c9c0711610064578063c31c9c07146103aa578063ca2ad973146103d5578063daf6a3f614610400578063f2fde38b14610429578063fcddef95146104525761012a565b806389a30271146102d75780638da5cb5b146103025780639fc82fa91461032d578063a7ecd37e14610358578063b44db1c0146103815761012a565b8063486ff0cd116100e7578063486ff0cd146102025780634aa4a4fc1461022d578063572b6c0514610258578063715018a6146102955780637da0a877146102ac5761012a565b8063089fe6aa1461012f578063143de6d81461015a57806316e4cbf9146101835780632291237e146101ae578063238ac933146101d75761012a565b3661012a57005b600080fd5b34801561013b57600080fd5b5061014461047b565b6040516101519190611735565b60405180910390f35b34801561016657600080fd5b50610181600480360381019061017c91906117f5565b610490565b005b34801561018f57600080fd5b5061019861085e565b6040516101a59190611896565b60405180910390f35b3480156101ba57600080fd5b506101d560048036038101906101d091906118dd565b610884565b005b3480156101e357600080fd5b506101ec610898565b6040516101f99190611896565b60405180910390f35b34801561020e57600080fd5b506102176108be565b60405161022491906119a3565b60405180910390f35b34801561023957600080fd5b5061024261094c565b60405161024f9190611896565b60405180910390f35b34801561026457600080fd5b5061027f600480360381019061027a91906118dd565b610964565b60405161028c91906119e0565b60405180910390f35b3480156102a157600080fd5b506102aa6109bd565b005b3480156102b857600080fd5b506102c16109d1565b6040516102ce9190611896565b60405180910390f35b3480156102e357600080fd5b506102ec6109fa565b6040516102f99190611896565b60405180910390f35b34801561030e57600080fd5b50610317610a12565b6040516103249190611896565b60405180910390f35b34801561033957600080fd5b50610342610a3c565b60405161034f9190611a0a565b60405180910390f35b34801561036457600080fd5b5061037f600480360381019061037a91906118dd565b610a42565b005b34801561038d57600080fd5b506103a860048036038101906103a39190611a25565b610a8e565b005b3480156103b657600080fd5b506103bf610aa0565b6040516103cc9190611ab1565b60405180910390f35b3480156103e157600080fd5b506103ea610ac4565b6040516103f79190611896565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906118dd565b610adc565b005b34801561043557600080fd5b50610450600480360381019061044b91906118dd565b610b28565b005b34801561045e57600080fd5b5061047960048036038101906104749190611af8565b610bab565b005b600660009054906101000a900462ffffff1681565b600061049a610c0c565b9050600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841161051d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051490611b71565b60405180910390fd5b60006105408273ffffffffffffffffffffffffffffffffffffffff166014610c1b565b61054986610e57565b60405160200161055a929190611c65565b604051602081830303815290604052905060008160405160200161057e9190611c9f565b604051602081830303815290604052805190602001209050600061061586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050836040516020016105f19190611d2d565b60405160208183030381529060405280519060200120610fb790919063ffffffff16565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069e90611d9f565b60405180910390fd5b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054886106f49190611dee565b905087600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061074582610fde565b90506000620186a06007548361075b9190611e22565b6107659190611eab565b90506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516107af90611f0d565b60006040518083038185875af1925050503d80600081146107ec576040519150601f19603f3d011682016040523d82523d6000602084013e6107f1565b606091505b50509050806107ff57600080fd5b8773ffffffffffffffffffffffffffffffffffffffff166108fc83856108259190611dee565b9081150290604051600060405180830381858888f19350505050158015610850573d6000803e3d6000fd5b505050505050505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61088c6111d8565b61089581611256565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600580546108cb90611f51565b80601f01602080910402602001604051908101604052809291908181526020018280546108f790611f51565b80156109445780601f1061091957610100808354040283529160200191610944565b820191906000526020600020905b81548152906001019060200180831161092757829003601f168201915b505050505081565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6109c56111d8565b6109cf6000611299565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075481565b610a4a6111d8565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610a966111d8565b8060078190555050565b7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156481565b73aa3e82b4c4093b4ba13cb5714382c99adbf750ca81565b610ae46111d8565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b306111d8565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690611ff4565b60405180910390fd5b610ba881611299565b50565b610bb36111d8565b80600660006101000a81548162ffffff021916908362ffffff16021790555050565b60006014600036905010158015610bf15750610bf033610964565b5b15610c0557601436033560601c9050610c09565b3390505b90565b6000610c16610bd5565b905090565b606060006002836002610c2e9190611e22565b610c389190612014565b67ffffffffffffffff811115610c5157610c5061206a565b5b6040519080825280601f01601f191660200182016040528015610c835781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110610cbb57610cba612099565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110610d1f57610d1e612099565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002610d5f9190611e22565b610d699190612014565b90505b6001811115610e09577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110610dab57610daa612099565b5b1a60f81b828281518110610dc257610dc1612099565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080610e02906120c8565b9050610d6c565b5060008414610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e449061213d565b60405180910390fd5b8091505092915050565b606060008203610e9e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050610fb2565b600082905060005b60008214610ed0578080610eb99061215d565b915050600a82610ec99190611eab565b9150610ea6565b60008167ffffffffffffffff811115610eec57610eeb61206a565b5b6040519080825280601f01601f191660200182016040528015610f1e5781602001600182028036833780820191505090505b5090505b60008514610fab57600182610f379190611dee565b9150600a85610f4691906121a5565b6030610f529190612014565b60f81b818381518110610f6857610f67612099565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85610fa49190611eab565b9450610f22565b8093505050505b919050565b6000806000610fc6858561135f565b91509150610fd3816113e0565b819250505092915050565b60008060405180610100016040528073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff16815260200173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168152602001600660009054906101000a900462ffffff1662ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff16815260200142815260200184815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090507f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf389826040518263ffffffff1660e01b815260040161110e91906122b4565b6020604051808303816000875af115801561112d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115191906122e5565b915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016111a09190611a0a565b600060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b5050505050919050565b6111e0610c0c565b73ffffffffffffffffffffffffffffffffffffffff166111fe610a12565b73ffffffffffffffffffffffffffffffffffffffff1614611254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124b9061235e565b60405180910390fd5b565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060418351036113a05760008060006020860151925060408601519150606086015160001a9050611394878285856115ac565b945094505050506113d9565b60408351036113d05760008060208501519150604085015190506113c58683836116b8565b9350935050506113d9565b60006002915091505b9250929050565b600060048111156113f4576113f361237e565b5b8160048111156114075761140661237e565b5b03156115a957600160048111156114215761142061237e565b5b8160048111156114345761143361237e565b5b03611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b906123f9565b60405180910390fd5b600260048111156114885761148761237e565b5b81600481111561149b5761149a61237e565b5b036114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290612465565b60405180910390fd5b600360048111156114ef576114ee61237e565b5b8160048111156115025761150161237e565b5b03611542576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611539906124f7565b60405180910390fd5b6004808111156115555761155461237e565b5b8160048111156115685761156761237e565b5b036115a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159f90612589565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156115e75760006003915091506116af565b601b8560ff16141580156115ff5750601c8560ff1614155b156116115760006004915091506116af565b60006001878787876040516000815260200160405260405161163694939291906125d4565b6020604051602081039080840390855afa158015611658573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116a6576000600192509250506116af565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6116fb9190612014565b9050611709878288856115ac565b935093505050935093915050565b600062ffffff82169050919050565b61172f81611717565b82525050565b600060208201905061174a6000830184611726565b92915050565b600080fd5b600080fd5b6000819050919050565b61176d8161175a565b811461177857600080fd5b50565b60008135905061178a81611764565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126117b5576117b4611790565b5b8235905067ffffffffffffffff8111156117d2576117d1611795565b5b6020830191508360018202830111156117ee576117ed61179a565b5b9250929050565b60008060006040848603121561180e5761180d611750565b5b600061181c8682870161177b565b935050602084013567ffffffffffffffff81111561183d5761183c611755565b5b6118498682870161179f565b92509250509250925092565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061188082611855565b9050919050565b61189081611875565b82525050565b60006020820190506118ab6000830184611887565b92915050565b6118ba81611875565b81146118c557600080fd5b50565b6000813590506118d7816118b1565b92915050565b6000602082840312156118f3576118f2611750565b5b6000611901848285016118c8565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611944578082015181840152602081019050611929565b83811115611953576000848401525b50505050565b6000601f19601f8301169050919050565b60006119758261190a565b61197f8185611915565b935061198f818560208601611926565b61199881611959565b840191505092915050565b600060208201905081810360008301526119bd818461196a565b905092915050565b60008115159050919050565b6119da816119c5565b82525050565b60006020820190506119f560008301846119d1565b92915050565b611a048161175a565b82525050565b6000602082019050611a1f60008301846119fb565b92915050565b600060208284031215611a3b57611a3a611750565b5b6000611a498482850161177b565b91505092915050565b6000819050919050565b6000611a77611a72611a6d84611855565b611a52565b611855565b9050919050565b6000611a8982611a5c565b9050919050565b6000611a9b82611a7e565b9050919050565b611aab81611a90565b82525050565b6000602082019050611ac66000830184611aa2565b92915050565b611ad581611717565b8114611ae057600080fd5b50565b600081359050611af281611acc565b92915050565b600060208284031215611b0e57611b0d611750565b5b6000611b1c84828501611ae3565b91505092915050565b7f416c726561647920636f6c6c6563746564000000000000000000000000000000600082015250565b6000611b5b601183611915565b9150611b6682611b25565b602082019050919050565b60006020820190508181036000830152611b8a81611b4e565b9050919050565b600081905092915050565b7f73776170637c0000000000000000000000000000000000000000000000000000600082015250565b6000611bd2600683611b91565b9150611bdd82611b9c565b600682019050919050565b6000611bf38261190a565b611bfd8185611b91565b9350611c0d818560208601611926565b80840191505092915050565b7f7c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000611c4f600183611b91565b9150611c5a82611c19565b600182019050919050565b6000611c7082611bc5565b9150611c7c8285611be8565b9150611c8782611c42565b9150611c938284611be8565b91508190509392505050565b6000611cab8284611be8565b915081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000611cec601c83611b91565b9150611cf782611cb6565b601c82019050919050565b6000819050919050565b6000819050919050565b611d27611d2282611d02565b611d0c565b82525050565b6000611d3882611cdf565b9150611d448284611d16565b60208201915081905092915050565b7f556e617574686f72697a6564207369676e617475726500000000000000000000600082015250565b6000611d89601683611915565b9150611d9482611d53565b602082019050919050565b60006020820190508181036000830152611db881611d7c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611df98261175a565b9150611e048361175a565b925082821015611e1757611e16611dbf565b5b828203905092915050565b6000611e2d8261175a565b9150611e388361175a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611e7157611e70611dbf565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611eb68261175a565b9150611ec18361175a565b925082611ed157611ed0611e7c565b5b828204905092915050565b600081905092915050565b50565b6000611ef7600083611edc565b9150611f0282611ee7565b600082019050919050565b6000611f1882611eea565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f6957607f821691505b602082108103611f7c57611f7b611f22565b5b50919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611fde602683611915565b9150611fe982611f82565b604082019050919050565b6000602082019050818103600083015261200d81611fd1565b9050919050565b600061201f8261175a565b915061202a8361175a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561205f5761205e611dbf565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006120d38261175a565b9150600082036120e6576120e5611dbf565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612127602083611915565b9150612132826120f1565b602082019050919050565b600060208201905081810360008301526121568161211a565b9050919050565b60006121688261175a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361219a57612199611dbf565b5b600182019050919050565b60006121b08261175a565b91506121bb8361175a565b9250826121cb576121ca611e7c565b5b828206905092915050565b6121df81611875565b82525050565b6121ee81611717565b82525050565b6121fd8161175a565b82525050565b61220c81611855565b82525050565b6101008201600082015161222960008501826121d6565b50602082015161223c60208501826121d6565b50604082015161224f60408501826121e5565b50606082015161226260608501826121d6565b50608082015161227560808501826121f4565b5060a082015161228860a08501826121f4565b5060c082015161229b60c08501826121f4565b5060e08201516122ae60e0850182612203565b50505050565b6000610100820190506122ca6000830184612212565b92915050565b6000815190506122df81611764565b92915050565b6000602082840312156122fb576122fa611750565b5b6000612309848285016122d0565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612348602083611915565b915061235382612312565b602082019050919050565b600060208201905081810360008301526123778161233b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006123e3601883611915565b91506123ee826123ad565b602082019050919050565b60006020820190508181036000830152612412816123d6565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061244f601f83611915565b915061245a82612419565b602082019050919050565b6000602082019050818103600083015261247e81612442565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006124e1602283611915565b91506124ec82612485565b604082019050919050565b60006020820190508181036000830152612510816124d4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612573602283611915565b915061257e82612517565b604082019050919050565b600060208201905081810360008301526125a281612566565b9050919050565b6125b281611d02565b82525050565b600060ff82169050919050565b6125ce816125b8565b82525050565b60006080820190506125e960008301876125a9565b6125f660208301866125c5565b61260360408301856125a9565b61261060608301846125a9565b9594505050505056fea2646970667358221220808eac243d6eaa57fe8e4aca1458110451cd8f5bbe2cc3f8a772a0b327981bfd64736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000abeca293f1887e98b19a0a3867b8b8f4e63f4c77000000000000000000000000ba1800db8dc66851956104182adb63efcb2d85db
-----Decoded View---------------
Arg [0] : _signer (address): 0xAbECa293f1887e98B19a0A3867b8B8F4e63F4C77
Arg [1] : _paymaster (address): 0xbA1800DB8dc66851956104182ADB63EFCb2D85DB
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000abeca293f1887e98b19a0a3867b8b8f4e63f4c77
Arg [1] : 000000000000000000000000ba1800db8dc66851956104182adb63efcb2d85db
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.99989 | 101.07 | $101.06 |
Loading...
Loading
[ 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.