ETH Price: $2,048.59 (-1.29%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Swap ETH To Toke...229296802025-07-16 5:32:59225 days ago1752643979IN
0xa87D4B33...700A2CdfF
0.0001 ETH0.000103830.7221487
Swap Token For E...229296022025-07-16 5:17:23225 days ago1752643043IN
0xa87D4B33...700A2CdfF
0 ETH0.000198251.0041092
Swap Token For E...229295632025-07-16 5:09:35225 days ago1752642575IN
0xa87D4B33...700A2CdfF
0 ETH0.000124790.87307248
Swap Token For E...229295612025-07-16 5:09:11225 days ago1752642551IN
0xa87D4B33...700A2CdfF
0 ETH0.000130960.91621944
Swap Token For E...229295422025-07-16 5:05:11225 days ago1752642311IN
0xa87D4B33...700A2CdfF
0 ETH0.000133820.93627016
Swap Tokens For ...229196702025-07-14 20:02:11227 days ago1752523331IN
0xa87D4B33...700A2CdfF
0 ETH0.001422567.98356898
Swap ETH To Toke...229196232025-07-14 19:52:35227 days ago1752522755IN
0xa87D4B33...700A2CdfF
0.01 ETH0.001296798.54593602
Swap Token For E...229195182025-07-14 19:31:23227 days ago1752521483IN
0xa87D4B33...700A2CdfF
0 ETH0.001998679.8542541
Swap ETH To Toke...229193922025-07-14 19:06:11227 days ago1752519971IN
0xa87D4B33...700A2CdfF
0.01 ETH0.0021543213.18903752

Latest 15 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer229296802025-07-16 5:32:59225 days ago1752643979
0xa87D4B33...700A2CdfF
0.0000005 ETH
Execute229296802025-07-16 5:32:59225 days ago1752643979
0xa87D4B33...700A2CdfF
0.0000995 ETH
Transfer229296022025-07-16 5:17:23225 days ago1752643043
0xa87D4B33...700A2CdfF
0.0000004 ETH
Transfer229296022025-07-16 5:17:23225 days ago1752643043
0xa87D4B33...700A2CdfF
0.00008049 ETH
Transfer229296022025-07-16 5:17:23225 days ago1752643043
0xa87D4B33...700A2CdfF
0.00008089 ETH
Transfer229196702025-07-14 20:02:11227 days ago1752523331
0xa87D4B33...700A2CdfF
0.00004876 ETH
Transfer229196702025-07-14 20:02:11227 days ago1752523331
0xa87D4B33...700A2CdfF
0.00970385 ETH
Transfer229196702025-07-14 20:02:11227 days ago1752523331
0xa87D4B33...700A2CdfF
0.00975261 ETH
Transfer229196232025-07-14 19:52:35227 days ago1752522755
0xa87D4B33...700A2CdfF
0.00005 ETH
Execute229196232025-07-14 19:52:35227 days ago1752522755
0xa87D4B33...700A2CdfF
0.00995 ETH
Transfer229195182025-07-14 19:31:23227 days ago1752521483
0xa87D4B33...700A2CdfF
0.00004876 ETH
Transfer229195182025-07-14 19:31:23227 days ago1752521483
0xa87D4B33...700A2CdfF
0.00970384 ETH
Transfer229195182025-07-14 19:31:23227 days ago1752521483
0xa87D4B33...700A2CdfF
0.0097526 ETH
Transfer229193922025-07-14 19:06:11227 days ago1752519971
0xa87D4B33...700A2CdfF
0.00005 ETH
Execute229193922025-07-14 19:06:11227 days ago1752519971
0xa87D4B33...700A2CdfF
0.00995 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Klik

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2025-07-14
*/

/*

 __  _  _      ____  __  _  
|  |/ ]| |    |    ||  |/ ] 
|  ' / | |     |  | |  ' / 
|    \ | |___  |  | |    \  
|     \|     | |  | |     \ 
|  .  ||     | |  | |  .  |
|__|\_||_____||____||__|\_|


https://klik.trade
https://x.com/klik_evm

*/



// SPDX-License-Identifier: MIT




pragma solidity ^0.8.20;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}


/**
* @dev Library to perform safe calls to standard method for ERC20 tokens.
*
* Why Transfers: transfer methods could have a return value (bool), throw or revert for insufficient funds or
* unathorized value.
*
* Why Approve: approve method could has a return value (bool) or does not accept 0 as a valid value (BNB token).
* The common strategy used to clean approvals.
*
* We use the Solidity call instead of interface methods because in the case of transfer, it will fail
* for tokens with an implementation without returning a value.
* Since versions of Solidity 0.4.22 the EVM has a new opcode, called RETURNDATASIZE.
* This opcode stores the size of the returned data of an external call. The code checks the size of the return value
* after an external call and reverts the transaction in case the return data is shorter than expected
*/
library SafeERC20 {
    /**
    * @dev Transfer token for a specified address
    * @param _token erc20 The address of the ERC20 contract
    * @param _to address The address which you want to transfer to
    * @param _value uint256 the _value of tokens to be transferred
    * @return bool whether the transfer was successful or not
    */
    function safeTransfer(IERC20 _token, address _to, uint256 _value) internal returns (bool) {
        uint256 prevBalance = _token.balanceOf(address(this));

        if (prevBalance < _value) {
            // Insufficient funds
            return false;
        }

        address(_token).call(
            abi.encodeWithSignature("transfer(address,uint256)", _to, _value)
        );

        // Fail if the new balance its not equal than previous balance sub _value
        return prevBalance - _value == _token.balanceOf(address(this));
    }

    /**
    * @dev Transfer tokens from one address to another
    * @param _token erc20 The address of the ERC20 contract
    * @param _from address The address which you want to send tokens from
    * @param _to address The address which you want to transfer to
    * @param _value uint256 the _value of tokens to be transferred
    * @return bool whether the transfer was successful or not
    */
    function safeTransferFrom(
        IERC20 _token,
        address _from,
        address _to,
        uint256 _value
    ) internal returns (bool)
    {
        uint256 prevBalance = _token.balanceOf(_from);

        if (
          prevBalance < _value || // Insufficient funds
          _token.allowance(_from, address(this)) < _value // Insufficient allowance
        ) {
            return false;
        }

        address(_token).call(
            abi.encodeWithSignature("transferFrom(address,address,uint256)", _from, _to, _value)
        );

        // Fail if the new balance its not equal than previous balance sub _value
        return prevBalance - _value == _token.balanceOf(_from);
    }

   /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   *
   * 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
   *
   * @param _token erc20 The address of the ERC20 contract
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   * @return bool whether the approve was successful or not
   */
    function safeApprove(IERC20 _token, address _spender, uint256 _value) internal returns (bool) {
        address(_token).call(
            abi.encodeWithSignature("approve(address,uint256)",_spender, _value)
        );

        // Fail if the new allowance its not equal than _value
        return _token.allowance(address(this), _spender) == _value;
    }

   /**
   * @dev Clear approval
   * Note that if 0 is not a valid value it will be set to 1.
   * @param _token erc20 The address of the ERC20 contract
   * @param _spender The address which will spend the funds.
   */
    function clearApprove(IERC20 _token, address _spender) internal returns (bool) {
        bool success = safeApprove(_token, _spender, 0);

        if (!success) {
            success = safeApprove(_token, _spender, 1);
        }

        return success;
    }
}

interface IUniversalRouter {
    function execute(bytes calldata commands, bytes[] calldata inputs, uint256 deadline) external payable;

}

/// @notice Library to define different pool actions.
/// @dev These are suggested common commands, however additional commands should be defined as required
/// Some of these actions are not supported in the Router contracts or Position Manager contracts, but are left as they may be helpful commands for other peripheral contracts.
library Actions {
    // pool actions
    // liquidity actions
    uint256 constant INCREASE_LIQUIDITY = 0x00;
    uint256 constant DECREASE_LIQUIDITY = 0x01;
    uint256 constant MINT_POSITION = 0x02;
    uint256 constant BURN_POSITION = 0x03;
    uint256 constant INCREASE_LIQUIDITY_FROM_DELTAS = 0x04;
    uint256 constant MINT_POSITION_FROM_DELTAS = 0x05;

    // swapping
    uint256 constant SWAP_EXACT_IN_SINGLE = 0x06;
    uint256 constant SWAP_EXACT_IN = 0x07;
    uint256 constant SWAP_EXACT_OUT_SINGLE = 0x08;
    uint256 constant SWAP_EXACT_OUT = 0x09;

    // donate
    // note this is not supported in the position manager or router
    uint256 constant DONATE = 0x0a;

    // closing deltas on the pool manager
    // settling
    uint256 constant SETTLE = 0x0b;
    uint256 constant SETTLE_ALL = 0x0c;
    uint256 constant SETTLE_PAIR = 0x0d;
    // taking
    uint256 constant TAKE = 0x0e;
    uint256 constant TAKE_ALL = 0x0f;
    uint256 constant TAKE_PORTION = 0x10;
    uint256 constant TAKE_PAIR = 0x11;

    uint256 constant CLOSE_CURRENCY = 0x12;
    uint256 constant CLEAR_OR_TAKE = 0x13;
    uint256 constant SWEEP = 0x14;

    uint256 constant WRAP = 0x15;
    uint256 constant UNWRAP = 0x16;

    // minting/burning 6909s to close deltas
    // note this is not supported in the position manager or router
    uint256 constant MINT_6909 = 0x17;
    uint256 constant BURN_6909 = 0x18;
}


