ETH Price: $1,987.50 (+0.13%)
Gas: 0.04 Gwei
 

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
Withdraw ATF233746422025-09-16 9:10:59154 days ago1758013859IN
0x1Cc22db6...d65ca03EA
0 ETH0.000025880.66519448
Swap ETH For Exa...233096122025-09-07 7:05:35163 days ago1757228735IN
0x1Cc22db6...d65ca03EA
0.00234418 ETH0.000326751.18652198
Swap ETH For Exa...233019692025-09-06 5:27:11164 days ago1757136431IN
0x1Cc22db6...d65ca03EA
0.02382331 ETH0.000374041.18562611
Swap ETH For Exa...233019632025-09-06 5:25:59164 days ago1757136359IN
0x1Cc22db6...d65ca03EA
0.0232825 ETH0.000324621.17874023
Swap Exact ETH F...233013892025-09-06 3:30:23164 days ago1757129423IN
0x1Cc22db6...d65ca03EA
0.01 ETH0.000084030.31239932
Swap ETH For Exa...233000662025-09-05 23:03:47165 days ago1757113427IN
0x1Cc22db6...d65ca03EA
0.00459726 ETH0.000053690.16437066
Deposit ATF232999972025-09-05 22:49:59165 days ago1757112599IN
0x1Cc22db6...d65ca03EA
0 ETH0.000016650.16522456

Latest 13 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer233096122025-09-07 7:05:35163 days ago1757228735
0x1Cc22db6...d65ca03EA
0.00001166 ETH
Transfer233096122025-09-07 7:05:35163 days ago1757228735
0x1Cc22db6...d65ca03EA
0.00001166 ETH
Deposit233096122025-09-07 7:05:35163 days ago1757228735
0x1Cc22db6...d65ca03EA
0.00234418 ETH
Transfer233019692025-09-06 5:27:11164 days ago1757136431
0x1Cc22db6...d65ca03EA
0.00011852 ETH
Transfer233019692025-09-06 5:27:11164 days ago1757136431
0x1Cc22db6...d65ca03EA
0.00011852 ETH
Deposit233019692025-09-06 5:27:11164 days ago1757136431
0x1Cc22db6...d65ca03EA
0.02382331 ETH
Transfer233019632025-09-06 5:25:59164 days ago1757136359
0x1Cc22db6...d65ca03EA
0.00011583 ETH
Transfer233019632025-09-06 5:25:59164 days ago1757136359
0x1Cc22db6...d65ca03EA
0.00011583 ETH
Deposit233019632025-09-06 5:25:59164 days ago1757136359
0x1Cc22db6...d65ca03EA
0.0232825 ETH
Deposit233013892025-09-06 3:30:23164 days ago1757129423
0x1Cc22db6...d65ca03EA
0.01 ETH
Transfer233000662025-09-05 23:03:47165 days ago1757113427
0x1Cc22db6...d65ca03EA
0.00002287 ETH
Transfer233000662025-09-05 23:03:47165 days ago1757113427
0x1Cc22db6...d65ca03EA
0.00002287 ETH
Deposit233000662025-09-05 23:03:47165 days ago1757113427
0x1Cc22db6...d65ca03EA
0.00459726 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:
Router

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
shanghai EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import "./interfaces/IWETH.sol";
import "./interfaces/IRouter.sol";
import "./interfaces/IFactory.sol";
import "./interfaces/IPair.sol";

/// @title Router is used to swap on Antfarm Protocol without having to own ATF tokens
/// @notice This Version only supports ETH swaps and relies on the ATF/ETH Oracle
contract Router is IRouter {
    address public immutable factory;
    address public immutable antfarmToken;
    address public immutable weth;
    address public immutable oraclePair;

    mapping(address => uint256) public userDeposits;
    uint256 public totalDeposits;

    constructor(address _factory, address _weth) {
        factory = _factory;
        antfarmToken = IFactory(factory).protocolToken();
        weth = _weth;
        oraclePair = IFactory(factory).getPair(antfarmToken, weth, uint16(10));
    }

    modifier ensure(uint256 deadline) {
        if (deadline < block.timestamp) revert Router__Expired();
        _;
    }

    receive() external payable {}

    /// @inheritdoc IRouter
    function swapExactETHForTokens(
        address _output,
        uint16 _fee,
        address _to,
        uint256 _deadline,
        uint256 _amountOutMin
    ) external payable ensure(_deadline) returns (uint256 _amountOut) {
        IWETH(weth).deposit{value: msg.value}();

        uint256[] memory amounts = getAmountsOut(msg.value, weth, _output, _fee);

        address pair = IFactory(factory).getPair(weth, _output, _fee);
        (,, uint256 feeToPay) = _getFeeToPay(amounts, weth, _output, pair);

        // Use 'amounts' to store the required WETH to swap for fee ATF tokens
        amounts = _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));

        amounts = getAmountsOut(
            (msg.value * msg.value) / (msg.value + amounts[0]),
            weth,
            _output,
            _fee
        );

        // Checks that the intermediary calculation is already enough
        if (amounts[1] < _amountOutMin) {
            revert Router__InsufficientOutputAmount();
        }

        (uint256 amount0Out, uint256 amount1Out, uint256 finalFeeToPay) =
            _getFeeToPay(amounts, weth, _output, pair);

        _amountOut = amount0Out + amount1Out;

        IERC20(weth).transfer(oraclePair, msg.value - amounts[0]);
        IPair(oraclePair).swap(finalFeeToPay, 0, pair);

        IERC20(weth).transfer(pair, amounts[0]);
        IPair(pair).swap(amount0Out, amount1Out, _to);

        emit SwapExecuted(_to, weth, _output, msg.value, _amountOut);
    }

    /// @inheritdoc IRouter
    function swapExactTokensForETH(
        address _input,
        uint16 _fee,
        address _to,
        uint256 _deadline,
        uint256 _amountIn,
        uint256 _amountOutMin
    ) external ensure(_deadline) returns (uint256 _amountOut) {
        uint256[] memory amounts = getAmountsOut(_amountIn, _input, weth, _fee);
        uint256 standardAmountOut = amounts[1];

        address pair = IFactory(factory).getPair(_input, weth, _fee);

        (uint256 amount0Out, uint256 amount1Out, uint256 feeToPay) =
            _getFeeToPay(amounts, _input, weth, pair);

        if (feeToPay > totalDeposits) {
            revert Router__InsufficientATFBalance();
        }

        amounts = _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));
        if (standardAmountOut - amounts[0] < _amountOutMin) {
            revert Router__InsufficientOutputAmount();
        }

        IERC20(antfarmToken).transfer(pair, feeToPay);
        IERC20(_input).transferFrom(msg.sender, pair, _amountIn);

        IPair(pair).swap(amount0Out, amount1Out, address(this));

        _amountOut = standardAmountOut - amounts[0];

        IERC20(weth).transfer(oraclePair, amounts[0]);
        IPair(oraclePair).swap(feeToPay, 0, address(this));

        IWETH(weth).withdraw(standardAmountOut - amounts[0]);
        _safeTransferETH(_to, standardAmountOut - amounts[0]);

        emit SwapExecuted(_to, _input, weth, _amountIn, _amountOut);
    }

    /// @inheritdoc IRouter
    function swapETHForExactTokens(
        address _output,
        uint16 _fee,
        address _to,
        uint256 _deadline,
        uint256 _amountOut
    ) external payable ensure(_deadline) returns (uint256 _amountIn) {
        // Wrap all received ETH into WETH.
        IWETH(weth).deposit{value: msg.value}();

        uint256[] memory amounts =
            _getAmountsIn(_amountOut, weth, _output, _fee);

        address pair = IFactory(factory).getPair(weth, _output, _fee);
        (uint256 amount0Out, uint256 amount1Out, uint256 feeToPay) =
            _getFeeToPay(amounts, weth, _output, pair);

        _amountIn = amounts[0]; // Temporary storage for the amount of WETH used for main swap
        amounts = _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));

        if (_amountIn + amounts[0] > msg.value) {
            revert Router__InsufficientInputAmount();
        }

        IERC20(weth).transfer(oraclePair, amounts[0]);
        IPair(oraclePair).swap(feeToPay, 0, pair);

        IERC20(weth).transfer(pair, _amountIn);
        IPair(pair).swap(amount0Out, amount1Out, _to);

        _amountIn += amounts[0];

        uint256 refund = msg.value - _amountIn;
        if (refund > 0) {
            IWETH(weth).withdraw(refund);
            _safeTransferETH(msg.sender, refund);
        }

        emit SwapExecuted(_to, weth, _output, _amountIn, _amountOut);
    }

    /// @inheritdoc IRouter
    function estimateExactETHForTokens(
        address _output,
        uint16 _fee,
        uint256 _amountIn
    ) external view returns (uint256 estimatedOut) {
        uint256[] memory amounts = getAmountsOut(_amountIn, weth, _output, _fee);
        address pair = IFactory(factory).getPair(weth, _output, _fee);
        (,, uint256 feeToPay) = _getFeeToPay(amounts, weth, _output, pair);

        uint256[] memory feeInAmounts =
            _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));

        feeInAmounts = getAmountsOut(
            (_amountIn * _amountIn) / (_amountIn + feeInAmounts[0]),
            weth,
            _output,
            _fee
        );

        return feeInAmounts[1];
    }

    /// @inheritdoc IRouter
    function estimateExactTokensForETH(
        address _input,
        uint16 _fee,
        uint256 _amountIn
    ) external view returns (uint256 estimatedOut) {
        uint256[] memory amounts = getAmountsOut(_amountIn, _input, weth, _fee);
        uint256 standardAmountOut = amounts[1];

        address pair = IFactory(factory).getPair(_input, weth, _fee);
        (,, uint256 feeToPay) = _getFeeToPay(amounts, _input, weth, pair);

        amounts = _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));

        return standardAmountOut - amounts[0];
    }

    /// @inheritdoc IRouter
    function estimateETHForExactTokens(
        address _output,
        uint16 _fee,
        uint256 _amountOut
    ) external view returns (uint256 estimatedIn) {
        uint256[] memory amounts =
            _getAmountsIn(_amountOut, weth, _output, _fee);

        address pair = IFactory(factory).getPair(weth, _output, _fee);
        (,, uint256 feeToPay) = _getFeeToPay(amounts, weth, _output, pair);

        // Calculate WETH needed to pay for ATF fees
        uint256[] memory feeInAmounts =
            _getAmountsIn(feeToPay, weth, antfarmToken, uint16(10));

        // Total ETH needed is the amount for the swap plus the amount needed for fees
        return amounts[0] + feeInAmounts[0];
    }

    function getAmountsOut(
        uint256 amountIn,
        address tokenIn,
        address tokenOut,
        uint16 fee
    ) internal view returns (uint256[] memory) {
        uint256[] memory amounts = new uint256[](2);
        amounts[0] = amountIn;
        (uint256 reserveIn, uint256 reserveOut) =
            _getReserves(tokenIn, tokenOut, fee);

        if (tokenIn == antfarmToken) {
            amounts[1] = _getAmountOut(
                (amountIn * 1000) / (1000 + 10), reserveIn, reserveOut
            );
        } else if (tokenOut == antfarmToken) {
            amounts[1] = (_getAmountOut(amountIn, reserveIn, reserveOut) * 1000)
                / (1000 + 10);
        } else {
            amounts[1] = _getAmountOut(amountIn, reserveIn, reserveOut);
        }

        return amounts;
    }

    function _getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256) {
        if (amountIn == 0) revert Router__InsufficientInputAmount();
        if (reserveIn == 0 || reserveOut == 0) {
            revert Router__InsufficientLiquidity();
        }
        uint256 numerator = amountIn * reserveOut;
        uint256 denominator = reserveIn + amountIn;
        return numerator / denominator;
    }

    function _getAmountsIn(
        uint256 amountOut,
        address tokenIn,
        address tokenOut,
        uint16 fee
    ) internal view returns (uint256[] memory) {
        uint256[] memory amounts = new uint256[](2);
        amounts[1] = amountOut;
        (uint256 reserveIn, uint256 reserveOut) =
            _getReserves(tokenIn, tokenOut, fee);
        if (tokenIn == antfarmToken) {
            amounts[0] = (
                _getAmountIn(amountOut, reserveIn, reserveOut) * (1000 + 10)
            ) / 1000;
        } else if (tokenOut == antfarmToken) {
            amounts[0] = _getAmountIn(
                (amountOut * (1000 + 10)) / 1000, reserveIn, reserveOut
            );
        } else {
            amounts[0] = _getAmountIn(amountOut, reserveIn, reserveOut);
        }
        return amounts;
    }

    function _getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256) {
        if (amountOut == 0) revert Router__InsufficientOutputAmount();
        if (reserveIn == 0 || reserveOut == 0 || amountOut >= reserveOut) {
            revert Router__InsufficientLiquidity();
        }
        uint256 numerator = reserveIn * amountOut;
        uint256 denominator = reserveOut - amountOut;
        return (numerator / denominator) + 1;
    }

    function _getFeeToPay(
        uint256[] memory amounts,
        address tokenIn,
        address tokenOut,
        address pair
    )
        internal
        view
        returns (uint256 amount0Out, uint256 amount1Out, uint256 feeToPay)
    {
        // Original fee calculation for non-ATF pairs
        (address token0,) = _sortTokens(tokenIn, tokenOut);
        (amount0Out, amount1Out) = tokenIn == token0
            ? (uint256(0), amounts[1])
            : (amounts[1], uint256(0));

        uint256 amountIn = amounts[0];

        feeToPay = IPair(pair).getFees(
            amount0Out,
            tokenIn == token0 ? amountIn : uint256(0),
            amount1Out,
            tokenIn == token0 ? uint256(0) : amountIn
        );
    }

    function _getReserves(address tokenA, address tokenB, uint16 fee)
        internal
        view
        returns (uint256 reserveA, uint256 reserveB)
    {
        (address token0,) = _sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1,) =
            IPair(IFactory(factory).getPair(tokenA, tokenB, fee)).getReserves();
        (reserveA, reserveB) =
            tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    function _sortTokens(address tokenA, address tokenB)
        internal
        view
        returns (address token0, address token1)
    {
        if (tokenA == tokenB) revert Router__IdenticalAddresses();
        if (tokenA == antfarmToken || tokenB == antfarmToken) {
            (token0, token1) = tokenA == antfarmToken
                ? (antfarmToken, tokenB)
                : (antfarmToken, tokenA);
            if (token1 == address(0)) revert Router__AddressZero();
        } else {
            (token0, token1) =
                tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
            if (token0 == address(0)) revert Router__AddressZero();
        }
    }

    function _safeTransferETH(address to, uint256 value) internal {
        (bool success,) = to.call{value: value}("");
        if (!success) revert Router__ETHTransferFailed();
    }

    function depositATF(uint256 amount) external {
        if (amount == 0) revert Router__ZeroAmount();

        userDeposits[msg.sender] += amount;
        totalDeposits += amount;

        if (
            !IERC20(antfarmToken).transferFrom(msg.sender, address(this), amount)
        ) {
            revert Router__TransferFailed();
        }
    }

    function withdrawATF(uint256 amount) external {
        if (amount == 0) revert Router__ZeroAmount();
        if (amount > userDeposits[msg.sender]) {
            revert Router__InsufficientBalance();
        }

        userDeposits[msg.sender] -= amount;
        totalDeposits -= amount;

        if (!IERC20(antfarmToken).transfer(msg.sender, amount)) {
            revert Router__TransferFailed();
        }
    }

    function getDeposit(address user) external view returns (uint256) {
        return userDeposits[user];
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IWETH {
    // ERC20-like functions
    function deposit() external payable;
    function withdraw(uint256) external;

    // Standard ERC20 functions
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount)
        external
        returns (bool);

    // Events
    event Deposit(address indexed dst, uint256 wad);
    event Withdrawal(address indexed src, uint256 wad);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner, address indexed spender, uint256 value
    );
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/// @title Router Interface for Antfarm Protocol
/// @notice Interface for handling token swaps with ETH on Antfarm Protocol
/// @dev Implements core swap functionality and estimation methods
interface IRouter {
    error Router__Expired();
    error Router__IdenticalAddresses();
    error Router__AddressZero();
    error Router__ZeroAmount();
    error Router__InsufficientLiquidity();
    error Router__InsufficientInputAmount();
    error Router__InsufficientOutputAmount();
    error Router__ETHTransferFailed();
    error Router__InsufficientBalance();
    error Router__InsufficientATFBalance();
    error Router__TransferFailed();