/// @title Commands
/// @notice Command Flags used to decode commands
library Commands {
    // Masks to extract certain bits of commands
    bytes1 internal constant FLAG_ALLOW_REVERT = 0x80;
    bytes1 internal constant COMMAND_TYPE_MASK = 0x3f;

    // Command Types. Maximum supported command at this moment is 0x3f.
    // The commands are executed in nested if blocks to minimise gas consumption

    // Command Types where value<=0x07, executed in the first nested-if block
    uint256 constant V3_SWAP_EXACT_IN = 0x00;
    uint256 constant V3_SWAP_EXACT_OUT = 0x01;
    uint256 constant PERMIT2_TRANSFER_FROM = 0x02;
    uint256 constant PERMIT2_PERMIT_BATCH = 0x03;
    uint256 constant SWEEP = 0x04;
    uint256 constant TRANSFER = 0x05;
    uint256 constant PAY_PORTION = 0x06;
    // COMMAND_PLACEHOLDER = 0x07;

    // Command Types where 0x08<=value<=0x0f, executed in the second nested-if block
    uint256 constant V2_SWAP_EXACT_IN = 0x08;
    uint256 constant V2_SWAP_EXACT_OUT = 0x09;
    uint256 constant PERMIT2_PERMIT = 0x0a;
    uint256 constant WRAP_ETH = 0x0b;
    uint256 constant UNWRAP_WETH = 0x0c;
    uint256 constant PERMIT2_TRANSFER_FROM_BATCH = 0x0d;
    uint256 constant BALANCE_CHECK_ERC20 = 0x0e;
    // COMMAND_PLACEHOLDER = 0x0f;

    // Command Types where 0x10<=value<=0x20, executed in the third nested-if block
    uint256 constant V4_SWAP = 0x10;
    uint256 constant V3_POSITION_MANAGER_PERMIT = 0x11;
    uint256 constant V3_POSITION_MANAGER_CALL = 0x12;
    uint256 constant V4_INITIALIZE_POOL = 0x13;
    uint256 constant V4_POSITION_MANAGER_CALL = 0x14;
    // COMMAND_PLACEHOLDER = 0x15 -> 0x20

    // Command Types where 0x21<=value<=0x3f
    uint256 constant EXECUTE_SUB_PLAN = 0x21;
    // COMMAND_PLACEHOLDER for 0x22 to 0x3f
}



interface IPoolManager {

    struct PoolKey {
        address currency0;
        address currency1;
        uint24 fee;
        int24 tickSpacing;
        address hooks;
    }
}


interface IV4Router {
    /// @notice Parameters for a single-hop exact-input swap
    struct ExactInputSingleParams {
        IPoolManager.PoolKey poolKey;
        bool zeroForOne;
        uint128 amountIn;
        uint128 amountOutMinimum;
        bytes hookData;
    }

}

interface IPermit2 {
    function approve(address token, address spender, uint160 amount, uint48 expiration) external;
}

interface IWETH {
    function deposit() external payable;
    function withdraw(uint256) external;
}

contract Klik {
    using SafeERC20 for IERC20;
    address public constant UNIVERSAL_ROUTER = 0x66a9893cC07D91D95644AEDD05D03f95e1dBA8Af;
    address public constant POOL_MANAGER = 0x000000000004444c5dc75cB358380D2e3dE08A90;
    address public constant PERMIT2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;
    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    uint256 public INTERFACE_FEE_BPS = 50; // 0.5% interface fee

    address public owner;
    address public feeAddress;

    constructor(){
        owner=msg.sender;
    }

    function transferOwnership(address _who) public {
        require(msg.sender == owner, 'Ownable: denied');
        require(_who != address(0x0), 'Invalid address');
        owner = _who;
    }

    function changeFee(uint256 _fee) public {
        require(msg.sender == owner, 'Ownable: denied');
        INTERFACE_FEE_BPS = _fee;
    }

    function changeFeeAddress(address _who) public {
        require(msg.sender == owner, 'Ownable: denied');
        require(_who != address(0x0), 'Invalid address');
        feeAddress = _who;
    }

    // Receive ETH
    receive() external payable {}

    
        // Swap ETH to any token with exact input, deduct interface fee from output token
    function swapETHToTokenV3(address token, uint256 amountOutMin, uint24 POOL_FEE) external payable {
        require(msg.value > 0, "Must send ETH");
        uint256 feeAmount = (msg.value * INTERFACE_FEE_BPS) / 10000;
        uint256 swapAmount = msg.value - feeAmount;


        bytes memory commands = abi.encodePacked(bytes1(0x0b), bytes1(0x00)); // WRAP_ETH + V3_SWAP_EXACT_IN

        bytes[] memory inputs = new bytes[](2);

        // WRAP_ETH: encode(recipient = router, amountMin = msg.value)
        inputs[0] = abi.encode(UNIVERSAL_ROUTER, swapAmount);

        // V3_SWAP_EXACT_IN: encode(recipient = this, amountIn = msg.value, amountOutMin, path, payerIsUser = false)
        bytes memory path = abi.encodePacked(WETH, POOL_FEE, token);
        inputs[1] = abi.encode(address(this), swapAmount, amountOutMin, path, false);

        uint256 deadline = block.timestamp + 300;

        IUniversalRouter router = IUniversalRouter(UNIVERSAL_ROUTER);

        router.execute{value: swapAmount}(commands, inputs, deadline);

        // Deduct interface fee from output token
        IERC20 outputToken = IERC20(token);
        uint256 amountOut = outputToken.balanceOf(address(this));
        // uint256 feeAmount = amountOut * INTERFACE_FEE_BPS / 10000;
        // uint256 userAmount = amountOut - feeAmount;

        // outputToken.transfer(owner, feeAmount); // Fee to contract owner
        outputToken.safeTransfer(msg.sender, amountOut);
        if(feeAmount > 0){
            payable(feeAddress).transfer(feeAmount);
        }

    }


    function swapETHToTokenV4(address outputToken, uint128 amountOutMin, uint24 poolFee, int24 tickSpacing) external payable {
        require(msg.value > 0, "Must send ETH");

        uint256 feeAmount = (msg.value * INTERFACE_FEE_BPS) / 10000;
        uint256 swapAmount = msg.value - feeAmount;

        address inputToken = address(0x0);

        address currency0 = inputToken < outputToken ? inputToken : outputToken;
        address currency1 = inputToken < outputToken ? outputToken : inputToken;

        IPoolManager.PoolKey memory poolKey = IPoolManager.PoolKey({
            currency0: currency0,
            currency1: currency1,
            fee: poolFee,
            tickSpacing: tickSpacing,
            hooks: address(0) // Assume no hooks; change if needed
        });

        // V4 commands: SWAP_EXACT_IN_SINGLE + SETTLE_ALL + TAKE_ALL
        bytes memory commands = abi.encodePacked(uint8(Commands.V4_SWAP));

        // Encode V4Router actions
        bytes memory actions = abi.encodePacked(
            uint8(Actions.SWAP_EXACT_IN_SINGLE),
            uint8(Actions.SETTLE_ALL),
            uint8(Actions.TAKE_ALL)
        );
        bytes[] memory params = new bytes[](3);

        // First parameter: swap configuration
        params[0] = abi.encode(
            IV4Router.ExactInputSingleParams({
                poolKey: poolKey,
                zeroForOne: currency0 == inputToken,            // true if we're swapping token0 for token1
                amountIn: uint128(swapAmount),          // amount of tokens we're swapping
                amountOutMinimum: amountOutMin, // minimum amount we expect to receive
                hookData: bytes("")             // no hook data needed
            })
        );

        // Second parameter: specify input tokens for the swap
        // encode SETTLE_ALL parameters
        params[1] = abi.encode(inputToken, swapAmount);

        // Third parameter: specify output tokens from the swap
        params[2] = abi.encode(outputToken, amountOutMin);


        bytes[] memory inputs = new bytes[](1);

        // Combine actions and params into inputs
        inputs[0] = abi.encode(actions, params);

        // Execute the swap
        uint256 deadline = block.timestamp + 20;
        IUniversalRouter(UNIVERSAL_ROUTER).execute{value: swapAmount}(commands, inputs, deadline);

        IERC20 localToken = IERC20(outputToken);
        uint256 swappedBalance = localToken.balanceOf(address(this));
        if(swappedBalance > 0){
            localToken.safeTransfer(msg.sender, swappedBalance);
        }
        if (feeAmount > 0) {
            payable(feeAddress).transfer(feeAmount);
        }
    }



    // Swap ETH to any token with exact input
    function swapTokensForEthV4(address inputToken,  uint128 inputAmount, uint128 amountOutMin, uint24 poolFee, int24 tickSpacing) external {
        address outputToken = address(0x0);
        uint256 swapAmount = inputAmount;


        IERC20(inputToken).safeTransferFrom(msg.sender, address(this), inputAmount);

        IERC20(inputToken).safeApprove(PERMIT2, swapAmount);
        IPermit2(PERMIT2).approve(inputToken, UNIVERSAL_ROUTER, uint160(swapAmount), uint48(block.timestamp + 300));


        address currency0 = inputToken < outputToken ? inputToken : outputToken;
        address currency1 = inputToken < outputToken ? outputToken : inputToken;
        bool zeroForOne = currency0 == inputToken;

        // PoolKey
        // address currency0 = address(0x0) < outputToken ? address(0x0) : outputToken;
        // address currency1 = address(0x0) < outputToken ? outputToken : address(0x0);

        IPoolManager.PoolKey memory poolKey = IPoolManager.PoolKey({
            currency0: currency0,
            currency1: currency1,
            fee: poolFee,
            tickSpacing: tickSpacing,
            hooks: address(0) // Assume no hooks; change if needed
        });

        // V4 commands: SWAP_EXACT_IN_SINGLE + SETTLE_ALL + TAKE_ALL
        // bytes memory commands = abi.encodePacked(uint8(0x10));
        bytes memory commands = abi.encodePacked(uint8(Commands.V4_SWAP));

        // Encode V4Router actions
        bytes memory actions = abi.encodePacked(
            uint8(Actions.SWAP_EXACT_IN_SINGLE),
            uint8(Actions.SETTLE_ALL),
            uint8(Actions.TAKE_ALL)
        );
        bytes[] memory params = new bytes[](3);

        // First parameter: swap configuration
        params[0] = abi.encode(
            IV4Router.ExactInputSingleParams({
                poolKey: poolKey,
                zeroForOne: zeroForOne,            // true if we're swapping token0 for token1
                amountIn: uint128(swapAmount),          // amount of tokens we're swapping
                amountOutMinimum: amountOutMin, // minimum amount we expect to receive
                hookData: bytes("")             // no hook data needed
            })
        );

        // Second parameter: specify input tokens for the swap
        // encode SETTLE_ALL parameters
        params[1] = abi.encode(inputToken, swapAmount);

        // Third parameter: specify output tokens from the swap
        params[2] = abi.encode(outputToken, amountOutMin);


        bytes[] memory inputs = new bytes[](1);

        // Combine actions and params into inputs
        inputs[0] = abi.encode(actions, params);

        // Execute the swap
        uint256 deadline = block.timestamp + 20;
        IUniversalRouter(UNIVERSAL_ROUTER).execute(commands, inputs, deadline);

        uint256 feeAmount = (address(this).balance * INTERFACE_FEE_BPS) / 10000;
        uint256 userAmount =  address(this).balance - feeAmount;
        payable(msg.sender).transfer(userAmount);
        if(feeAmount > 0){
            payable(feeAddress).transfer(feeAmount);
        }
    }


     /// @notice Swap Token to ETH (exact-input). User must approve TOKEN before calling.
    /// @param amountIn Exact TOKEN amount to swap (will be pulled from caller).
    /// @param minEthOut Minimum ETH expected (revert if output is less).
    function swapTokenForEthV3(address token, uint256 amountIn, uint256 minEthOut, uint24 POOL_FEE) external {
        require(amountIn > 0, "Amount must be >0");
        // Pull TOKEN from user to this contract
        IERC20(token).safeTransferFrom(msg.sender, address(this), amountIn);

        uint256 swapAmount = amountIn;



        // Approve the Universal Router to spend the TOKEN for the swap

        IERC20(token).safeApprove(address(UNIVERSAL_ROUTER), swapAmount);

        // Prepare commands for Universal Router:
        // 1. V3_SWAP_EXACT_IN: swap TOKEN->WETH using `swapAmount` TOKEN.
        // 2. UNWRAP_WETH: unwrap the resulting WETH to ETH and send to this contract:contentReference[oaicite:11]{index=11}.
        bytes memory commands = new bytes(2);
        commands[0] = bytes1(0x00); // V3_SWAP_EXACT_IN
        commands[1] = bytes1(0x0c); // UNWRAP_WETH

        // Encode inputs for each command:
        bytes[] memory inputs = new bytes[](2);
        // Input 0: V3_SWAP_EXACT_IN (TOKEN -> WETH). We set recipient = address(UNI_ROUTER) 
        // so the WETH output remains in the router (to be unwrapped in next step).
        // Path = TOKEN + fee (uint24) + WETH9.
        // payerIsUser = false, but here "user" is this contract. We choose false and have router pull from its own balance.
        // Since router doesn't hold TOKEN yet, we instead transferred TOKEN to router below before execute.
        bytes memory path = abi.encodePacked(token, uint24(POOL_FEE), WETH);
        inputs[0] = abi.encode(address(UNIVERSAL_ROUTER), swapAmount, 0, path, false);

        // Input 1: UNWRAP_WETH -> abi.encode(address recipient, uint256 amountMin).
        // We want to convert all WETH (result of swap) to ETH and send to this contract.
        // amountMin = minEthOut to ensure we unwrap at least that much (or revert).
        inputs[1] = abi.encode(address(this), minEthOut);

        // **Transfer TOKEN to the router** before executing, so that router has the tokens to swap.
        IERC20(token).safeTransfer(address(UNIVERSAL_ROUTER), swapAmount);

        // Execute the commands on the router (no ETH `value` needed for this call).
        IUniversalRouter router = IUniversalRouter(UNIVERSAL_ROUTER);
        router.execute(commands, inputs, block.timestamp);

        // After execution, router has unwrapped WETH to ETH and sent to this contract.
        uint256 ethOut = address(this).balance;
        require(ethOut >= minEthOut, "Insufficient ETH output");

        // Send the resulting ETH to the user.
        uint256 feeAmount = (address(this).balance * INTERFACE_FEE_BPS) / 10000;
        uint256 userAmount =  address(this).balance - feeAmount;
        payable(msg.sender).transfer(userAmount);
        if(feeAmount > 0){
            payable(feeAddress).transfer(feeAmount);
        }
    }


}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"INTERFACE_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_MANAGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNIVERSAL_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"changeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"changeFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint24","name":"POOL_FEE","type":"uint24"}],"name":"swapETHToTokenV3","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"outputToken","type":"address"},{"internalType":"uint128","name":"amountOutMin","type":"uint128"},{"internalType":"uint24","name":"poolFee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"}],"name":"swapETHToTokenV4","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minEthOut","type":"uint256"},{"internalType":"uint24","name":"POOL_FEE","type":"uint24"}],"name":"swapTokenForEthV3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"uint128","name":"inputAmount","type":"uint128"},{"internalType":"uint128","name":"amountOutMin","type":"uint128"},{"internalType":"uint24","name":"poolFee","type":"uint24"},{"internalType":"int24","name":"tickSpacing","type":"int24"}],"name":"swapTokensForEthV4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260325f553480156012575f5ffd5b50600180546001600160a01b03191633179055611d18806100325f395ff3fe6080604052600436106100af575f3560e01c806321d6c9fe146100ba578063285e1406146100db57806341275358146100fa578063515d0ea31461012f57806362308e85146101425780636a1db1bf146101645780636afdd850146101835780636e09d9c7146101a55780638da5cb5b146101c4578063ad5c4648146101e3578063dd8354881461020a578063e8d8ff4c1461021d578063e8dd7fc31461023f578063f2fde38b1461025f575f5ffd5b366100b657005b5f5ffd5b3480156100c5575f5ffd5b506100d96100d4366004611733565b61027e565b005b3480156100e6575f5ffd5b506100d96100f5366004611776565b6105e8565b348015610105575f5ffd5b50600254610119906001600160a01b031681565b604051610126919061178f565b60405180910390f35b6100d961013d3660046117a3565b61065a565b34801561014d575f5ffd5b506101196e04444c5dc75cb358380d2e3de08a9081565b34801561016f575f5ffd5b506100d961017e3660046117dc565b6108f8565b34801561018e575f5ffd5b506101196e22d473030f116ddee9f6b43ac78ba381565b3480156101b0575f5ffd5b506100d96101bf36600461181a565b610926565b3480156101cf575f5ffd5b50600154610119906001600160a01b031681565b3480156101ee575f5ffd5b5061011973c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6100d961021836600461187b565b610dbc565b348015610228575f5ffd5b506102315f5481565b604051908152602001610126565b34801561024a575f5ffd5b506101195f516020611cc35f395f51905f5281565b34801561026a575f5ffd5b506100d9610279366004611776565b6111dd565b5f83116102c65760405162461bcd60e51b81526020600482015260116024820152700416d6f756e74206d757374206265203e3607c1b60448201526064015b60405180910390fd5b6102db6001600160a01b03851633308661124f565b50826102fe6001600160a01b0386165f516020611cc35f395f51905f5283611466565b506040805160028082528183019092525f916020820181803683370190505090505f60f81b815f81518110610335576103356118c1565b60200101906001600160f81b03191690815f1a905350600c60f81b81600181518110610363576103636118c1565b60200101906001600160f81b03191690815f1a905350604080516002808252606082019092525f91816020015b60608152602001906001900390816103905790505090505f878573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26040516020016103d1939291906118d5565b60405160208183030381529060405290505f516020611cc35f395f51905f52845f835f604051602001610408959493929190611939565b604051602081830303815290604052825f81518110610429576104296118c1565b6020026020010181905250308660405160200161044792919061197c565b60405160208183030381529060405282600181518110610469576104696118c1565b60209081029190910101526104956001600160a01b0389165f516020611cc35f395f51905f5286611574565b50604051630d64d59360e21b81525f516020611cc35f395f51905f52908190633593564c906104cc908790879042906004016119ef565b5f604051808303815f87803b1580156104e3575f5ffd5b505af11580156104f5573d5f5f3e3d5ffd5b504792505050878110156105455760405162461bcd60e51b8152602060048201526017602482015276125b9cdd59999a58da595b9d08115512081bdd5d1c1d5d604a1b60448201526064016102bd565b5f6127105f54476105569190611a38565b6105609190611a55565b90505f61056d8247611a74565b604051909150339082156108fc029083905f818181858888f1935050505015801561059a573d5f5f3e3d5ffd5b5081156105da576002546040516001600160a01b039091169083156108fc029084905f818181858888f193505050501580156105d8573d5f5f3e3d5ffd5b505b505050505050505050505050565b6001546001600160a01b031633146106125760405162461bcd60e51b81526004016102bd90611a87565b6001600160a01b0381166106385760405162461bcd60e51b81526004016102bd90611ab0565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f34116106795760405162461bcd60e51b81526004016102bd90611ad9565b5f6127105f543461068a9190611a38565b6106949190611a55565b90505f6106a18234611a74565b60408051600b60f81b60208201525f6021820181905282516002818403810182526022840181815260828501909552949550939092916042015b60608152602001906001900390816106db5790505090505f516020611cc35f395f51905f528360405160200161071292919061197c565b604051602081830303815290604052815f81518110610733576107336118c1565b60200260200101819052505f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28689604051602001610768939291906118d5565b6040516020818303038152906040529050308488835f604051602001610792959493929190611b00565b604051602081830303815290604052826001815181106107b4576107b46118c1565b60209081029190910101525f6107cc4261012c611b2c565b604051630d64d59360e21b81529091505f516020611cc35f395f51905f52908190633593564c908890610807908990899088906004016119ef565b5f604051808303818588803b15801561081e575f5ffd5b505af1158015610830573d5f5f3e3d5ffd5b50506040516370a0823160e01b81528d93505f92506001600160a01b03841691506370a082319061086590309060040161178f565b602060405180830381865afa158015610880573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a49190611b3f565b90506108ba6001600160a01b0383163383611574565b5088156105da576002546040516001600160a01b03909116908a156108fc02908b905f818181858888f193505050501580156105d8573d5f5f3e3d5ffd5b6001546001600160a01b031633146109225760405162461bcd60e51b81526004016102bd90611a87565b5f55565b5f6001600160801b0385166109466001600160a01b03881633308461124f565b5061096a6001600160a01b0388166e22d473030f116ddee9f6b43ac78ba383611466565b506e22d473030f116ddee9f6b43ac78ba36387517c45885f516020611cc35f395f51905f528461099c4261012c611b2c565b6040516001600160e01b031960e087901b1681526001600160a01b03948516600482015292841660248401529216604482015265ffffffffffff90911660648201526084015f604051808303815f87803b1580156109f8575f5ffd5b505af1158015610a0a573d5f5f3e3d5ffd5b505050505f826001600160a01b0316886001600160a01b031610610a2e5782610a30565b875b90505f836001600160a01b0316896001600160a01b031610610a525788610a54565b835b90505f896001600160a01b0316836001600160a01b03161490505f6040518060a00160405280856001600160a01b03168152602001846001600160a01b031681526020018962ffffff1681526020018860020b81526020015f6001600160a01b031681525090505f6010604051602001610ace9190611b56565b60405160208183030381529060405290505f6006600c600f604051602001610af893929190611b6e565b60408051808303601f1901815260038084526080840190925292505f9190816020015b6060815260200190600190039081610b1b5790505090506040518060a001604052808581526020018615158152602001896001600160801b031681526020018d6001600160801b0316815260200160405180602001604052805f815250815250604051602001610b8b9190611ba5565b604051602081830303815290604052815f81518110610bac57610bac6118c1565b60200260200101819052508d88604051602001610bca92919061197c565b60405160208183030381529060405281600181518110610bec57610bec6118c1565b6020026020010181905250888c604051602001610c0a929190611c43565b60405160208183030381529060405281600281518110610c2c57610c2c6118c1565b60209081029190910101526040805160018082528183019092525f91816020015b6060815260200190600190039081610c4d5790505090508282604051602001610c77929190611c65565b604051602081830303815290604052815f81518110610c9857610c986118c1565b60209081029190910101525f610caf426014611b2c565b604051630d64d59360e21b81529091505f516020611cc35f395f51905f5290633593564c90610ce6908890869086906004016119ef565b5f604051808303815f87803b158015610cfd575f5ffd5b505af1158015610d0f573d5f5f3e3d5ffd5b505050505f6127105f5447610d249190611a38565b610d2e9190611a55565b90505f610d3b8247611a74565b604051909150339082156108fc029083905f818181858888f19350505050158015610d68573d5f5f3e3d5ffd5b508115610da8576002546040516001600160a01b039091169083156108fc029084905f818181858888f19350505050158015610da6573d5f5f3e3d5ffd5b505b505050505050505050505050505050505050565b5f3411610ddb5760405162461bcd60e51b81526004016102bd90611ad9565b5f6127105f5434610dec9190611a38565b610df69190611a55565b90505f610e038234611a74565b90505f806001600160a01b038816610e1b5787610e1d565b815b90505f886001600160a01b0316836001600160a01b031610610e3f5782610e41565b885b90505f6040518060a00160405280846001600160a01b03168152602001836001600160a01b031681526020018962ffffff1681526020018860020b81526020015f6001600160a01b031681525090505f6010604051602001610ea39190611b56565b60405160208183030381529060405290505f6006600c600f604051602001610ecd93929190611b6e565b60408051808303601f1901815260038084526080840190925292505f9190816020015b6060815260200190600190039081610ef05790505090506040518060a00160405280858152602001886001600160a01b0316886001600160a01b03161415158152602001896001600160801b031681526020018d6001600160801b0316815260200160405180602001604052805f815250815250604051602001610f749190611ba5565b604051602081830303815290604052815f81518110610f9557610f956118c1565b60200260200101819052508688604051602001610fb392919061197c565b60405160208183030381529060405281600181518110610fd557610fd56118c1565b60200260200101819052508c8c604051602001610ff3929190611c43565b60405160208183030381529060405281600281518110611015576110156118c1565b60209081029190910101526040805160018082528183019092525f91816020015b60608152602001906001900390816110365790505090508282604051602001611060929190611c65565b604051602081830303815290604052815f81518110611081576110816118c1565b60209081029190910101525f611098426014611b2c565b604051630d64d59360e21b81529091505f516020611cc35f395f51905f5290633593564c908c906110d1908990879087906004016119ef565b5f604051808303818588803b1580156110e8575f5ffd5b505af11580156110fa573d5f5f3e3d5ffd5b50505050505f8f90505f816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611130919061178f565b602060405180830381865afa15801561114b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116f9190611b3f565b9050801561118d5761118b6001600160a01b0383163383611574565b505b8c156111ca576002546040516001600160a01b03909116908e156108fc02908f905f818181858888f19350505050158015610da8573d5f5f3e3d5ffd5b5050505050505050505050505050505050565b6001546001600160a01b031633146112075760405162461bcd60e51b81526004016102bd90611a87565b6001600160a01b03811661122d5760405162461bcd60e51b81526004016102bd90611ab0565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f856001600160a01b03166370a08231866040518263ffffffff1660e01b815260040161127d919061178f565b602060405180830381865afa158015611298573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112bc9190611b3f565b9050828110806113385750604051636eb1769f60e11b815283906001600160a01b0388169063dd62ed3e906112f79089903090600401611c92565b602060405180830381865afa158015611312573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113369190611b3f565b105b15611346575f91505061145e565b6040516001600160a01b03868116602483015285811660448301526064820185905287169060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516113a39190611cac565b5f604051808303815f865af19150503d805f81146113dc576040519150601f19603f3d011682016040523d82523d5f602084013e6113e1565b606091505b50506040516370a0823160e01b81526001600160a01b03881691506370a082319061141090889060040161178f565b602060405180830381865afa15801561142b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144f9190611b3f565b6114598483611a74565b149150505b949350505050565b5f836001600160a01b0316838360405160240161148492919061197c565b60408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b179052516114b99190611cac565b5f604051808303815f865af19150503d805f81146114f2576040519150601f19603f3d011682016040523d82523d5f602084013e6114f7565b606091505b5050604051636eb1769f60e11b81528391506001600160a01b0386169063dd62ed3e9061152a9030908890600401611c92565b602060405180830381865afa158015611545573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115699190611b3f565b1490505b9392505050565b5f5f846001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016115a2919061178f565b602060405180830381865afa1580156115bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e19190611b3f565b9050828110156115f4575f91505061156d565b846001600160a01b0316848460405160240161161192919061197c565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052516116469190611cac565b5f604051808303815f865af19150503d805f811461167f576040519150601f19603f3d011682016040523d82523d5f602084013e611684565b606091505b50506040516370a0823160e01b81526001600160a01b03871691506370a08231906116b390309060040161178f565b602060405180830381865afa1580156116ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f29190611b3f565b6116fc8483611a74565b1495945050505050565b80356001600160a01b038116811461171c575f5ffd5b919050565b803562ffffff8116811461171c575f5ffd5b5f5f5f5f60808587031215611746575f5ffd5b61174f85611706565b9350602085013592506040850135915061176b60608601611721565b905092959194509250565b5f60208284031215611786575f5ffd5b61156d82611706565b6001600160a01b0391909116815260200190565b5f5f5f606084860312156117b5575f5ffd5b6117be84611706565b9250602084013591506117d360408501611721565b90509250925092565b5f602082840312156117ec575f5ffd5b5035919050565b80356001600160801b038116811461171c575f5ffd5b8035600281900b811461171c575f5ffd5b5f5f5f5f5f60a0868803121561182e575f5ffd5b61183786611706565b9450611845602087016117f3565b9350611853604087016117f3565b925061186160608701611721565b915061186f60808701611809565b90509295509295909350565b5f5f5f5f6080858703121561188e575f5ffd5b61189785611706565b93506118a5602086016117f3565b92506118b360408601611721565b915061176b60608601611809565b634e487b7160e01b5f52603260045260245ffd5b606093841b6001600160601b0319908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b60018060a01b038616815284602082015260ff8416604082015260a060608201525f61196860a083018561190b565b905082151560808301529695505050505050565b6001600160a01b03929092168252602082015260400190565b5f82825180855260208501945060208160051b830101602085015f5b838110156119e357601f198584030188526119cd83835161190b565b60209889019890935091909101906001016119b1565b50909695505050505050565b606081525f611a01606083018661190b565b8281036020840152611a138186611995565b915050826040830152949350505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417611a4f57611a4f611a24565b92915050565b5f82611a6f57634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115611a4f57611a4f611a24565b6020808252600f908201526e13dddb98589b194e8819195b9a5959608a1b604082015260600190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b6020808252600d908201526c09aeae6e840e6cadcc8408aa89609b1b604082015260600190565b60018060a01b038616815284602082015283604082015260a060608201525f61196860a083018561190b565b80820180821115611a4f57611a4f611a24565b5f60208284031215611b4f575f5ffd5b5051919050565b60f89190911b6001600160f81b031916815260010190565b6001600160f81b031960f894851b8116825292841b83166001820152921b16600282015260030190565b6001600160801b03169052565b6020808252825180516001600160a01b03908116848401528183015181166040808601919091528083015162ffffff1660608087019190915283015160020b608080870191909152909201511660a084015290830151151560c08301528201515f90611c1460e0840182611b98565b506060830151611c28610100840182611b98565b5060808301516101208084015261145e61014084018261190b565b6001600160a01b039290921682526001600160801b0316602082015260400190565b604081525f611c77604083018561190b565b8281036020840152611c898185611995565b95945050505050565b6001600160a01b0392831681529116602082015260400190565b5f82518060208501845e5f92019182525091905056fe00000000000000000000000066a9893cc07d91d95644aedd05d03f95e1dba8afa264697066735822122036911a7b044b55ca7bc4b7ef722cb2b1ca27a551c1722629eafb4f386fbf0c4b64736f6c634300081e0033