    event SwapExecuted(
        address indexed sender,
        address indexed tokenIn,
        address indexed tokenOut,
        uint256 amountIn,
        uint256 amountOut
    );

    /// @notice Returns the factory contract address
    /// @return Address of the factory contract
    function factory() external view returns (address);

    /// @notice Returns the Antfarm token address
    /// @return Address of the Antfarm token
    function antfarmToken() external view returns (address);

    /// @notice Returns the WETH token address
    /// @return Address of the WETH token
    function weth() external view returns (address);

    /// @notice Returns the oracle pair address
    /// @return Address of the oracle pair
    function oraclePair() external view returns (address);

    /// @notice Allows the contract to receive ETH
    receive() external payable;

    /// @notice Swaps an exact amount of ETH for tokens
    /// @param _output The token address to receive
    /// @param _fee The fee tier of the pool
    /// @param _to The recipient address for the output tokens
    /// @param _deadline The timestamp by which the transaction must be executed
    /// @param _amountOutMin The minimum amount of output tokens to receive
    /// @return _amountOut The actual amount of output tokens received
    function swapExactETHForTokens(
        address _output,
        uint16 _fee,
        address _to,
        uint256 _deadline,
        uint256 _amountOutMin
    ) external payable returns (uint256 _amountOut);

    /// @notice Swaps an exact amount of tokens for ETH
    /// @param _input The token address to spend
    /// @param _fee The fee tier of the pool
    /// @param _to The recipient address for the ETH
    /// @param _deadline The timestamp by which the transaction must be executed
    /// @param _amountIn The amount of input tokens to spend
    /// @param _amountOutMin The minimum amount of ETH to receive
    /// @return _amountOut The actual amount of ETH received
    function swapExactTokensForETH(
        address _input,
        uint16 _fee,
        address _to,
        uint256 _deadline,
        uint256 _amountIn,
        uint256 _amountOutMin
    ) external returns (uint256 _amountOut);

    /// @notice Swaps ETH for an exact amount of tokens
    /// @dev Refunds excess ETH if too much is sent
    /// @param _output The token address to receive
    /// @param _fee The fee tier of the pool
    /// @param _to The recipient address for the tokens
    /// @param _deadline The timestamp by which the transaction must be executed
    /// @param _amountOut The exact amount of output tokens to receive
    /// @return _amountIn The amount of ETH spent
    function swapETHForExactTokens(
        address _output,
        uint16 _fee,
        address _to,
        uint256 _deadline,
        uint256 _amountOut
    ) external payable returns (uint256 _amountIn);

    /// @notice Estimates the output amount of tokens for an exact ETH input
    /// @param _output The token address to receive
    /// @param _fee The fee tier of the pool
    /// @param _amountIn The amount of ETH to swap
    /// @return estimatedOut The estimated amount of output tokens
    function estimateExactETHForTokens(
        address _output,
        uint16 _fee,
        uint256 _amountIn
    ) external view returns (uint256 estimatedOut);

    /// @notice Estimates the output amount of ETH for an exact token input
    /// @param _input The token address to spend
    /// @param _fee The fee tier of the pool
    /// @param _amountIn The amount of input tokens
    /// @return estimatedOut The estimated amount of ETH
    function estimateExactTokensForETH(
        address _input,
        uint16 _fee,
        uint256 _amountIn
    ) external view returns (uint256 estimatedOut);

    /// @notice Estimates the input amount of ETH needed for an exact token output
    /// @param _output The token address to receive
    /// @param _fee The fee tier of the pool
    /// @param _amountOut The exact amount of output tokens desired
    /// @return estimatedIn The estimated amount of ETH needed
    function estimateETHForExactTokens(
        address _output,
        uint16 _fee,
        uint256 _amountOut
    ) external view returns (uint256 estimatedIn);

    /// @notice Deposits ATF tokens
    /// @param amount The amount of ATF tokens to deposit
    function depositATF(uint256 amount) external;

    /// @notice Withdraws ATF tokens
    /// @param amount The amount of ATF tokens to withdraw
    function withdrawATF(uint256 amount) external;

    /// @notice Gets the deposit amount for a user
    /// @param user The address of the user
    /// @return The deposit amount for the user
    function getDeposit(address user) external view returns (uint256);