Deployed Bytecode

0x6080604052600436106100af575f3560e01c806321d6c9fe146100ba578063285e1406146100db57806341275358146100fa578063515d0ea31461012f57806362308e85146101425780636a1db1bf146101645780636afdd850146101835780636e09d9c7146101a55780638da5cb5b146101c4578063ad5c4648146101e3578063dd8354881461020a578063e8d8ff4c1461021d578063e8dd7fc31461023f578063f2fde38b1461025f575f5ffd5b366100b657005b5f5ffd5b3480156100c5575f5ffd5b506100d96100d4366004611733565b61027e565b005b3480156100e6575f5ffd5b506100d96100f5366004611776565b6105e8565b348015610105575f5ffd5b50600254610119906001600160a01b031681565b604051610126919061178f565b60405180910390f35b6100d961013d3660046117a3565b61065a565b34801561014d575f5ffd5b506101196e04444c5dc75cb358380d2e3de08a9081565b34801561016f575f5ffd5b506100d961017e3660046117dc565b6108f8565b34801561018e575f5ffd5b506101196e22d473030f116ddee9f6b43ac78ba381565b3480156101b0575f5ffd5b506100d96101bf36600461181a565b610926565b3480156101cf575f5ffd5b50600154610119906001600160a01b031681565b3480156101ee575f5ffd5b5061011973c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6100d961021836600461187b565b610dbc565b348015610228575f5ffd5b506102315f5481565b604051908152602001610126565b34801561024a575f5ffd5b506101195f516020611cc35f395f51905f5281565b34801561026a575f5ffd5b506100d9610279366004611776565b6111dd565b5f83116102c65760405162461bcd60e51b81526020600482015260116024820152700416d6f756e74206d757374206265203e3607c1b60448201526064015b60405180910390fd5b6102db6001600160a01b03851633308661124f565b50826102fe6001600160a01b0386165f516020611cc35f395f51905f5283611466565b506040805160028082528183019092525f916020820181803683370190505090505f60f81b815f81518110610335576103356118c1565b60200101906001600160f81b03191690815f1a905350600c60f81b81600181518110610363576103636118c1565b60200101906001600160f81b03191690815f1a905350604080516002808252606082019092525f91816020015b60608152602001906001900390816103905790505090505f878573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26040516020016103d1939291906118d5565b60405160208183030381529060405290505f516020611cc35f395f51905f52845f835f604051602001610408959493929190611939565b604051602081830303815290604052825f81518110610429576104296118c1565b6020026020010181905250308660405160200161044792919061197c565b60405160208183030381529060405282600181518110610469576104696118c1565b60209081029190910101526104956001600160a01b0389165f516020611cc35f395f51905f5286611574565b50604051630d64d59360e21b81525f516020611cc35f395f51905f52908190633593564c906104cc908790879042906004016119ef565b5f604051808303815f87803b1580156104e3575f5ffd5b505af11580156104f5573d5f5f3e3d5ffd5b504792505050878110156105455760405162461bcd60e51b8152602060048201526017602482015276125b9cdd59999a58da595b9d08115512081bdd5d1c1d5d604a1b60448201526064016102bd565b5f6127105f54476105569190611a38565b6105609190611a55565b90505f61056d8247611a74565b604051909150339082156108fc029083905f818181858888f1935050505015801561059a573d5f5f3e3d5ffd5b5081156105da576002546040516001600160a01b039091169083156108fc029084905f818181858888f193505050501580156105d8573d5f5f3e3d5ffd5b505b505050505050505050505050565b6001546001600160a01b031633146106125760405162461bcd60e51b81526004016102bd90611a87565b6001600160a01b0381166106385760405162461bcd60e51b81526004016102bd90611ab0565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f34116106795760405162461bcd60e51b81526004016102bd90611ad9565b5f6127105f543461068a9190611a38565b6106949190611a55565b90505f6106a18234611a74565b60408051600b60f81b60208201525f6021820181905282516002818403810182526022840181815260828501909552949550939092916042015b60608152602001906001900390816106db5790505090505f516020611cc35f395f51905f528360405160200161071292919061197c565b604051602081830303815290604052815f81518110610733576107336118c1565b60200260200101819052505f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28689604051602001610768939291906118d5565b6040516020818303038152906040529050308488835f604051602001610792959493929190611b00565b604051602081830303815290604052826001815181106107b4576107b46118c1565b60209081029190910101525f6107cc4261012c611b2c565b604051630d64d59360e21b81529091505f516020611cc35f395f51905f52908190633593564c908890610807908990899088906004016119ef565b5f604051808303818588803b15801561081e575f5ffd5b505af1158015610830573d5f5f3e3d5ffd5b50506040516370a0823160e01b81528d93505f92506001600160a01b03841691506370a082319061086590309060040161178f565b602060405180830381865afa158015610880573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a49190611b3f565b90506108ba6001600160a01b0383163383611574565b5088156105da576002546040516001600160a01b03909116908a156108fc02908b905f818181858888f193505050501580156105d8573d5f5f3e3d5ffd5b6001546001600160a01b031633146109225760405162461bcd60e51b81526004016102bd90611a87565b5f55565b5f6001600160801b0385166109466001600160a01b03881633308461124f565b5061096a6001600160a01b0388166e22d473030f116ddee9f6b43ac78ba383611466565b506e22d473030f116ddee9f6b43ac78ba36387517c45885f516020611cc35f395f51905f528461099c4261012c611b2c565b6040516001600160e01b031960e087901b1681526001600160a01b03948516600482015292841660248401529216604482015265ffffffffffff90911660648201526084015f604051808303815f87803b1580156109f8575f5ffd5b505af1158015610a0a573d5f5f3e3d5ffd5b505050505f826001600160a01b0316886001600160a01b031610610a2e5782610a30565b875b90505f836001600160a01b0316896001600160a01b031610610a525788610a54565b835b90505f896001600160a01b0316836001600160a01b03161490505f6040518060a00160405280856001600160a01b03168152602001846001600160a01b031681526020018962ffffff1681526020018860020b81526020015f6001600160a01b031681525090505f6010604051602001610ace9190611b56565b60405160208183030381529060405290505f6006600c600f604051602001610af893929190611b6e565b60408051808303601f1901815260038084526080840190925292505f9190816020015b6060815260200190600190039081610b1b5790505090506040518060a001604052808581526020018615158152602001896001600160801b031681526020018d6001600160801b0316815260200160405180602001604052805f815250815250604051602001610b8b9190611ba5565b604051602081830303815290604052815f81518110610bac57610bac6118c1565b60200260200101819052508d88604051602001610bca92919061197c565b60405160208183030381529060405281600181518110610bec57610bec6118c1565b6020026020010181905250888c604051602001610c0a929190611c43565b60405160208183030381529060405281600281518110610c2c57610c2c6118c1565b60209081029190910101526040805160018082528183019092525f91816020015b6060815260200190600190039081610c4d5790505090508282604051602001610c77929190611c65565b604051602081830303815290604052815f81518110610c9857610c986118c1565b60209081029190910101525f610caf426014611b2c565b604051630d64d59360e21b81529091505f516020611cc35f395f51905f5290633593564c90610ce6908890869086906004016119ef565b5f604051808303815f87803b158015610cfd575f5ffd5b505af1158015610d0f573d5f5f3e3d5ffd5b505050505f6127105f5447610d249190611a38565b610d2e9190611a55565b90505f610d3b8247611a74565b604051909150339082156108fc029083905f818181858888f19350505050158015610d68573d5f5f3e3d5ffd5b508115610da8576002546040516001600160a01b039091169083156108fc029084905f818181858888f19350505050158015610da6573d5f5f3e3d5ffd5b505b505050505050505050505050505050505050565b5f3411610ddb5760405162461bcd60e51b81526004016102bd90611ad9565b5f6127105f5434610dec9190611a38565b610df69190611a55565b90505f610e038234611a74565b90505f806001600160a01b038816610e1b5787610e1d565b815b90505f886001600160a01b0316836001600160a01b031610610e3f5782610e41565b885b90505f6040518060a00160405280846001600160a01b03168152602001836001600160a01b031681526020018962ffffff1681526020018860020b81526020015f6001600160a01b031681525090505f6010604051602001610ea39190611b56565b60405160208183030381529060405290505f6006600c600f604051602001610ecd93929190611b6e565b60408051808303601f1901815260038084526080840190925292505f9190816020015b6060815260200190600190039081610ef05790505090506040518060a00160405280858152602001886001600160a01b0316886001600160a01b03161415158152602001896001600160801b031681526020018d6001600160801b0316815260200160405180602001604052805f815250815250604051602001610f749190611ba5565b604051602081830303815290604052815f81518110610f9557610f956118c1565b60200260200101819052508688604051602001610fb392919061197c565b60405160208183030381529060405281600181518110610fd557610fd56118c1565b60200260200101819052508c8c604051602001610ff3929190611c43565b60405160208183030381529060405281600281518110611015576110156118c1565b60209081029190910101526040805160018082528183019092525f91816020015b60608152602001906001900390816110365790505090508282604051602001611060929190611c65565b604051602081830303815290604052815f81518110611081576110816118c1565b60209081029190910101525f611098426014611b2c565b604051630d64d59360e21b81529091505f516020611cc35f395f51905f5290633593564c908c906110d1908990879087906004016119ef565b5f604051808303818588803b1580156110e8575f5ffd5b505af11580156110fa573d5f5f3e3d5ffd5b50505050505f8f90505f816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611130919061178f565b602060405180830381865afa15801561114b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116f9190611b3f565b9050801561118d5761118b6001600160a01b0383163383611574565b505b8c156111ca576002546040516001600160a01b03909116908e156108fc02908f905f818181858888f19350505050158015610da8573d5f5f3e3d5ffd5b5050505050505050505050505050505050565b6001546001600160a01b031633146112075760405162461bcd60e51b81526004016102bd90611a87565b6001600160a01b03811661122d5760405162461bcd60e51b81526004016102bd90611ab0565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f5f856001600160a01b03166370a08231866040518263ffffffff1660e01b815260040161127d919061178f565b602060405180830381865afa158015611298573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112bc9190611b3f565b9050828110806113385750604051636eb1769f60e11b815283906001600160a01b0388169063dd62ed3e906112f79089903090600401611c92565b602060405180830381865afa158015611312573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113369190611b3f565b105b15611346575f91505061145e565b6040516001600160a01b03868116602483015285811660448301526064820185905287169060840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516113a39190611cac565b5f604051808303815f865af19150503d805f81146113dc576040519150601f19603f3d011682016040523d82523d5f602084013e6113e1565b606091505b50506040516370a0823160e01b81526001600160a01b03881691506370a082319061141090889060040161178f565b602060405180830381865afa15801561142b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144f9190611b3f565b6114598483611a74565b149150505b949350505050565b5f836001600160a01b0316838360405160240161148492919061197c565b60408051601f198184030181529181526020820180516001600160e01b031663095ea7b360e01b179052516114b99190611cac565b5f604051808303815f865af19150503d805f81146114f2576040519150601f19603f3d011682016040523d82523d5f602084013e6114f7565b606091505b5050604051636eb1769f60e11b81528391506001600160a01b0386169063dd62ed3e9061152a9030908890600401611c92565b602060405180830381865afa158015611545573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115699190611b3f565b1490505b9392505050565b5f5f846001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016115a2919061178f565b602060405180830381865afa1580156115bd573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e19190611b3f565b9050828110156115f4575f91505061156d565b846001600160a01b0316848460405160240161161192919061197c565b60408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052516116469190611cac565b5f604051808303815f865af19150503d805f811461167f576040519150601f19603f3d011682016040523d82523d5f602084013e611684565b606091505b50506040516370a0823160e01b81526001600160a01b03871691506370a08231906116b390309060040161178f565b602060405180830381865afa1580156116ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116f29190611b3f565b6116fc8483611a74565b1495945050505050565b80356001600160a01b038116811461171c575f5ffd5b919050565b803562ffffff8116811461171c575f5ffd5b5f5f5f5f60808587031215611746575f5ffd5b61174f85611706565b9350602085013592506040850135915061176b60608601611721565b905092959194509250565b5f60208284031215611786575f5ffd5b61156d82611706565b6001600160a01b0391909116815260200190565b5f5f5f606084860312156117b5575f5ffd5b6117be84611706565b9250602084013591506117d360408501611721565b90509250925092565b5f602082840312156117ec575f5ffd5b5035919050565b80356001600160801b038116811461171c575f5ffd5b8035600281900b811461171c575f5ffd5b5f5f5f5f5f60a0868803121561182e575f5ffd5b61183786611706565b9450611845602087016117f3565b9350611853604087016117f3565b925061186160608701611721565b915061186f60808701611809565b90509295509295909350565b5f5f5f5f6080858703121561188e575f5ffd5b61189785611706565b93506118a5602086016117f3565b92506118b360408601611721565b915061176b60608601611809565b634e487b7160e01b5f52603260045260245ffd5b606093841b6001600160601b0319908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b60018060a01b038616815284602082015260ff8416604082015260a060608201525f61196860a083018561190b565b905082151560808301529695505050505050565b6001600160a01b03929092168252602082015260400190565b5f82825180855260208501945060208160051b830101602085015f5b838110156119e357601f198584030188526119cd83835161190b565b60209889019890935091909101906001016119b1565b50909695505050505050565b606081525f611a01606083018661190b565b8281036020840152611a138186611995565b915050826040830152949350505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417611a4f57611a4f611a24565b92915050565b5f82611a6f57634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115611a4f57611a4f611a24565b6020808252600f908201526e13dddb98589b194e8819195b9a5959608a1b604082015260600190565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b6020808252600d908201526c09aeae6e840e6cadcc8408aa89609b1b604082015260600190565b60018060a01b038616815284602082015283604082015260a060608201525f61196860a083018561190b565b80820180821115611a4f57611a4f611a24565b5f60208284031215611b4f575f5ffd5b5051919050565b60f89190911b6001600160f81b031916815260010190565b6001600160f81b031960f894851b8116825292841b83166001820152921b16600282015260030190565b6001600160801b03169052565b6020808252825180516001600160a01b03908116848401528183015181166040808601919091528083015162ffffff1660608087019190915283015160020b608080870191909152909201511660a084015290830151151560c08301528201515f90611c1460e0840182611b98565b506060830151611c28610100840182611b98565b5060808301516101208084015261145e61014084018261190b565b6001600160a01b039290921682526001600160801b0316602082015260400190565b604081525f611c77604083018561190b565b8281036020840152611c898185611995565b95945050505050565b6001600160a01b0392831681529116602082015260400190565b5f82518060208501845e5f92019182525091905056fe00000000000000000000000066a9893cc07d91d95644aedd05d03f95e1dba8afa264697066735822122036911a7b044b55ca7bc4b7ef722cb2b1ca27a551c1722629eafb4f386fbf0c4b64736f6c634300081e0033

Deployed Bytecode Sourcemap

10191:12004:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19287:2901;;;;;;;;;;-1:-1:-1;19287:2901:0;;;;;:::i;:::-;;:::i;:::-;;11128:200;;;;;;;;;;-1:-1:-1;11128:200:0;;;;;:::i;:::-;;:::i;10685:25::-;;;;;;;;;;-1:-1:-1;10685:25:0;;;;-1:-1:-1;;;;;10685:25:0;;;;;;;;;;:::i;:::-;;;;;;;;11490:1581;;;;;;:::i;:::-;;:::i;10337:81::-;;;;;;;;;;;;10376:42;10337:81;;10979:141;;;;;;;;;;-1:-1:-1;10979:141:0;;;;;:::i;:::-;;:::i;10425:76::-;;;;;;;;;;;;10459:42;10425:76;;15880:3149;;;;;;;;;;-1:-1:-1;15880:3149:0;;;;;:::i;:::-;;:::i;10658:20::-;;;;;;;;;;-1:-1:-1;10658:20:0;;;;-1:-1:-1;;;;;10658:20:0;;;10508:73;;;;;;;;;;;;10539:42;10508:73;;13081:2740;;;;;;:::i;:::-;;:::i;10590:37::-;;;;;;;;;;;;;;;;;;;3243:25:1;;;3231:2;3216:18;10590:37:0;3097:177:1;10245:85:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10245:85:0;;10775:196;;;;;;;;;;-1:-1:-1;10775:196:0;;;;;:::i;:::-;;:::i;19287:2901::-;19422:1;19411:8;:12;19403:42;;;;-1:-1:-1;;;19403:42:0;;3481:2:1;19403:42:0;;;3463:21:1;3520:2;3500:18;;;3493:30;-1:-1:-1;;;3539:18:1;;;3532:47;3596:18;;19403:42:0;;;;;;;;;19506:67;-1:-1:-1;;;;;19506:30:0;;19537:10;19557:4;19564:8;19506:30;:67::i;:::-;-1:-1:-1;19607:8:0;19707:64;-1:-1:-1;;;;;19707:25:0;;-1:-1:-1;;;;;;;;;;;19607:8:0;19707:25;:64::i;:::-;-1:-1:-1;20062:12:0;;;20072:1;20062:12;;;;;;;;;20038:21;;20062:12;;;;;;;;;;-1:-1:-1;20062:12:0;20038:36;;20106:4;20099:12;;20085:8;20094:1;20085:11;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;20085:26:0;;;;;;;;;20163:4;20156:12;;20142:8;20151:1;20142:11;;;;;;;;:::i;:::-;;;;:26;-1:-1:-1;;;;;20142:26:0;;;;;;;;-1:-1:-1;20264:14:0;;;20276:1;20264:14;;;;;;;;;20240:21;;20264:14;;;;;;;;;;;;;;;;;;;;20240:38;;20754:17;20791:5;20805:8;10539:42;20774:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20754:67;;-1:-1:-1;;;;;;;;;;;20882:10:0;20894:1;20897:4;20903:5;20844:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20832:6;20839:1;20832:9;;;;;;;;:::i;:::-;;;;;;:77;;;;21216:4;21223:9;21197:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21185:6;21192:1;21185:9;;;;;;;;:::i;:::-;;;;;;;;;;:48;21348:65;-1:-1:-1;;;;;21348:26:0;;-1:-1:-1;;;;;;;;;;;21402:10:0;21348:26;:65::i;:::-;-1:-1:-1;21583:49:0;;-1:-1:-1;;;21583:49:0;;-1:-1:-1;;;;;;;;;;;10288:42:0;;;21583:14;;:49;;21598:8;;21608:6;;21616:15;;21583:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21751:21:0;;-1:-1:-1;;;21791:19:0;;;;21783:55;;;;-1:-1:-1;;;21783:55:0;;6844:2:1;21783:55:0;;;6826:21:1;6883:2;6863:18;;;6856:30;-1:-1:-1;;;6902:18:1;;;6895:53;6965:18;;21783:55:0;6642:347:1;21783:55:0;21899:17;21965:5;21944:17;;21920:21;:41;;;;:::i;:::-;21919:51;;;;:::i;:::-;21899:71;-1:-1:-1;21981:18:0;22003:33;21899:71;22003:21;:33;:::i;:::-;22047:40;;21981:55;;-1:-1:-1;22055:10:0;;22047:40;;;;;21981:55;;22047:40;;;;21981:55;22055:10;22047:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22101:13:0;;22098:83;;22138:10;;22130:39;;-1:-1:-1;;;;;22138:10:0;;;;22130:39;;;;;22159:9;;22138:10;22130:39;22138:10;22130:39;22159:9;22138:10;22130:39;;;;;;;;;;;;;;;;;;;;;22098:83;19392:2796;;;;;;;;19287:2901;;;;:::o;11128:200::-;11208:5;;-1:-1:-1;;;;;11208:5:0;11194:10;:19;11186:47;;;;-1:-1:-1;;;11186:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11252:20:0;;11244:48;;;;-1:-1:-1;;;11244:48:0;;;;;;;:::i;:::-;11303:10;:17;;-1:-1:-1;;;;;;11303:17:0;-1:-1:-1;;;;;11303:17:0;;;;;;;;;;11128:200::o;11490:1581::-;11618:1;11606:9;:13;11598:39;;;;-1:-1:-1;;;11598:39:0;;;;;;;:::i;:::-;11648:17;11702:5;11681:17;;11669:9;:29;;;;:::i;:::-;11668:39;;;;:::i;:::-;11648:59;-1:-1:-1;11718:18:0;11739:21;11648:59;11739:9;:21;:::i;:::-;11799:44;;;-1:-1:-1;;;11799:44:0;;;8837:39:1;11775:21:0;8892:11:1;;;8885:47;;;11799:44:0;;;;;;;;;;8948:11:1;;;11911:14:0;;;;;;;;;11718:42;;-1:-1:-1;11799:44:0;11775:21;;8948:11:1;11911:14:0;;;;;;;;;;;;;;;;;;;11887:38;;-1:-1:-1;;;;;;;;;;;12051:10:0;12022:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12010:6;12017:1;12010:9;;;;;;;;:::i;:::-;;;;;;:52;;;;12193:17;10539:42;12236:8;12246:5;12213:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12193:59;;12294:4;12301:10;12313:12;12327:4;12333:5;12275:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12263:6;12270:1;12263:9;;;;;;;;:::i;:::-;;;;;;;;;;:76;12352:16;12371:21;:15;12389:3;12371:21;:::i;:::-;12478:61;;-1:-1:-1;;;12478:61:0;;12352:40;;-1:-1:-1;;;;;;;;;;;;10288:42:0;;;12478:14;;12500:10;;12478:61;;12512:8;;12522:6;;12352:40;;12478:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12668:36:0;;-1:-1:-1;;;12668:36:0;;12631:5;;-1:-1:-1;12603:18:0;;-1:-1:-1;;;;;;12668:21:0;;;-1:-1:-1;12668:21:0;;:36;;12698:4;;12668:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12648:56;-1:-1:-1;12921:47:0;-1:-1:-1;;;;;12921:24:0;;12946:10;12648:56;12921:24;:47::i;:::-;-1:-1:-1;12982:13:0;;12979:83;;13019:10;;13011:39;;-1:-1:-1;;;;;13019:10:0;;;;13011:39;;;;;13040:9;;13019:10;13011:39;13019:10;13011:39;13040:9;13019:10;13011:39;;;;;;;;;;;;;;;;;;;10979:141;11052:5;;-1:-1:-1;;;;;11052:5:0;11038:10;:19;11030:47;;;;-1:-1:-1;;;11030:47:0;;;;;;;:::i;:::-;11088:17;:24;10979:141::o;15880:3149::-;16027:19;-1:-1:-1;;;;;16072:32:0;;16119:75;-1:-1:-1;;;;;16119:35:0;;16155:10;16175:4;16072:32;16119:35;:75::i;:::-;-1:-1:-1;16207:51:0;-1:-1:-1;;;;;16207:30:0;;10459:42;16247:10;16207:30;:51::i;:::-;-1:-1:-1;10459:42:0;16269:25;16295:10;-1:-1:-1;;;;;;;;;;;16333:10:0;16353:21;:15;16371:3;16353:21;:::i;:::-;16269:107;;-1:-1:-1;;;;;;16269:107:0;;;;;;;-1:-1:-1;;;;;10081:32:1;;;16269:107:0;;;10063:51:1;10150:32;;;10130:18;;;10123:60;10219:32;;10199:18;;;10192:60;10300:14;10288:27;;;10268:18;;;10261:55;10035:19;;16269:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16391:17;16424:11;-1:-1:-1;;;;;16411:24:0;:10;-1:-1:-1;;;;;16411:24:0;;:51;;16451:11;16411:51;;;16438:10;16411:51;16391:71;;16473:17;16506:11;-1:-1:-1;;;;;16493:24:0;:10;-1:-1:-1;;;;;16493:24:0;;:51;;16534:10;16493:51;;;16520:11;16493:51;16473:71;;16555:15;16586:10;-1:-1:-1;;;;;16573:23:0;:9;-1:-1:-1;;;;;16573:23:0;;16555:41;;16809:35;16847:238;;;;;;;;16894:9;-1:-1:-1;;;;;16847:238:0;;;;;16929:9;-1:-1:-1;;;;;16847:238:0;;;;;16958:7;16847:238;;;;;;16993:11;16847:238;;;;;;17034:1;-1:-1:-1;;;;;16847:238:0;;;;16809:276;;17235:21;9061:4;17259:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;17235:65;;17349:20;6617:4;7021;7152;17372:155;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;17372:155:0;;;17574:1;17562:14;;;;;;;;;17372:155;-1:-1:-1;17538:21:0;;17372:155;17562:14;;;;;;;;;;;;;;;;;;;;17538:38;;17674:433;;;;;;;;17735:7;17674:433;;;;17773:10;17674:433;;;;;;17875:10;-1:-1:-1;;;;;17674:433:0;;;;;17967:12;-1:-1:-1;;;;;17674:433:0;;;;;18047:9;;;;;;;;;;;;17674:433;;;17649:469;;;;;;;;:::i;:::-;;;;;;;;;;;;;17637:6;17644:1;17637:9;;;;;;;;:::i;:::-;;;;;;:481;;;;18259:10;18271;18248:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18236:6;18243:1;18236:9;;;;;;;;:::i;:::-;;;;;;:46;;;;18383:11;18396:12;18372:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18360:6;18367:1;18360:9;;;;;;;;:::i;:::-;;;;;;;;;;:49;18448:14;;;18460:1;18448:14;;;;;;;;;18424:21;;18448:14;;;;;;;;;;;;;;;;;;;;18424:38;;18549:7;18558:6;18538:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18526:6;18533:1;18526:9;;;;;;;;:::i;:::-;;;;;;;;;;:39;18607:16;18626:20;:15;18644:2;18626:20;:::i;:::-;18657:70;;-1:-1:-1;;;18657:70:0;;18607:39;;-1:-1:-1;;;;;;;;;;;;10288:42:0;18657;;:70;;18700:8;;18710:6;;18607:39;;18657:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18740:17;18806:5;18785:17;;18761:21;:41;;;;:::i;:::-;18760:51;;;;:::i;:::-;18740:71;-1:-1:-1;18822:18:0;18844:33;18740:71;18844:21;:33;:::i;:::-;18888:40;;18822:55;;-1:-1:-1;18896:10:0;;18888:40;;;;;18822:55;;18888:40;;;;18822:55;18896:10;18888:40;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18942:13:0;;18939:83;;18979:10;;18971:39;;-1:-1:-1;;;;;18979:10:0;;;;18971:39;;;;;19000:9;;18979:10;18971:39;18979:10;18971:39;19000:9;18979:10;18971:39;;;;;;;;;;;;;;;;;;;;;18939:83;16016:3013;;;;;;;;;;;;;15880:3149;;;;;:::o;13081:2740::-;13233:1;13221:9;:13;13213:39;;;;-1:-1:-1;;;13213:39:0;;;;;;;:::i;:::-;13265:17;13319:5;13298:17;;13286:9;:29;;;;:::i;:::-;13285:39;;;;:::i;:::-;13265:59;-1:-1:-1;13335:18:0;13356:21;13265:59;13356:9;:21;:::i;:::-;13335:42;-1:-1:-1;13390:18:0;;-1:-1:-1;;;;;13456:24:0;;:51;;13496:11;13456:51;;;13483:10;13456:51;13436:71;;13518:17;13551:11;-1:-1:-1;;;;;13538:24:0;:10;-1:-1:-1;;;;;13538:24:0;;:51;;13579:10;13538:51;;;13565:11;13538:51;13518:71;;13602:35;13640:238;;;;;;;;13687:9;-1:-1:-1;;;;;13640:238:0;;;;;13722:9;-1:-1:-1;;;;;13640:238:0;;;;;13751:7;13640:238;;;;;;13786:11;13640:238;;;;;;13827:1;-1:-1:-1;;;;;13640:238:0;;;;13602:276;;13961:21;9061:4;13985:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;13961:65;;14075:20;6617:4;7021;7152;14098:155;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;14098:155:0;;;14300:1;14288:14;;;;;;;;;14098:155;-1:-1:-1;14264:21:0;;14098:155;14288:14;;;;;;;;;;;;;;;;;;;;14264:38;;14400:446;;;;;;;;14461:7;14400:446;;;;14512:10;-1:-1:-1;;;;;14499:23:0;:9;-1:-1:-1;;;;;14499:23:0;;14400:446;;;;;;14614:10;-1:-1:-1;;;;;14400:446:0;;;;;14706:12;-1:-1:-1;;;;;14400:446:0;;;;;14786:9;;;;;;;;;;;;14400:446;;;14375:482;;;;;;;;:::i;:::-;;;;;;;;;;;;;14363:6;14370:1;14363:9;;;;;;;;:::i;:::-;;;;;;:494;;;;14998:10;15010;14987:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14975:6;14982:1;14975:9;;;;;;;;:::i;:::-;;;;;;:46;;;;15122:11;15135:12;15111:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15099:6;15106:1;15099:9;;;;;;;;:::i;:::-;;;;;;;;;;:49;15187:14;;;15199:1;15187:14;;;;;;;;;15163:21;;15187:14;;;;;;;;;;;;;;;;;;;;15163:38;;15288:7;15297:6;15277:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15265:6;15272:1;15265:9;;;;;;;;:::i;:::-;;;;;;;;;;:39;15346:16;15365:20;:15;15383:2;15365:20;:::i;:::-;15396:89;;-1:-1:-1;;;15396:89:0;;15346:39;;-1:-1:-1;;;;;;;;;;;;10288:42:0;15396;;15446:10;;15396:89;;15458:8;;15468:6;;15346:39;;15396:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15498:17;15525:11;15498:39;;15548:22;15573:10;-1:-1:-1;;;;;15573:20:0;;15602:4;15573:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15548:60;-1:-1:-1;15622:18:0;;15619:100;;15656:51;-1:-1:-1;;;;;15656:23:0;;15680:10;15692:14;15656:23;:51::i;:::-;;15619:100;15733:13;;15729:85;;15771:10;;15763:39;;-1:-1:-1;;;;;15771:10:0;;;;15763:39;;;;;15792:9;;15771:10;15763:39;15771:10;15763:39;15792:9;15771:10;15763:39;;;;;;;;;;;;;;;;;;;15729:85;13202:2619;;;;;;;;;;;;;13081:2740;;;;:::o;10775:196::-;10856:5;;-1:-1:-1;;;;;10856:5:0;10842:10;:19;10834:47;;;;-1:-1:-1;;;10834:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10900:20:0;;10892:48;;;;-1:-1:-1;;;10892:48:0;;;;;;;:::i;:::-;10951:5;:12;;-1:-1:-1;;;;;;10951:12:0;-1:-1:-1;;;;;10951:12:0;;;;;;;;;;10775:196::o;3345:723::-;3491:4;3513:19;3535:6;-1:-1:-1;;;;;3535:16:0;;3552:5;3535:23;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3513:45;;3601:6;3587:11;:20;:104;;;-1:-1:-1;3644:38:0;;-1:-1:-1;;;3644:38:0;;3685:6;;-1:-1:-1;;;;;3644:16:0;;;;;:38;;3661:5;;3676:4;;3644:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;3587:104;3571:197;;;3751:5;3744:12;;;;;3571:197;3815:84;;-1:-1:-1;;;;;13457:32:1;;;3815:84:0;;;13439:51:1;13526:32;;;13506:18;;;13499:60;13575:18;;;13568:34;;;3780:20:0;;;13412:18:1;;3815:84:0;;;-1:-1:-1;;3815:84:0;;;;;;;;;;;;;;-1:-1:-1;;;;;3815:84:0;-1:-1:-1;;;3815:84:0;;;3780:130;;;3815:84;3780:130;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4037:23:0;;-1:-1:-1;;;4037:23:0;;-1:-1:-1;;;;;4037:16:0;;;-1:-1:-1;4037:16:0;;:23;;4054:5;;4037:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4013:20;4027:6;4013:11;:20;:::i;:::-;:47;4006:54;;;3345:723;;;;;;;:::o;4833:362::-;4921:4;4946:6;-1:-1:-1;;;;;4938:20:0;5024:8;5034:6;4973:68;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4973:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;4973:68:0;-1:-1:-1;;;4973:68:0;;;4938:114;;;4973:68;4938:114;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5136:41:0;;-1:-1:-1;;;5136:41:0;;5181:6;;-1:-1:-1;;;;;;5136:16:0;;;;;:41;;5161:4;;5168:8;;5136:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;5129:58;;4833:362;;;;;;:::o;2373:556::-;2457:4;2474:19;2496:6;-1:-1:-1;;;;;2496:16:0;;2521:4;2496:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2474:53;;2558:6;2544:11;:20;2540:100;;;2623:5;2616:12;;;;;2540:100;2660:6;-1:-1:-1;;;;;2652:20:0;2740:3;2745:6;2687:65;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2687:65:0;;;;;;;;;;;;;;-1:-1:-1;;;;;2687:65:0;-1:-1:-1;;;2687:65:0;;;2652:111;;;2687:65;2652:111;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2890:31:0;;-1:-1:-1;;;2890:31:0;;-1:-1:-1;;;;;2890:16:0;;;-1:-1:-1;2890:16:0;;:31;;2915:4;;2890:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2866:20;2880:6;2866:11;:20;:::i;:::-;:55;;2373:556;-1:-1:-1;;;;;2373:556:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:161::-;259:20;;319:8;308:20;;298:31;;288:59;;343:1;340;333:12;358:493;443:6;451;459;467;520:3;508:9;499:7;495:23;491:33;488:53;;;537:1;534;527:12;488:53;560:29;579:9;560:29;:::i;:::-;550:39;-1:-1:-1;658:2:1;643:18;;630:32;;-1:-1:-1;759:2:1;744:18;;731:32;;-1:-1:-1;808:37:1;841:2;826:18;;808:37;:::i;:::-;798:47;;358:493;;;;;;;:::o;856:186::-;915:6;968:2;956:9;947:7;943:23;939:32;936:52;;;984:1;981;974:12;936:52;1007:29;1026:9;1007:29;:::i;1047:203::-;-1:-1:-1;;;;;1211:32:1;;;;1193:51;;1181:2;1166:18;;1047:203::o;1255:372::-;1331:6;1339;1347;1400:2;1388:9;1379:7;1375:23;1371:32;1368:52;;;1416:1;1413;1406:12;1368:52;1439:29;1458:9;1439:29;:::i;:::-;1429:39;-1:-1:-1;1537:2:1;1522:18;;1509:32;;-1:-1:-1;1584:37:1;1617:2;1602:18;;1584:37;:::i;:::-;1574:47;;1255:372;;;;;:::o;1632:226::-;1691:6;1744:2;1732:9;1723:7;1719:23;1715:32;1712:52;;;1760:1;1757;1750:12;1712:52;-1:-1:-1;1805:23:1;;1632:226;-1:-1:-1;1632:226:1:o;1863:173::-;1931:20;;-1:-1:-1;;;;;1980:31:1;;1970:42;;1960:70;;2026:1;2023;2016:12;2041:160;2107:20;;2167:1;2156:20;;;2146:31;;2136:59;;2191:1;2188;2181:12;2206:478;2298:6;2306;2314;2322;2330;2383:3;2371:9;2362:7;2358:23;2354:33;2351:53;;;2400:1;2397;2390:12;2351:53;2423:29;2442:9;2423:29;:::i;:::-;2413:39;;2471:38;2505:2;2494:9;2490:18;2471:38;:::i;:::-;2461:48;;2528:38;2562:2;2551:9;2547:18;2528:38;:::i;:::-;2518:48;;2585:37;2618:2;2607:9;2603:18;2585:37;:::i;:::-;2575:47;;2641:37;2673:3;2662:9;2658:19;2641:37;:::i;:::-;2631:47;;2206:478;;;;;;;;:::o;2689:403::-;2772:6;2780;2788;2796;2849:3;2837:9;2828:7;2824:23;2820:33;2817:53;;;2866:1;2863;2856:12;2817:53;2889:29;2908:9;2889:29;:::i;:::-;2879:39;;2937:38;2971:2;2960:9;2956:18;2937:38;:::i;:::-;2927:48;;2994:37;3027:2;3016:9;3012:18;2994:37;:::i;:::-;2984:47;;3050:36;3082:2;3071:9;3067:18;3050:36;:::i;3757:127::-;3818:10;3813:3;3809:20;3806:1;3799:31;3849:4;3846:1;3839:15;3873:4;3870:1;3863:15;3889:423;4117:2;4088:15;;;-1:-1:-1;;;;;;4084:45:1;;;4072:58;;4186:3;4164:16;;;;-1:-1:-1;;;;;;4160:41:1;4155:2;4146:12;;4139:63;4236:15;;4232:45;4227:2;4218:12;;4211:67;4303:2;4294:12;;3889:423::o;4317:288::-;4358:3;4396:5;4390:12;4423:6;4418:3;4411:19;4479:6;4472:4;4465:5;4461:16;4454:4;4449:3;4445:14;4439:47;4531:1;4524:4;4515:6;4510:3;4506:16;4502:27;4495:38;4594:4;4587:2;4583:7;4578:2;4570:6;4566:15;4562:29;4557:3;4553:39;4549:50;4542:57;;;4317:288;;;;:::o;4706:557::-;4994:1;4990;4985:3;4981:11;4977:19;4969:6;4965:32;4954:9;4947:51;5034:6;5029:2;5018:9;5014:18;5007:34;5089:4;5081:6;5077:17;5072:2;5061:9;5057:18;5050:45;5131:3;5126:2;5115:9;5111:18;5104:31;4928:4;5152:45;5192:3;5181:9;5177:19;5169:6;5152:45;:::i;:::-;5144:53;;5248:6;5241:14;5234:22;5228:3;5217:9;5213:19;5206:51;4706:557;;;;;;;;:::o;5268:274::-;-1:-1:-1;;;;;5460:32:1;;;;5442:51;;5524:2;5509:18;;5502:34;5430:2;5415:18;;5268:274::o;5547:577::-;5598:3;5629;5661:5;5655:12;5688:6;5683:3;5676:19;5720:4;5715:3;5711:14;5704:21;;5778:4;5768:6;5765:1;5761:14;5754:5;5750:26;5746:37;5817:4;5810:5;5806:16;5840:1;5850:248;5864:6;5861:1;5858:13;5850:248;;;5951:2;5947:7;5939:5;5933:4;5929:16;5925:30;5920:3;5913:43;5977:37;6009:4;6000:6;5994:13;5977:37;:::i;:::-;6049:4;6074:14;;;;5969:45;;-1:-1:-1;6037:17:1;;;;;5886:1;5879:9;5850:248;;;-1:-1:-1;6114:4:1;;5547:577;-1:-1:-1;;;;;;5547:577:1:o;6129:508::-;6400:2;6389:9;6382:21;6363:4;6426:44;6466:2;6455:9;6451:18;6443:6;6426:44;:::i;:::-;6518:9;6510:6;6506:22;6501:2;6490:9;6486:18;6479:50;6546:42;6581:6;6573;6546:42;:::i;:::-;6538:50;;;6624:6;6619:2;6608:9;6604:18;6597:34;6129:508;;;;;;:::o;6994:127::-;7055:10;7050:3;7046:20;7043:1;7036:31;7086:4;7083:1;7076:15;7110:4;7107:1;7100:15;7126:168;7199:9;;;7230;;7247:15;;;7241:22;;7227:37;7217:71;;7268:18;;:::i;:::-;7126:168;;;;:::o;7299:217::-;7339:1;7365;7355:132;;7409:10;7404:3;7400:20;7397:1;7390:31;7444:4;7441:1;7434:15;7472:4;7469:1;7462:15;7355:132;-1:-1:-1;7501:9:1;;7299:217::o;7521:128::-;7588:9;;;7609:11;;;7606:37;;;7623:18;;:::i;7654:339::-;7856:2;7838:21;;;7895:2;7875:18;;;7868:30;-1:-1:-1;;;7929:2:1;7914:18;;7907:45;7984:2;7969:18;;7654:339::o;7998:::-;8200:2;8182:21;;;8239:2;8219:18;;;8212:30;-1:-1:-1;;;8273:2:1;8258:18;;8251:45;8328:2;8313:18;;7998:339::o;8342:337::-;8544:2;8526:21;;;8583:2;8563:18;;;8556:30;-1:-1:-1;;;8617:2:1;8602:18;;8595:43;8670:2;8655:18;;8342:337::o;8970:540::-;9252:1;9248;9243:3;9239:11;9235:19;9227:6;9223:32;9212:9;9205:51;9292:6;9287:2;9276:9;9272:18;9265:34;9335:6;9330:2;9319:9;9315:18;9308:34;9378:3;9373:2;9362:9;9358:18;9351:31;9186:4;9399:45;9439:3;9428:9;9424:19;9416:6;9399:45;:::i;9515:125::-;9580:9;;;9601:10;;;9598:36;;;9614:18;;:::i;9645:184::-;9715:6;9768:2;9756:9;9747:7;9743:23;9739:32;9736:52;;;9784:1;9781;9774:12;9736:52;-1:-1:-1;9807:16:1;;9645:184;-1:-1:-1;9645:184:1:o;10327:207::-;10490:3;10468:16;;;;-1:-1:-1;;;;;;10464:36:1;10452:49;;10526:1;10517:11;;10327:207::o;10539:387::-;-1:-1:-1;;;;;;10750:3:1;10728:16;;;10724:36;;10712:49;;10794:16;;;10790:36;;10786:1;10777:11;;10770:57;10860:16;;10856:36;10852:1;10843:11;;10836:57;10918:1;10909:11;;10539:387::o;10931:104::-;-1:-1:-1;;;;;10997:31:1;10985:44;;10931:104::o;11040:1140::-;11247:2;11229:21;;;11269:13;;11322:9;;-1:-1:-1;;;;;11318:35:1;;;11298:18;;;11291:63;11400:11;;;11394:18;11390:44;;11385:2;11370:18;;;11363:72;;;;11481:11;;;11475:18;11495:8;11471:33;11466:2;11451:18;;;11444:61;;;;11562:11;;11556:18;11553:1;11542:33;11536:3;11521:19;;;11514:62;;;;11623:12;;;11617:19;11613:45;11341:3;11592:19;;11585:74;11694:15;;;11688:22;4680:13;4673:21;11764:3;11749:19;;4661:34;11806:15;;11800:22;-1:-1:-1;;11831:55:1;11881:3;11866:19;;11800:22;11831:55;:::i;:::-;;11935:2;11927:6;11923:15;11917:22;11948:55;11998:3;11987:9;11983:19;11967:14;11948:55;:::i;:::-;;12052:3;12044:6;12040:16;12034:23;12097:6;12088;12077:9;12073:22;12066:38;12121:53;12169:3;12158:9;12154:19;12138:14;12121:53;:::i;12185:300::-;-1:-1:-1;;;;;12377:32:1;;;;12359:51;;-1:-1:-1;;;;;12446:32:1;12441:2;12426:18;;12419:60;12347:2;12332:18;;12185:300::o;12490:437::-;12733:2;12722:9;12715:21;12696:4;12759:44;12799:2;12788:9;12784:18;12776:6;12759:44;:::i;:::-;12851:9;12843:6;12839:22;12834:2;12823:9;12819:18;12812:50;12879:42;12914:6;12906;12879:42;:::i;:::-;12871:50;12490:437;-1:-1:-1;;;;;12490:437:1:o;12932:300::-;-1:-1:-1;;;;;13124:32:1;;;13106:51;;13193:32;;13188:2;13173:18;;13166:60;13094:2;13079:18;;12932:300::o;13613:301::-;13742:3;13780:6;13774:13;13826:6;13819:4;13811:6;13807:17;13802:3;13796:37;13888:1;13852:16;;13877:13;;;-1:-1:-1;13852:16:1;13613:301;-1:-1:-1;13613:301:1:o

Swarm Source

ipfs://36911a7b044b55ca7bc4b7ef722cb2b1ca27a551c1722629eafb4f386fbf0c4b

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.