    /// @notice Returns the deposit amount for a user
    /// @param user The address of the user
    /// @return The deposit amount for the user
    function userDeposits(address user) external view returns (uint256);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint16 fee,
        uint256 allPairsLength
    );

    function possibleFees(uint256) external view returns (uint16);

    function allPairs(uint256) external view returns (address);

    function protocolToken() external view returns (address);

    function getPairs(uint256 startIndex, uint256 numOfPairs)
        external
        view
        returns (address[] memory, uint256);

    function getPair(address tokenA, address tokenB, uint16 fee)
        external
        view
        returns (address pair);

    function feesForPair(address tokenA, address tokenB, uint256)
        external
        view
        returns (uint16);

    function getFeesForPair(address tokenA, address tokenB)
        external
        view
        returns (uint16[8] memory fees);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB, uint16 fee)
        external
        returns (address pair);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IPair {
    error BalanceOverflow();
    error InsufficientFee();
    error InsufficientInputAmount();
    error InsufficientLiquidity();
    error InsufficientLiquidityBurned();
    error InsufficientLiquidityMinted();
    error InsufficientOutputAmount();
    error InvalidReceiver();
    error K();
    error NoBetterOracle();
    error NoOracleFound();
    error SenderNotFactory();
    error SwapAmountTooLow();

    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function antfarmOracle() external view returns (address);
    function antfarmToken() external view returns (address);
    function antfarmTokenReserve() external view returns (uint256);
    function burn(address to, uint256 positionId, uint256 liquidity)
        external
        returns (uint256, uint256);
    function claimDividend(address to, uint256 positionId)
        external
        returns (uint256 claimAmount);
    function claimableDividends(address operator, uint256 positionId)
        external
        view
        returns (uint256 amount);
    function factory() external view returns (address);
    function fee() external view returns (uint16);
    function getFees(
        uint256 amount0Out,
        uint256 amount0In,
        uint256 amount1Out,
        uint256 amount1In
    ) external view returns (uint256 feeToPay);
    function getPositionLP(address operator, uint256 positionId)
        external
        view
        returns (uint128);
    function getReserves()
        external
        view
        returns (
            uint112 _reserve0,
            uint112 _reserve1,
            uint32 _blockTimestampLast
        );
    function initialize(
        address _token0,
        address _token1,
        uint16 _fee,
        address _antfarmToken
    ) external;
    function mint(address to, uint256 positionId) external returns (uint256);
    function positions(address, uint256)
        external
        view
        returns (uint128 lp, uint256 dividend, uint256 lastDividendPoints);
    function scanOracles(uint112 maxReserve)
        external
        view
        returns (address bestOracle);
    function skim(address to) external;
    function swap(uint256 amount0Out, uint256 amount1Out, address to)
        external;
    function sync() external;
    function token0() external view returns (address);
    function token1() external view returns (address);
    function totalSupply() external view returns (uint256);
    function updateOracle() external;
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "viaIR": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Router__AddressZero","type":"error"},{"inputs":[],"name":"Router__ETHTransferFailed","type":"error"},{"inputs":[],"name":"Router__Expired","type":"error"},{"inputs":[],"name":"Router__IdenticalAddresses","type":"error"},{"inputs":[],"name":"Router__InsufficientATFBalance","type":"error"},{"inputs":[],"name":"Router__InsufficientBalance","type":"error"},{"inputs":[],"name":"Router__InsufficientInputAmount","type":"error"},{"inputs":[],"name":"Router__InsufficientLiquidity","type":"error"},{"inputs":[],"name":"Router__InsufficientOutputAmount","type":"error"},{"inputs":[],"name":"Router__TransferFailed","type":"error"},{"inputs":[],"name":"Router__ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"SwapExecuted","type":"event"},{"inputs":[],"name":"antfarmToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositATF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"name":"estimateETHForExactTokens","outputs":[{"internalType":"uint256","name":"estimatedIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"estimateExactETHForTokens","outputs":[{"internalType":"uint256","name":"estimatedOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_input","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"estimateExactTokensForETH","outputs":[{"internalType":"uint256","name":"estimatedOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oraclePair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_output","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_input","type":"address"},{"internalType":"uint16","name":"_fee","type":"uint16"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256","name":"_amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawATF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

61010060405234801562000011575f80fd5b5060405162003b3a38038062003b3a83398181016040528101906200003791906200026c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff16631a465fe16040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000b7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000dd9190620002b1565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff166309175fa760a05160c051600a6040518463ffffffff1660e01b81526004016200018a9392919062000310565b602060405180830381865afa158015620001a6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001cc9190620002b1565b73ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505050506200034b565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000236826200020b565b9050919050565b62000248816200022a565b811462000253575f80fd5b50565b5f8151905062000266816200023d565b92915050565b5f806040838503121562000285576200028462000207565b5b5f620002948582860162000256565b9250506020620002a78582860162000256565b9150509250929050565b5f60208284031215620002c957620002c862000207565b5b5f620002d88482850162000256565b91505092915050565b620002ec816200022a565b82525050565b5f61ffff82169050919050565b6200030a81620002f2565b82525050565b5f606082019050620003255f830186620002e1565b620003346020830185620002e1565b620003436040830184620002ff565b949350505050565b60805160a05160c05160e0516135d1620005695f395f818161098601528181610a2b015281816112930152818161132d015281816115400152818161184701526118e101525f81816103f601528181610420015281816104870152818161050e0152818161053f015281816105c90152818161065e015281816106e001528181610747015281816107ce015281816107fe015281816108880152818161090e0152818161094a01528181610ab501528181610bec01528181610c8a01528181610d1001528181610d9701528181610dc601528181610e8601528181610f0c01528181610f950152818161100101528181611257015281816113b701528181611491015281816115a0015281816116220152818161168901528181611712015281816117610152818161180b0152818161196b01528181611ab001528181611b5801528181611fa30152818161200a0152818161209101526120c201525f81816105600152818161081f01528181610de701528181611022015281816110ab0152818161178201528181611bef01528181611cda01528181611ec9015281816120e30152818161221f015281816122bc015281816125bf0152818161265b01528181612a7e01528181612ad301528181612b2801528181612b7b0152612ba201525f818161044b0152818161070b01528181610cd301528181610ecf0152818161164d01528181611c1301528181611fce01526127e701526135d15ff3fe6080604052600436106100eb575f3560e01c8063adc244ac11610089578063cc03f31711610058578063cc03f31714610318578063d0eac51814610340578063d6cd913714610368578063e1254fba146103a4576100f2565b8063adc244ac1461026a578063b638b1eb14610294578063c12a00a8146102c4578063c45a0155146102ee576100f2565b80637d882097116100c55780637d882097146101985780638e7eed47146101c25780639cb3823a146101f2578063a22e2a091461022e576100f2565b80630ba36dcd146100f65780633fc8cef3146101325780637306efbf1461015c576100f2565b366100f257005b5f80fd5b348015610101575f80fd5b5061011c60048036038101906101179190612e0f565b6103e0565b6040516101299190612e52565b60405180910390f35b34801561013d575f80fd5b506101466103f4565b6040516101539190612e7a565b60405180910390f35b348015610167575f80fd5b50610182600480360381019061017d9190612ef4565b610418565b60405161018f9190612e52565b60405180910390f35b3480156101a3575f80fd5b506101ac61061a565b6040516101b99190612e52565b60405180910390f35b6101dc60048036038101906101d79190612f44565b610620565b6040516101e99190612e52565b60405180910390f35b3480156101fd575f80fd5b5061021860048036038101906102139190612ef4565b610c81565b6040516102259190612e52565b60405180910390f35b348015610239575f80fd5b50610254600480360381019061024f9190612fbb565b610e42565b6040516102619190612e52565b60405180910390f35b348015610275575f80fd5b5061027e61153e565b60405161028b9190612e7a565b60405180910390f35b6102ae60048036038101906102a99190612f44565b611562565b6040516102bb9190612e52565b60405180910390f35b3480156102cf575f80fd5b506102d8611bed565b6040516102e59190612e7a565b60405180910390f35b3480156102f9575f80fd5b50610302611c11565b60405161030f9190612e7a565b60405180910390f35b348015610323575f80fd5b5061033e60048036038101906103399190613044565b611c35565b005b34801561034b575f80fd5b5061036660048036038101906103619190613044565b611dae565b005b348015610373575f80fd5b5061038e60048036038101906103899190612ef4565b611f9b565b60405161039b9190612e52565b60405180910390f35b3480156103af575f80fd5b506103ca60048036038101906103c59190612e0f565b612158565b6040516103d79190612e52565b60405180910390f35b5f602052805f5260405f205f915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f80610446837f0000000000000000000000000000000000000000000000000000000000000000878761219d565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000000000000000000000000000000000000000000088886040518463ffffffff1660e01b81526004016104c69392919061307e565b602060405180830381865afa1580156104e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050591906130c7565b90505f610534837f00000000000000000000000000000000000000000000000000000000000000008985612392565b925050505f610586827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b90506105ef815f8151811061059e5761059d6130f2565b5b6020026020010151876105b1919061314c565b87886105bd919061317f565b6105c791906131ed565b7f00000000000000000000000000000000000000000000000000000000000000008a8a61219d565b905080600181518110610605576106046130f2565b5b60200260200101519450505050509392505050565b60015481565b5f824281101561065c576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b1580156106c2575f80fd5b505af11580156106d4573d5f803e3d5ffd5b50505050505f610706347f00000000000000000000000000000000000000000000000000000000000000008a8a61219d565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa77f00000000000000000000000000000000000000000000000000000000000000008b8b6040518463ffffffff1660e01b81526004016107869392919061307e565b602060405180830381865afa1580156107a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c591906130c7565b90505f6107f4837f00000000000000000000000000000000000000000000000000000000000000008c85612392565b92505050610845817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b92506108ae835f8151811061085d5761085c6130f2565b5b602002602001015134610870919061314c565b343461087c919061317f565b61088691906131ed565b7f00000000000000000000000000000000000000000000000000000000000000008c8c61219d565b925085836001815181106108c5576108c46130f2565b5b60200260200101511015610905576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f610934867f00000000000000000000000000000000000000000000000000000000000000008f88612392565b9250925092508183610946919061314c565b97507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000885f815181106109b8576109b76130f2565b5b6020026020010151346109cb919061321d565b6040518363ffffffff1660e01b81526004016109e8929190613250565b6020604051808303815f875af1158015610a04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2891906132ac565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f886040518463ffffffff1660e01b8152600401610a8693929190613319565b5f604051808303815f87803b158015610a9d575f80fd5b505af1158015610aaf573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86885f81518110610b0357610b026130f2565b5b60200260200101516040518363ffffffff1660e01b8152600401610b28929190613250565b6020604051808303815f875af1158015610b44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6891906132ac565b508473ffffffffffffffffffffffffffffffffffffffff16636d9a640a84848e6040518463ffffffff1660e01b8152600401610ba69392919061334e565b5f604051808303815f87803b158015610bbd575f80fd5b505af1158015610bcf573d5f803e3d5ffd5b505050508c73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f1348c604051610c69929190613383565b60405180910390a45050505050505095945050505050565b5f80610caf83867f00000000000000000000000000000000000000000000000000000000000000008761219d565b90505f81600181518110610cc657610cc56130f2565b5b602002602001015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa7887f0000000000000000000000000000000000000000000000000000000000000000896040518463ffffffff1660e01b8152600401610d4e9392919061307e565b602060405180830381865afa158015610d69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8d91906130c7565b90505f610dbc84897f000000000000000000000000000000000000000000000000000000000000000085612392565b92505050610e0d817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b9350835f81518110610e2257610e216130f2565b5b602002602001015183610e35919061321d565b9450505050509392505050565b5f8342811015610e7e576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610eab858a7f00000000000000000000000000000000000000000000000000000000000000008b61219d565b90505f81600181518110610ec257610ec16130f2565b5b602002602001015190505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa78c7f00000000000000000000000000000000000000000000000000000000000000008d6040518463ffffffff1660e01b8152600401610f4a9392919061307e565b602060405180830381865afa158015610f65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8991906130c7565b90505f805f610fba868f7f000000000000000000000000000000000000000000000000000000000000000087612392565b925092509250600154811115610ffb576040517ea4ac7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611048817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b955088865f8151811061105e5761105d6130f2565b5b602002602001015186611071919061321d565b10156110a9576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401611104929190613250565b6020604051808303815f875af1158015611120573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114491906132ac565b508d73ffffffffffffffffffffffffffffffffffffffff166323b872dd33868d6040518463ffffffff1660e01b8152600401611182939291906133aa565b6020604051808303815f875af115801561119e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c291906132ac565b508373ffffffffffffffffffffffffffffffffffffffff16636d9a640a8484306040518463ffffffff1660e01b81526004016112009392919061334e565b5f604051808303815f87803b158015611217575f80fd5b505af1158015611229573d5f803e3d5ffd5b50505050855f815181106112405761123f6130f2565b5b602002602001015185611253919061321d565b97507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000885f815181106112c5576112c46130f2565b5b60200260200101516040518363ffffffff1660e01b81526004016112ea929190613250565b6020604051808303815f875af1158015611306573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132a91906132ac565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f306040518463ffffffff1660e01b815260040161138893929190613319565b5f604051808303815f87803b15801561139f575f80fd5b505af11580156113b1573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d875f81518110611404576114036130f2565b5b602002602001015187611417919061321d565b6040518263ffffffff1660e01b81526004016114339190612e52565b5f604051808303815f87803b15801561144a575f80fd5b505af115801561145c573d5f803e3d5ffd5b5050505061148f8c875f81518110611477576114766130f2565b5b60200260200101518761148a919061321d565b61272f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f18d8c604051611525929190613383565b60405180910390a4505050505050509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f824281101561159e576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611604575f80fd5b505af1158015611616573d5f803e3d5ffd5b50505050505f611648847f00000000000000000000000000000000000000000000000000000000000000008a8a61253c565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa77f00000000000000000000000000000000000000000000000000000000000000008b8b6040518463ffffffff1660e01b81526004016116c89392919061307e565b602060405180830381865afa1580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170791906130c7565b90505f805f611738857f00000000000000000000000000000000000000000000000000000000000000008e87612392565b925092509250845f81518110611751576117506130f2565b5b602002602001015196506117a8817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b945034855f815181106117be576117bd6130f2565b5b6020026020010151886117d1919061314c565b1115611809576040517f287bcbeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000875f81518110611879576118786130f2565b5b60200260200101516040518363ffffffff1660e01b815260040161189e929190613250565b6020604051808303815f875af11580156118ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118de91906132ac565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f876040518463ffffffff1660e01b815260040161193c93929190613319565b5f604051808303815f87803b158015611953575f80fd5b505af1158015611965573d5f803e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85896040518363ffffffff1660e01b81526004016119c4929190613250565b6020604051808303815f875af11580156119e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a0491906132ac565b508373ffffffffffffffffffffffffffffffffffffffff16636d9a640a84848d6040518463ffffffff1660e01b8152600401611a429392919061334e565b5f604051808303815f87803b158015611a59575f80fd5b505af1158015611a6b573d5f803e3d5ffd5b50505050845f81518110611a8257611a816130f2565b5b602002602001015187611a95919061314c565b96505f8734611aa4919061321d565b90505f811115611b3f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611b079190612e52565b5f604051808303815f87803b158015611b1e575f80fd5b505af1158015611b30573d5f803e3d5ffd5b50505050611b3e338261272f565b5b8c73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f18b8d604051611bd5929190613383565b60405180910390a45050505050505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8103611c6e576040517f98bbadf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611cb9919061314c565b925050819055508060015f828254611cd1919061314c565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d35939291906133aa565b6020604051808303815f875af1158015611d51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7591906132ac565b611dab576040517f09a3166a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f8103611de7576040517f98bbadf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054811115611e5d576040517f2424d0ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ea8919061321d565b925050819055508060015f828254611ec0919061321d565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611f22929190613250565b6020604051808303815f875af1158015611f3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f6291906132ac565b611f98576040517f09a3166a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f80611fc9837f0000000000000000000000000000000000000000000000000000000000000000878761253c565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000000000000000000000000000000000000000000088886040518463ffffffff1660e01b81526004016120499392919061307e565b602060405180830381865afa158015612064573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208891906130c7565b90505f6120b7837f00000000000000000000000000000000000000000000000000000000000000008985612392565b925050505f612109827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600a61253c565b9050805f8151811061211e5761211d6130f2565b5b6020026020010151845f81518110612139576121386130f2565b5b602002602001015161214b919061314c565b9450505050509392505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60605f600267ffffffffffffffff8111156121bb576121ba6133df565b5b6040519080825280602002602001820160405280156121e95781602001602082028036833780820191505090505b50905085815f81518110612200576121ff6130f2565b5b6020026020010181815250505f806122198787876127d3565b915091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036122ba576122956103f26103e88a612284919061317f565b61228e91906131ed565b8383612962565b836001815181106122a9576122a86130f2565b5b602002602001018181525050612384565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612357576103f26103e861231e8a8585612962565b612328919061317f565b61233291906131ed565b83600181518110612346576123456130f2565b5b602002602001018181525050612383565b612362888383612962565b83600181518110612376576123756130f2565b5b6020026020010181815250505b5b829350505050949350505050565b5f805f806123a08787612a15565b5090508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146123f857876001815181106123ea576123e96130f2565b5b60200260200101515f612416565b5f8860018151811061240d5761240c6130f2565b5b60200260200101515b80945081955050505f885f81518110612432576124316130f2565b5b602002602001015190508573ffffffffffffffffffffffffffffffffffffffff16632f725638868473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614612492575f612494565b835b878673ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16146124ce57856124d0565b5f5b6040518563ffffffff1660e01b81526004016124ef949392919061340c565b602060405180830381865afa15801561250a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252e9190613463565b925050509450945094915050565b60605f600267ffffffffffffffff81111561255a576125596133df565b5b6040519080825280602002602001820160405280156125885781602001602082028036833780820191505090505b50905085816001815181106125a05761259f6130f2565b5b6020026020010181815250505f806125b98787876127d3565b915091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612659576103e86103f26126218a8585612ce7565b61262b919061317f565b61263591906131ed565b835f81518110612648576126476130f2565b5b602002602001018181525050612721565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036126f5576126d16103e86103f28a6126c0919061317f565b6126ca91906131ed565b8383612ce7565b835f815181106126e4576126e36130f2565b5b602002602001018181525050612720565b612700888383612ce7565b835f81518110612713576127126130f2565b5b6020026020010181815250505b5b829350505050949350505050565b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051612754906134bb565b5f6040518083038185875af1925050503d805f811461278e576040519150601f19603f3d011682016040523d82523d5f602084013e612793565b606091505b50509050806127ce576040517f72e99d2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f805f6127e08686612a15565b5090505f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166309175fa78989896040518463ffffffff1660e01b81526004016128429392919061307e565b602060405180830381865afa15801561285d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288191906130c7565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156128c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ed919061354b565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461294c57808261294f565b81815b8095508196505050505050935093915050565b5f80840361299c576040517f287bcbeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8314806129a957505f82145b156129e0576040517f041626f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82856129ed919061317f565b90505f85856129fc919061314c565b90508082612a0a91906131ed565b925050509392505050565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a7c576040517f88fa1f7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b2157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612c35577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612ba0577f000000000000000000000000000000000000000000000000000000000000000084612bc3565b7f0000000000000000000000000000000000000000000000000000000000000000835b80925081935050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c30576040517f66fed25500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610612c6f578284612c72565b83835b80925081935050505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cdf576040517f66fed25500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b9250929050565b5f808403612d21576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f831480612d2e57505f82145b80612d395750818410155b15612d70576040517f041626f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8484612d7d919061317f565b90505f8584612d8c919061321d565b905060018183612d9c91906131ed565b612da6919061314c565b925050509392505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612dde82612db5565b9050919050565b612dee81612dd4565b8114612df8575f80fd5b50565b5f81359050612e0981612de5565b92915050565b5f60208284031215612e2457612e23612db1565b5b5f612e3184828501612dfb565b91505092915050565b5f819050919050565b612e4c81612e3a565b82525050565b5f602082019050612e655f830184612e43565b92915050565b612e7481612dd4565b82525050565b5f602082019050612e8d5f830184612e6b565b92915050565b5f61ffff82169050919050565b612ea981612e93565b8114612eb3575f80fd5b50565b5f81359050612ec481612ea0565b92915050565b612ed381612e3a565b8114612edd575f80fd5b50565b5f81359050612eee81612eca565b92915050565b5f805f60608486031215612f0b57612f0a612db1565b5b5f612f1886828701612dfb565b9350506020612f2986828701612eb6565b9250506040612f3a86828701612ee0565b9150509250925092565b5f805f805f60a08688031215612f5d57612f5c612db1565b5b5f612f6a88828901612dfb565b9550506020612f7b88828901612eb6565b9450506040612f8c88828901612dfb565b9350506060612f9d88828901612ee0565b9250506080612fae88828901612ee0565b9150509295509295909350565b5f805f805f8060c08789031215612fd557612fd4612db1565b5b5f612fe289828a01612dfb565b9650506020612ff389828a01612eb6565b955050604061300489828a01612dfb565b945050606061301589828a01612ee0565b935050608061302689828a01612ee0565b92505060a061303789828a01612ee0565b9150509295509295509295565b5f6020828403121561305957613058612db1565b5b5f61306684828501612ee0565b91505092915050565b61307881612e93565b82525050565b5f6060820190506130915f830186612e6b565b61309e6020830185612e6b565b6130ab604083018461306f565b949350505050565b5f815190506130c181612de5565b92915050565b5f602082840312156130dc576130db612db1565b5b5f6130e9848285016130b3565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61315682612e3a565b915061316183612e3a565b92508282019050808211156131795761317861311f565b5b92915050565b5f61318982612e3a565b915061319483612e3a565b92508282026131a281612e3a565b915082820484148315176131b9576131b861311f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6131f782612e3a565b915061320283612e3a565b925082613212576132116131c0565b5b828204905092915050565b5f61322782612e3a565b915061323283612e3a565b925082820390508181111561324a5761324961311f565b5b92915050565b5f6040820190506132635f830185612e6b565b6132706020830184612e43565b9392505050565b5f8115159050919050565b61328b81613277565b8114613295575f80fd5b50565b5f815190506132a681613282565b92915050565b5f602082840312156132c1576132c0612db1565b5b5f6132ce84828501613298565b91505092915050565b5f819050919050565b5f819050919050565b5f6133036132fe6132f9846132d7565b6132e0565b612e3a565b9050919050565b613313816132e9565b82525050565b5f60608201905061332c5f830186612e43565b613339602083018561330a565b6133466040830184612e6b565b949350505050565b5f6060820190506133615f830186612e43565b61336e6020830185612e43565b61337b6040830184612e6b565b949350505050565b5f6040820190506133965f830185612e43565b6133a36020830184612e43565b9392505050565b5f6060820190506133bd5f830186612e6b565b6133ca6020830185612e6b565b6133d76040830184612e43565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60808201905061341f5f830187612e43565b61342c6020830186612e43565b6134396040830185612e43565b6134466060830184612e43565b95945050505050565b5f8151905061345d81612eca565b92915050565b5f6020828403121561347857613477612db1565b5b5f6134858482850161344f565b91505092915050565b5f81905092915050565b50565b5f6134a65f8361348e565b91506134b182613498565b5f82019050919050565b5f6134c58261349b565b9150819050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b6134f1816134cf565b81146134fb575f80fd5b50565b5f8151905061350c816134e8565b92915050565b5f63ffffffff82169050919050565b61352a81613512565b8114613534575f80fd5b50565b5f8151905061354581613521565b92915050565b5f805f6060848603121561356257613561612db1565b5b5f61356f868287016134fe565b9350506020613580868287016134fe565b925050604061359186828701613537565b915050925092509256fea26469706673582212208411fb682160852b8e24395a85c09dabf6d058b4bfde500c6d219f7c3c2ecff464736f6c63430008140033000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x6080604052600436106100eb575f3560e01c8063adc244ac11610089578063cc03f31711610058578063cc03f31714610318578063d0eac51814610340578063d6cd913714610368578063e1254fba146103a4576100f2565b8063adc244ac1461026a578063b638b1eb14610294578063c12a00a8146102c4578063c45a0155146102ee576100f2565b80637d882097116100c55780637d882097146101985780638e7eed47146101c25780639cb3823a146101f2578063a22e2a091461022e576100f2565b80630ba36dcd146100f65780633fc8cef3146101325780637306efbf1461015c576100f2565b366100f257005b5f80fd5b348015610101575f80fd5b5061011c60048036038101906101179190612e0f565b6103e0565b6040516101299190612e52565b60405180910390f35b34801561013d575f80fd5b506101466103f4565b6040516101539190612e7a565b60405180910390f35b348015610167575f80fd5b50610182600480360381019061017d9190612ef4565b610418565b60405161018f9190612e52565b60405180910390f35b3480156101a3575f80fd5b506101ac61061a565b6040516101b99190612e52565b60405180910390f35b6101dc60048036038101906101d79190612f44565b610620565b6040516101e99190612e52565b60405180910390f35b3480156101fd575f80fd5b5061021860048036038101906102139190612ef4565b610c81565b6040516102259190612e52565b60405180910390f35b348015610239575f80fd5b50610254600480360381019061024f9190612fbb565b610e42565b6040516102619190612e52565b60405180910390f35b348015610275575f80fd5b5061027e61153e565b60405161028b9190612e7a565b60405180910390f35b6102ae60048036038101906102a99190612f44565b611562565b6040516102bb9190612e52565b60405180910390f35b3480156102cf575f80fd5b506102d8611bed565b6040516102e59190612e7a565b60405180910390f35b3480156102f9575f80fd5b50610302611c11565b60405161030f9190612e7a565b60405180910390f35b348015610323575f80fd5b5061033e60048036038101906103399190613044565b611c35565b005b34801561034b575f80fd5b5061036660048036038101906103619190613044565b611dae565b005b348015610373575f80fd5b5061038e60048036038101906103899190612ef4565b611f9b565b60405161039b9190612e52565b60405180910390f35b3480156103af575f80fd5b506103ca60048036038101906103c59190612e0f565b612158565b6040516103d79190612e52565b60405180910390f35b5f602052805f5260405f205f915090505481565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b5f80610446837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2878761219d565b90505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288886040518463ffffffff1660e01b81526004016104c69392919061307e565b602060405180830381865afa1580156104e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061050591906130c7565b90505f610534837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28985612392565b925050505f610586827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b90506105ef815f8151811061059e5761059d6130f2565b5b6020026020010151876105b1919061314c565b87886105bd919061317f565b6105c791906131ed565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a61219d565b905080600181518110610605576106046130f2565b5b60200260200101519450505050509392505050565b60015481565b5f824281101561065c576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b1580156106c2575f80fd5b505af11580156106d4573d5f803e3d5ffd5b50505050505f610706347f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a61219d565b90505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b8b6040518463ffffffff1660e01b81526004016107869392919061307e565b602060405180830381865afa1580156107a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c591906130c7565b90505f6107f4837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28c85612392565b92505050610845817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b92506108ae835f8151811061085d5761085c6130f2565b5b602002602001015134610870919061314c565b343461087c919061317f565b61088691906131ed565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28c8c61219d565b925085836001815181106108c5576108c46130f2565b5b60200260200101511015610905576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f610934867f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28f88612392565b9250925092508183610946919061314c565b97507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb885f815181106109b8576109b76130f2565b5b6020026020010151346109cb919061321d565b6040518363ffffffff1660e01b81526004016109e8929190613250565b6020604051808303815f875af1158015610a04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2891906132ac565b507f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb73ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f886040518463ffffffff1660e01b8152600401610a8693929190613319565b5f604051808303815f87803b158015610a9d575f80fd5b505af1158015610aaf573d5f803e3d5ffd5b505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86885f81518110610b0357610b026130f2565b5b60200260200101516040518363ffffffff1660e01b8152600401610b28929190613250565b6020604051808303815f875af1158015610b44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6891906132ac565b508473ffffffffffffffffffffffffffffffffffffffff16636d9a640a84848e6040518463ffffffff1660e01b8152600401610ba69392919061334e565b5f604051808303815f87803b158015610bbd575f80fd5b505af1158015610bcf573d5f803e3d5ffd5b505050508c73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f1348c604051610c69929190613383565b60405180910390a45050505050505095945050505050565b5f80610caf83867f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28761219d565b90505f81600181518110610cc657610cc56130f2565b5b602002602001015190505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa7887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2896040518463ffffffff1660e01b8152600401610d4e9392919061307e565b602060405180830381865afa158015610d69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8d91906130c7565b90505f610dbc84897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc285612392565b92505050610e0d817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b9350835f81518110610e2257610e216130f2565b5b602002602001015183610e35919061321d565b9450505050509392505050565b5f8342811015610e7e576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610eab858a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b61219d565b90505f81600181518110610ec257610ec16130f2565b5b602002602001015190505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa78c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28d6040518463ffffffff1660e01b8152600401610f4a9392919061307e565b602060405180830381865afa158015610f65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f8991906130c7565b90505f805f610fba868f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc287612392565b925092509250600154811115610ffb576040517ea4ac7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611048817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b955088865f8151811061105e5761105d6130f2565b5b602002602001015186611071919061321d565b10156110a9576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85836040518363ffffffff1660e01b8152600401611104929190613250565b6020604051808303815f875af1158015611120573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114491906132ac565b508d73ffffffffffffffffffffffffffffffffffffffff166323b872dd33868d6040518463ffffffff1660e01b8152600401611182939291906133aa565b6020604051808303815f875af115801561119e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c291906132ac565b508373ffffffffffffffffffffffffffffffffffffffff16636d9a640a8484306040518463ffffffff1660e01b81526004016112009392919061334e565b5f604051808303815f87803b158015611217575f80fd5b505af1158015611229573d5f803e3d5ffd5b50505050855f815181106112405761123f6130f2565b5b602002602001015185611253919061321d565b97507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb885f815181106112c5576112c46130f2565b5b60200260200101516040518363ffffffff1660e01b81526004016112ea929190613250565b6020604051808303815f875af1158015611306573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132a91906132ac565b507f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb73ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f306040518463ffffffff1660e01b815260040161138893929190613319565b5f604051808303815f87803b15801561139f575f80fd5b505af11580156113b1573d5f803e3d5ffd5b505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d875f81518110611404576114036130f2565b5b602002602001015187611417919061321d565b6040518263ffffffff1660e01b81526004016114339190612e52565b5f604051808303815f87803b15801561144a575f80fd5b505af115801561145c573d5f803e3d5ffd5b5050505061148f8c875f81518110611477576114766130f2565b5b60200260200101518761148a919061321d565b61272f565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f18d8c604051611525929190613383565b60405180910390a4505050505050509695505050505050565b7f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb81565b5f824281101561159e576040517f4d3620e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015611604575f80fd5b505af1158015611616573d5f803e3d5ffd5b50505050505f611648847f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a61253c565b90505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b8b6040518463ffffffff1660e01b81526004016116c89392919061307e565b602060405180830381865afa1580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170791906130c7565b90505f805f611738857f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28e87612392565b925092509250845f81518110611751576117506130f2565b5b602002602001015196506117a8817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b945034855f815181106117be576117bd6130f2565b5b6020026020010151886117d1919061314c565b1115611809576040517f287bcbeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb875f81518110611879576118786130f2565b5b60200260200101516040518363ffffffff1660e01b815260040161189e929190613250565b6020604051808303815f875af11580156118ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118de91906132ac565b507f0000000000000000000000009dd78ea2b7a92b6cb5d4a495dac34f8641070ceb73ffffffffffffffffffffffffffffffffffffffff16636d9a640a825f876040518463ffffffff1660e01b815260040161193c93929190613319565b5f604051808303815f87803b158015611953575f80fd5b505af1158015611965573d5f803e3d5ffd5b505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85896040518363ffffffff1660e01b81526004016119c4929190613250565b6020604051808303815f875af11580156119e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a0491906132ac565b508373ffffffffffffffffffffffffffffffffffffffff16636d9a640a84848d6040518463ffffffff1660e01b8152600401611a429392919061334e565b5f604051808303815f87803b158015611a59575f80fd5b505af1158015611a6b573d5f803e3d5ffd5b50505050845f81518110611a8257611a816130f2565b5b602002602001015187611a95919061314c565b96505f8734611aa4919061321d565b90505f811115611b3f577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611b079190612e52565b5f604051808303815f87803b158015611b1e575f80fd5b505af1158015611b30573d5f803e3d5ffd5b50505050611b3e338261272f565b5b8c73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f764f0dc063c06f32d89a3f3af80c0db4be8a090901f589a478b447e0a51f09f18b8d604051611bd5929190613383565b60405180910390a45050505050505095945050505050565b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8681565b7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d281565b5f8103611c6e576040517f98bbadf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611cb9919061314c565b925050819055508060015f828254611cd1919061314c565b925050819055507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d35939291906133aa565b6020604051808303815f875af1158015611d51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7591906132ac565b611dab576040517f09a3166a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f8103611de7576040517f98bbadf500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054811115611e5d576040517f2424d0ce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ea8919061321d565b925050819055508060015f828254611ec0919061321d565b925050819055507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611f22929190613250565b6020604051808303815f875af1158015611f3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f6291906132ac565b611f98576040517f09a3166a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f80611fc9837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2878761253c565b90505f7f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa77f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc288886040518463ffffffff1660e01b81526004016120499392919061307e565b602060405180830381865afa158015612064573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208891906130c7565b90505f6120b7837f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28985612392565b925050505f612109827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86600a61253c565b9050805f8151811061211e5761211d6130f2565b5b6020026020010151845f81518110612139576121386130f2565b5b602002602001015161214b919061314c565b9450505050509392505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60605f600267ffffffffffffffff8111156121bb576121ba6133df565b5b6040519080825280602002602001820160405280156121e95781602001602082028036833780820191505090505b50905085815f81518110612200576121ff6130f2565b5b6020026020010181815250505f806122198787876127d3565b915091507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036122ba576122956103f26103e88a612284919061317f565b61228e91906131ed565b8383612962565b836001815181106122a9576122a86130f2565b5b602002602001018181525050612384565b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1603612357576103f26103e861231e8a8585612962565b612328919061317f565b61233291906131ed565b83600181518110612346576123456130f2565b5b602002602001018181525050612383565b612362888383612962565b83600181518110612376576123756130f2565b5b6020026020010181815250505b5b829350505050949350505050565b5f805f806123a08787612a15565b5090508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146123f857876001815181106123ea576123e96130f2565b5b60200260200101515f612416565b5f8860018151811061240d5761240c6130f2565b5b60200260200101515b80945081955050505f885f81518110612432576124316130f2565b5b602002602001015190508573ffffffffffffffffffffffffffffffffffffffff16632f725638868473ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614612492575f612494565b835b878673ffffffffffffffffffffffffffffffffffffffff168d73ffffffffffffffffffffffffffffffffffffffff16146124ce57856124d0565b5f5b6040518563ffffffff1660e01b81526004016124ef949392919061340c565b602060405180830381865afa15801561250a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252e9190613463565b925050509450945094915050565b60605f600267ffffffffffffffff81111561255a576125596133df565b5b6040519080825280602002602001820160405280156125885781602001602082028036833780820191505090505b50905085816001815181106125a05761259f6130f2565b5b6020026020010181815250505f806125b98787876127d3565b915091507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612659576103e86103f26126218a8585612ce7565b61262b919061317f565b61263591906131ed565b835f81518110612648576126476130f2565b5b602002602001018181525050612721565b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036126f5576126d16103e86103f28a6126c0919061317f565b6126ca91906131ed565b8383612ce7565b835f815181106126e4576126e36130f2565b5b602002602001018181525050612720565b612700888383612ce7565b835f81518110612713576127126130f2565b5b6020026020010181815250505b5b829350505050949350505050565b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051612754906134bb565b5f6040518083038185875af1925050503d805f811461278e576040519150601f19603f3d011682016040523d82523d5f602084013e612793565b606091505b50509050806127ce576040517f72e99d2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b5f805f6127e08686612a15565b5090505f807f000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d273ffffffffffffffffffffffffffffffffffffffff166309175fa78989896040518463ffffffff1660e01b81526004016128429392919061307e565b602060405180830381865afa15801561285d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288191906130c7565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156128c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ed919061354b565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691508273ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461294c57808261294f565b81815b8095508196505050505050935093915050565b5f80840361299c576040517f287bcbeb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8314806129a957505f82145b156129e0576040517f041626f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82856129ed919061317f565b90505f85856129fc919061314c565b90508082612a0a91906131ed565b925050509392505050565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a7c576040517f88fa1f7100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b2157507f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15612c35577f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612ba0577f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba8684612bc3565b7f000000000000000000000000695f775551fb0d28b64101c9507c06f334b4ba86835b80925081935050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c30576040517f66fed25500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ce0565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610612c6f578284612c72565b83835b80925081935050505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612cdf576040517f66fed25500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b9250929050565b5f808403612d21576040517f4e65335400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f831480612d2e57505f82145b80612d395750818410155b15612d70576040517f041626f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8484612d7d919061317f565b90505f8584612d8c919061321d565b905060018183612d9c91906131ed565b612da6919061314c565b925050509392505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612dde82612db5565b9050919050565b612dee81612dd4565b8114612df8575f80fd5b50565b5f81359050612e0981612de5565b92915050565b5f60208284031215612e2457612e23612db1565b5b5f612e3184828501612dfb565b91505092915050565b5f819050919050565b612e4c81612e3a565b82525050565b5f602082019050612e655f830184612e43565b92915050565b612e7481612dd4565b82525050565b5f602082019050612e8d5f830184612e6b565b92915050565b5f61ffff82169050919050565b612ea981612e93565b8114612eb3575f80fd5b50565b5f81359050612ec481612ea0565b92915050565b612ed381612e3a565b8114612edd575f80fd5b50565b5f81359050612eee81612eca565b92915050565b5f805f60608486031215612f0b57612f0a612db1565b5b5f612f1886828701612dfb565b9350506020612f2986828701612eb6565b9250506040612f3a86828701612ee0565b9150509250925092565b5f805f805f60a08688031215612f5d57612f5c612db1565b5b5f612f6a88828901612dfb565b9550506020612f7b88828901612eb6565b9450506040612f8c88828901612dfb565b9350506060612f9d88828901612ee0565b9250506080612fae88828901612ee0565b9150509295509295909350565b5f805f805f8060c08789031215612fd557612fd4612db1565b5b5f612fe289828a01612dfb565b9650506020612ff389828a01612eb6565b955050604061300489828a01612dfb565b945050606061301589828a01612ee0565b935050608061302689828a01612ee0565b92505060a061303789828a01612ee0565b9150509295509295509295565b5f6020828403121561305957613058612db1565b5b5f61306684828501612ee0565b91505092915050565b61307881612e93565b82525050565b5f6060820190506130915f830186612e6b565b61309e6020830185612e6b565b6130ab604083018461306f565b949350505050565b5f815190506130c181612de5565b92915050565b5f602082840312156130dc576130db612db1565b5b5f6130e9848285016130b3565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61315682612e3a565b915061316183612e3a565b92508282019050808211156131795761317861311f565b5b92915050565b5f61318982612e3a565b915061319483612e3a565b92508282026131a281612e3a565b915082820484148315176131b9576131b861311f565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6131f782612e3a565b915061320283612e3a565b925082613212576132116131c0565b5b828204905092915050565b5f61322782612e3a565b915061323283612e3a565b925082820390508181111561324a5761324961311f565b5b92915050565b5f6040820190506132635f830185612e6b565b6132706020830184612e43565b9392505050565b5f8115159050919050565b61328b81613277565b8114613295575f80fd5b50565b5f815190506132a681613282565b92915050565b5f602082840312156132c1576132c0612db1565b5b5f6132ce84828501613298565b91505092915050565b5f819050919050565b5f819050919050565b5f6133036132fe6132f9846132d7565b6132e0565b612e3a565b9050919050565b613313816132e9565b82525050565b5f60608201905061332c5f830186612e43565b613339602083018561330a565b6133466040830184612e6b565b949350505050565b5f6060820190506133615f830186612e43565b61336e6020830185612e43565b61337b6040830184612e6b565b949350505050565b5f6040820190506133965f830185612e43565b6133a36020830184612e43565b9392505050565b5f6060820190506133bd5f830186612e6b565b6133ca6020830185612e6b565b6133d76040830184612e43565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60808201905061341f5f830187612e43565b61342c6020830186612e43565b6134396040830185612e43565b6134466060830184612e43565b95945050505050565b5f8151905061345d81612eca565b92915050565b5f6020828403121561347857613477612db1565b5b5f6134858482850161344f565b91505092915050565b5f81905092915050565b50565b5f6134a65f8361348e565b91506134b182613498565b5f82019050919050565b5f6134c58261349b565b9150819050919050565b5f6dffffffffffffffffffffffffffff82169050919050565b6134f1816134cf565b81146134fb575f80fd5b50565b5f8151905061350c816134e8565b92915050565b5f63ffffffff82169050919050565b61352a81613512565b8114613534575f80fd5b50565b5f8151905061354581613521565b92915050565b5f805f6060848603121561356257613561612db1565b5b5f61356f868287016134fe565b9350506020613580868287016134fe565b925050604061359186828701613537565b915050925092509256fea26469706673582212208411fb682160852b8e24395a85c09dabf6d058b4bfde500c6d219f7c3c2ecff464736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

-----Decoded View---------------
Arg [0] : _factory (address): 0xAcff9eee0a5522000E7141b77107359A6462E8d2
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000acff9eee0a5522000e7141b77107359a6462e8d2
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2


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.