ETH Price: $1,813.38 (+10.34%)
Gas: 0.11 GWei

Contract

0x2205ebb740c7c98eD52cf7F0FC302EB8a4afD5a4

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0 ETH

ETH Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Swap Exact Token...12081902023-12-14 12:53:37496 days ago1702558417IN
0x2205ebb7...8a4afD5a4
0 ETH0.000583343.27140295
Swap ETH For Exa...12049752023-12-14 7:32:07496 days ago1702539127IN
0x2205ebb7...8a4afD5a4
0.00975754 ETH0.000527653.77153544
Swap ETH For Exa...12049672023-12-14 7:31:19496 days ago1702539079IN
0x2205ebb7...8a4afD5a4
0.00933142 ETH0.000553843.7705313
Swap Exact Token...11964572023-12-13 17:20:19496 days ago1702488019IN
0x2205ebb7...8a4afD5a4
0 ETH0.0007374.83429008
Remove Liquidity11957842023-12-13 16:13:01496 days ago1702483981IN
0x2205ebb7...8a4afD5a4
0 ETH0.00086584.63782261
Swap Exact Token...11956402023-12-13 15:58:37496 days ago1702483117IN
0x2205ebb7...8a4afD5a4
0 ETH0.000768314.19143943
Swap Exact Token...11955962023-12-13 15:54:13496 days ago1702482853IN
0x2205ebb7...8a4afD5a4
0 ETH0.000604814.09582122
Swap Exact Token...11955632023-12-13 15:50:55496 days ago1702482655IN
0x2205ebb7...8a4afD5a4
0 ETH0.00055174.0231154
Swap Exact Token...11955452023-12-13 15:49:07496 days ago1702482547IN
0x2205ebb7...8a4afD5a4
0 ETH0.000610254.00253962
Swap Exact Token...11955322023-12-13 15:47:49496 days ago1702482469IN
0x2205ebb7...8a4afD5a4
0 ETH0.000607853.98680413
Swap Exact Token...11955242023-12-13 15:47:01496 days ago1702482421IN
0x2205ebb7...8a4afD5a4
0 ETH0.000587833.98086285
Swap Exact Token...11955082023-12-13 15:45:25496 days ago1702482325IN
0x2205ebb7...8a4afD5a4
0 ETH0.000565683.83087203
Swap Exact Token...11955052023-12-13 15:45:07496 days ago1702482307IN
0x2205ebb7...8a4afD5a4
0 ETH0.000564923.82572722
Swap Exact Token...11955052023-12-13 15:45:07496 days ago1702482307IN
0x2205ebb7...8a4afD5a4
0 ETH0.000564923.82572722
Swap Exact Token...11954472023-12-13 15:39:19496 days ago1702481959IN
0x2205ebb7...8a4afD5a4
0 ETH0.000575963.90043618
Swap Exact Token...11954262023-12-13 15:37:13496 days ago1702481833IN
0x2205ebb7...8a4afD5a4
0 ETH0.000593243.89133594
Swap Exact ETH F...11954212023-12-13 15:36:43496 days ago1702481803IN
0x2205ebb7...8a4afD5a4
0.007 ETH0.000530913.88820306
Swap Exact Token...11954142023-12-13 15:36:01496 days ago1702481761IN
0x2205ebb7...8a4afD5a4
0 ETH0.000546363.7
Swap Exact ETH F...11954052023-12-13 15:35:07496 days ago1702481707IN
0x2205ebb7...8a4afD5a4
0.0123 ETH0.000597393.8878614
Swap Exact ETH F...11954042023-12-13 15:35:01496 days ago1702481701IN
0x2205ebb7...8a4afD5a4
0.0121 ETH0.000597373.88802123
Swap Exact ETH F...11953992023-12-13 15:34:31496 days ago1702481671IN
0x2205ebb7...8a4afD5a4
0.0122 ETH0.00059733.8872872
Swap Exact ETH F...11953842023-12-13 15:33:01496 days ago1702481581IN
0x2205ebb7...8a4afD5a4
0.007685 ETH0.000596743.88393167
Swap Exact ETH F...11953832023-12-13 15:32:55496 days ago1702481575IN
0x2205ebb7...8a4afD5a4
0.00778 ETH0.000596783.88393167
Swap Exact ETH F...11953782023-12-13 15:32:25496 days ago1702481545IN
0x2205ebb7...8a4afD5a4
0.008 ETH0.000596713.88344523
Swap Exact ETH F...11953752023-12-13 15:32:07496 days ago1702481527IN
0x2205ebb7...8a4afD5a4
0.0079978 ETH0.000596413.8814695
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
122605022024-11-19 11:26:01155 days ago1732015561
0x2205ebb7...8a4afD5a4
0 ETH
122605022024-11-19 11:26:01155 days ago1732015561
0x2205ebb7...8a4afD5a4
0 ETH
122605022024-11-19 11:26:01155 days ago1732015561
0x2205ebb7...8a4afD5a4
0 ETH
88641412024-08-31 22:00:50234 days ago1725141650
0x2205ebb7...8a4afD5a4
0 ETH
88641412024-08-31 22:00:50234 days ago1725141650
0x2205ebb7...8a4afD5a4
0 ETH
88641412024-08-31 22:00:50234 days ago1725141650
0x2205ebb7...8a4afD5a4
0 ETH
65635352024-07-09 13:04:36288 days ago1720530276
0x2205ebb7...8a4afD5a4
0 ETH
65635352024-07-09 13:04:36288 days ago1720530276
0x2205ebb7...8a4afD5a4
0 ETH
65635352024-07-09 13:04:36288 days ago1720530276
0x2205ebb7...8a4afD5a4
0 ETH
56885132024-06-19 6:32:48308 days ago1718778768
0x2205ebb7...8a4afD5a4
0 ETH
56885132024-06-19 6:32:48308 days ago1718778768
0x2205ebb7...8a4afD5a4
0 ETH
56885132024-06-19 6:32:48308 days ago1718778768
0x2205ebb7...8a4afD5a4
0 ETH
56885042024-06-19 6:32:30308 days ago1718778750
0x2205ebb7...8a4afD5a4
0 ETH
56885042024-06-19 6:32:30308 days ago1718778750
0x2205ebb7...8a4afD5a4
0 ETH
56885042024-06-19 6:32:30308 days ago1718778750
0x2205ebb7...8a4afD5a4
0 ETH
56868052024-06-19 5:35:51308 days ago1718775351
0x2205ebb7...8a4afD5a4
0 ETH
56868052024-06-19 5:35:51308 days ago1718775351
0x2205ebb7...8a4afD5a4
0 ETH
56868052024-06-19 5:35:51308 days ago1718775351
0x2205ebb7...8a4afD5a4
0 ETH
56868052024-06-19 5:35:51308 days ago1718775351
0x2205ebb7...8a4afD5a4
0 ETH
56868052024-06-19 5:35:51308 days ago1718775351
0x2205ebb7...8a4afD5a4
0 ETH
56868052024-06-19 5:35:51308 days ago1718775351
0x2205ebb7...8a4afD5a4
0 ETH
56867972024-06-19 5:35:35308 days ago1718775335
0x2205ebb7...8a4afD5a4
0 ETH
56867972024-06-19 5:35:35308 days ago1718775335
0x2205ebb7...8a4afD5a4
0 ETH
56867972024-06-19 5:35:35308 days ago1718775335
0x2205ebb7...8a4afD5a4
0 ETH
56867402024-06-19 5:33:41308 days ago1718775221
0x2205ebb7...8a4afD5a4
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XfaiV0Periphery03

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, BSL 1.1 license

Contract Source Code (Solidity Multiple files format)

File 1 of 15: XfaiV0Periphery03.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

import './XfaiLibrary.sol';
import './TransferHelper.sol';

import './IXfaiV0Core.sol';
import './IXfaiPool.sol';
import './IXfaiV0Periphery03.sol';
import './IXfaiFactory.sol';
import './IXfaiINFT.sol';
import './IERC20.sol';
import './IWETH.sol';

/**
 * @title Xfai's Xfai Periphery Contract
 * @author Xfai
 * @notice XfaiV0Periphery03 performs the necessary high level safety checks to interact with XfaiV0Core. It does not store any pool related state.
 */
contract XfaiV0Periphery03 is IXfaiV0Periphery03 {
  /**
   * @notice The factory address of Xfai
   */
  address private immutable factory;

  /**
   * @notice The address of the XfaiV0Core contract
   */
  address private immutable core;

  /**
   * @notice The weth address.
   * @dev In the case of a chain ID other than Ethereum, the wrapped ERC20 token address of the chain's native coin
   */
  address private immutable weth;

  /**
   * @notice The code hash od XfaiPool
   * @dev keccak256(type(XfaiPool).creationCode)
   */
  bytes32 private immutable poolCodeHash;

  modifier ensure(uint deadline) {
    require(deadline >= block.timestamp, 'XfaiV0Periphery03: EXPIRED');
    _;
  }

  /**
   * @notice XfaiV0Periphery03 constructor
   * @param _factory The factory address of Xfai
   * @param _weth The weth address
   */
  constructor(address _factory, address _weth) {
    factory = _factory;
    core = IXfaiFactory(_factory).getXfaiCore();
    weth = _weth;
    poolCodeHash = IXfaiFactory(_factory).poolCodeHash();
  }

  receive() external payable {
    assert(msg.sender == weth); // only accept ETH via fallback from the weth contract
  }

  // **** ADD LIQUIDITY ****

  function _getLiquidityAmounts(
    address _token,
    uint _amountTokenDesired,
    uint _amountWETHDesired,
    uint _amountTokenMin,
    uint _amountWETHMin
  ) internal returns (uint amountToken, uint amountWETH) {
    address pool = IXfaiFactory(factory).getPool(_token);
    if (pool == address(0)) {
      // create the pool if it doesn't exist yet
      pool = IXfaiFactory(factory).createPool(_token);
    }
    (uint reserve, uint weight) = IXfaiPool(pool).getStates();
    if (reserve == 0 && weight == 0) {
      (amountToken, amountWETH) = (_amountTokenDesired, _amountWETHDesired);
    } else {
      uint amountWETHOptimal = XfaiLibrary.quote(_amountTokenDesired, weight, reserve);
      if (amountWETHOptimal <= _amountWETHDesired) {
        require(amountWETHOptimal >= _amountWETHMin, 'XfaiV0Periphery03: INSUFFICIENT_1_AMOUNT');
        (amountToken, amountWETH) = (_amountTokenDesired, amountWETHOptimal);
      } else {
        uint amountTokenOptimal = XfaiLibrary.quote(_amountWETHDesired, reserve, weight);
        assert(amountTokenOptimal <= _amountTokenDesired);
        require(amountTokenOptimal >= _amountTokenMin, 'XfaiV0Periphery03: INSUFFICIENT_0_AMOUNT');
        (amountToken, amountWETH) = (amountTokenOptimal, _amountWETHDesired);
      }
    }
  }

  /**
   * @notice Provide two-sided liquidity to a pool
   * @dev Requires _token approval. A given amount of _token and ETH get consumed and a given amount of liquidity tokens is minted
   * @param _to The address of the recipient
   * @param _token An ERC20 token address
   * @param _amountTokenDesired The input amount of _token to be provided
   * @param _amountTokenMin The minimal amount that the user will accept for _amountTokenDesired
   * @param _amountETHMin The minimal amount that the user will accept for the provided ETH
   * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically
   */
  function addLiquidity(
    address _to,
    address _token,
    uint _amountTokenDesired,
    uint _amountTokenMin,
    uint _amountETHMin,
    uint _deadline
  ) external payable override ensure(_deadline) returns (uint liquidity) {
    address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash);
    (uint amount0, uint amount1) = _getLiquidityAmounts(
      _token,
      _amountTokenDesired,
      msg.value,
      _amountTokenMin,
      _amountETHMin
    );
    TransferHelper.safeTransferFrom(_token, msg.sender, pool, amount0);
    IWETH(weth).deposit{value: amount1}();
    TransferHelper.safeTransfer(weth, pool, amount1);
    liquidity = IXfaiV0Core(core).mint(_token, _to);
    // refund dust eth, if any
    if (msg.value > amount1) TransferHelper.safeTransferETH(msg.sender, msg.value - amount1);
  }

  // **** REMOVE LIQUIDITY ****

  function _removeLiquidity(
    address _token0,
    address _token1,
    uint _liquidity,
    uint _amount0Min,
    uint _amount1Min,
    address _to
  ) private returns (uint amount0, uint amount1) {
    address _core = core; // gas saving
    address pool = XfaiLibrary.poolFor(_token0, factory, poolCodeHash);
    TransferHelper.safeTransferFrom(pool, msg.sender, _core, _liquidity);
    (amount0, amount1) = IXfaiV0Core(_core).burn(_token0, _token1, _to);
    require(amount0 >= _amount0Min, 'XfaiV0Periphery03: INSUFFICIENT_AMOUNT0');
    require(amount1 >= _amount1Min, 'XfaiV0Periphery03: INSUFFICIENT_AMOUNT1');
  }

  function _removeLiquidityOptions(
    address _to,
    address _token0,
    address _token1,
    uint _liquidity,
    uint _amount0Min,
    uint _amount1Min
  ) private returns (uint amount0, uint amount1) {
    address wrappedETH = weth; // gas saving
    require(_token0 != wrappedETH, 'XfaiV0Periphery03: INVALID_TOKEN');
    if (_token1 == wrappedETH) {
      (amount0, amount1) = _removeLiquidity(
        _token0,
        wrappedETH,
        _liquidity,
        _amount0Min,
        _amount1Min,
        address(this)
      );
      IWETH(wrappedETH).withdraw(amount1);
      TransferHelper.safeTransferETH(_to, amount1);
      TransferHelper.safeTransfer(_token0, _to, amount0);
    } else {
      (amount0, amount1) = _removeLiquidity(
        _token0,
        _token1,
        _liquidity,
        _amount0Min,
        _amount1Min,
        _to
      );
    }
  }

  /**
   * @notice Remove liquidity from pool0
   * @dev Requires approval of the pool's liquidity token. At the end of the function call, a given amount of LP tokens are burned, and a given amount of _token0 and _token1 are returned to the recipient.
   * @param _to The address of the recipient
   * @param _token0 The address of an ERC20 token
   * @param _token1 The address of an ERC20 token
   * @param _liquidity The amount of LP tokens to be burned
   * @param _amount0Min The minimal amount of _token that the user will accept for a given amount of _liquidity
   * @param _amount1Min The minimal amount of _token that the user will accept for a given amount of _liquidity
   * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically
   * @return amount0 The amount of _token that are returned to the recipient
   * @return amount1 The amount of ether that are returned to the recipient
   */
  function removeLiquidity(
    address _to,
    address _token0,
    address _token1,
    uint _liquidity,
    uint _amount0Min,
    uint _amount1Min,
    uint _deadline
  ) external override ensure(_deadline) returns (uint amount0, uint amount1) {
    (amount0, amount1) = _removeLiquidityOptions(
      _to,
      _token0,
      _token1,
      _liquidity,
      _amount0Min,
      _amount1Min
    );
  }

  // **** SWAP ****
  // requires the initial amount to have already been sent to the primary pool
  function _swap(
    address _token0,
    address _token1,
    address _to
  ) internal returns (uint input, uint output) {
    (input, output) = IXfaiV0Core(core).swap(_token0, _token1, _to);
  }

  /**
   * @notice Swap an exact amount of one ERC20 token (_token0) for another one (_token1)
   * @dev Requires _token0  approval. At the end of the function call, an amount _amount0In of _token0 is deposited into Xfai, and a given amount (larger than _amount1OutMin) of _token1 is returned to the recipient.
   * @param _to The address of the recipient
   * @param _token0 An ERC20 token address
   * @param _token1 An ERC20 token address
   * @param _amount0In The amount of _token0 to be swapped
   * @param _amount1OutMin The minimal amount of _token1 that the user will accept for a given amount of _amount0In
   * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically
   */
  function swapExactTokensForTokens(
    address _to,
    address _token0,
    address _token1,
    uint _amount0In,
    uint _amount1OutMin,
    uint _deadline
  ) external override ensure(_deadline) returns (uint) {
    address pool;
    if (_token0 == weth) {
      pool = XfaiLibrary.poolFor(_token1, factory, poolCodeHash);
    } else {
      pool = XfaiLibrary.poolFor(_token0, factory, poolCodeHash);
    }
    TransferHelper.safeTransferFrom(_token0, msg.sender, pool, _amount0In);
    (, uint amount1Out) = _swap(_token0, _token1, _to);
    require(amount1Out >= _amount1OutMin, 'XfaiV0Periphery03: INSUFFICIENT_OUTPUT_AMOUNT');
    return amount1Out;
  }

  /**
   * @notice Swap an amount of one ERC20 token (_token0) for an exact amount of another one (_token1)
   * @dev Requires _token0  approval. At the end of the function call, an amount (smaller than _amount0InMax) of _token0 is deposited into xfai, and an amount _amount1Out og _token1 is returned to the recipient.
   * @param _to The address of the recipient
   * @param _token0 An ERC20 token address
   * @param _token1 An ERC20 token address
   * @param _amount1Out The amount of _token1 that one wants to receive
   * @param _amount0InMax The maximal amount of _token0 that the user is willing to trade for a given amount of _amount1Out
   * @param _deadline The UTC timestamp that if reached, causes the swap transaction to fail automatically
   */
  function swapTokensForExactTokens(
    address _to,
    address _token0,
    address _token1,
    uint _amount1Out,
    uint _amount0InMax,
    uint _deadline
  ) external override ensure(_deadline) returns (uint amount0In) {
    address pool0;
    address pool1;
    if (_token0 == weth) {
      pool0 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash);
      pool1 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash);
      (uint r, uint w) = IXfaiPool(pool0).getStates();
      amount0In = XfaiLibrary.getAmountIn(w, r, _amount1Out, IXfaiV0Core(core).getTotalFee());
    } else if (_token1 == weth) {
      pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash);
      (uint r, uint w) = IXfaiPool(pool0).getStates();
      amount0In = XfaiLibrary.getAmountIn(r, w, _amount1Out, IXfaiV0Core(core).getTotalFee());
    } else {
      pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash);
      pool1 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash);
      amount0In = XfaiLibrary.getAmountsIn(
        pool0,
        pool1,
        _amount1Out,
        IXfaiV0Core(core).getTotalFee()
      );
    }
    require(amount0In <= _amount0InMax, 'XfaiV0Periphery03: INSUFFICIENT_INPUT_AMOUNT');
    TransferHelper.safeTransferFrom(_token0, msg.sender, pool0, amount0In);
    _swap(_token0, _token1, _to);
  }

  /**
   * @notice Swap an exact amount of ether for an ERC20 token (_token1)
   * @dev At the end of the function call, an exact amount of ether is deposited into Xfai, and a given amount (larger than _amount1OutMin) of _token1 is returned to the recipient.
   * @param _to The address of the recipient
   * @param _token An ERC20 token address
   * @param _amountOutMin The minimal amount of _token1 that the user will accept for a given amount of _amount0In
   * @param _deadline The UTC timestamp that if reached, causes the swap transaction to fail automatically
   */
  function swapExactETHForTokens(
    address _to,
    address _token,
    uint _amountOutMin,
    uint _deadline
  ) external payable override ensure(_deadline) returns (uint output) {
    address _weth = weth;
    IWETH(_weth).deposit{value: msg.value}();
    if (_token == _weth) {
      assert(IWETH(_weth).transfer(_to, msg.value));
      output = msg.value;
    } else {
      address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash);
      assert(IWETH(_weth).transfer(pool, msg.value));
      (, output) = _swap(_weth, _token, _to);
    }
    require(output >= _amountOutMin, 'XfaiV0Periphery03: INSUFFICIENT_OUTPUT_AMOUNT');
  }

  /**
   * @notice Swap an amount of one ERC20 token (_token0) for an exact amount of ether
   * @dev Requires _token0  approval. At the end of the function call, a given amount (smaller than _amount0InMax) of _token0 is deposited into xfai, and and the amount _amount1Out of ether is returned to the recipient.
   * @param _to The address of the recipient
   * @param _token An ERC20 token address
   * @param _amountOut The amount of ether that one wants to receive
   * @param _amountInMax The maximal amount of _token0 that the user is willing to trade for a given amount of _amount1Out
   * @param _deadline The UTC timestamp that if reached, causes the swap transaction to fail automatically
   */
  function swapTokensForExactETH(
    address _to,
    address _token,
    uint _amountOut,
    uint _amountInMax,
    uint _deadline
  ) external override ensure(_deadline) returns (uint input) {
    address _weth = weth;
    if (_token == _weth) {
      TransferHelper.safeTransferFrom(_weth, msg.sender, address(this), _amountOut);
    } else {
      address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash);
      (uint r, uint w) = IXfaiPool(pool).getStates();
      input = XfaiLibrary.getAmountIn(r, w, _amountOut, IXfaiV0Core(core).getTotalFee());
      require(input <= _amountInMax, 'XfaiV0Periphery03: INSUFFICIENT_INPUT_AMOUNT');
      TransferHelper.safeTransferFrom(_token, msg.sender, pool, input);
      _swap(_token, _weth, address(this));
    }
    IWETH(_weth).withdraw(_amountOut);
    TransferHelper.safeTransferETH(_to, _amountOut);
  }

  /**
   * @notice Swap an exact amount of one ERC20 token (_token0) for ether
   * @dev Requires _token0  approval. At the end of the function call, a given amount _amount0In of _token0 is deposited into Xfai, and an amount (larger than _amount1OutMin) of ether is returned to the recipient.
   * @param _to The address of the recipient
   * @param _token An ERC20 token address
   * @param _amountIn The amount of _token0 to be swapped
   * @param _amountOutMin The minimal amount of ether that the user will accept for a given amount of _amount0In
   * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically
   */
  function swapExactTokensForETH(
    address _to,
    address _token,
    uint _amountIn,
    uint _amountOutMin,
    uint _deadline
  ) external override ensure(_deadline) returns (uint output) {
    address _weth = weth;
    if (_token == _weth) {
      TransferHelper.safeTransferFrom(_token, msg.sender, address(this), _amountIn);
      IWETH(_weth).withdraw(_amountIn);
      output = _amountIn;
    } else {
      address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash);
      TransferHelper.safeTransferFrom(_token, msg.sender, pool, _amountIn);
      (, output) = _swap(_token, _weth, address(this));
      IWETH(_weth).withdraw(output);
    }
    require(output >= _amountOutMin, 'XfaiV0Periphery03: INSUFFICIENT_OUTPUT_AMOUNT');
    TransferHelper.safeTransferETH(_to, output);
  }

  /**
   * @notice Swap an amount of ether for an exact amount of ERC20 tokens (_token1)
   * @dev At the end of the function call, a given amount of ether is deposited into xfai, and a given amount _amount1Out of _token1 is returned to the recipient.
   * @param _to The address of the recipient
   * @param _token An ERC20 token address
   * @param _amountOut The amount of _token1 that the user accepts for a given amount of ether
   * @param _deadline The UTC timestamp that if reached, causes the swap transaction to fail automatically
   */
  function swapETHForExactTokens(
    address _to,
    address _token,
    uint _amountOut,
    uint _deadline
  ) external payable override ensure(_deadline) returns (uint input) {
    address _weth = weth;
    if (_token == _weth) {
      require(_amountOut <= msg.value, 'XfaiV0Periphery03: INSUFFICIENT_INPUT_AMOUNT');
      IWETH(_weth).deposit{value: _amountOut}();
      assert(IWETH(_weth).transfer(_to, _amountOut));
    } else {
      address pool = XfaiLibrary.poolFor(_token, factory, poolCodeHash);
      (uint r, uint w) = IXfaiPool(pool).getStates();
      input = XfaiLibrary.getAmountIn(w, r, _amountOut, IXfaiV0Core(core).getTotalFee());
      require(input <= msg.value, 'XfaiV0Periphery03: INSUFFICIENT_INPUT_AMOUNT');
      IWETH(_weth).deposit{value: input}();
      assert(IWETH(_weth).transfer(pool, input));
      _swap(_weth, _token, _to);
    }
    // refund dust eth, if any
    if (msg.value > input) TransferHelper.safeTransferETH(msg.sender, msg.value - input);
  }
}

File 2 of 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import './IERC165.sol';

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
  /**
   * @dev See {IERC165-supportsInterface}.
   */
  function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    return interfaceId == type(IERC165).interfaceId;
  }
}

File 3 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.19;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
  /**
   * @dev Returns true if this contract implements the interface defined by
   * `interfaceId`. See the corresponding
   * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
   * to learn more about how these ids are created.
   *
   * This function call must use less than 30 000 gas.
   */
  function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 4 of 15: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
  /**
   * @dev Emitted when `value` tokens are moved from one account (`from`) to
   * another (`to`).
   *
   * Note that `value` may be zero.
   */
  event Transfer(address indexed from, address indexed to, uint256 value);

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);

  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

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

  /**
   * @dev Moves `amount` tokens from the caller's account to `to`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address to, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `from` to `to` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

File 5 of 15: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import './IERC20.sol';

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
  /**
   * @dev Returns the name of the token.
   */
  function name() external view returns (string memory);

  /**
   * @dev Returns the symbol of the token.
   */
  function symbol() external view returns (string memory);

  /**
   * @dev Returns the decimals places of the token.
   */
  function decimals() external view returns (uint8);
}

File 6 of 15: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.19;

import './IERC165.sol';

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
  /**
   * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
   */
  event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

  /**
   * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
   */
  event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

  /**
   * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
   */
  event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

  /**
   * @dev Returns the number of tokens in ``owner``'s account.
   */
  function balanceOf(address owner) external view returns (uint256 balance);

  /**
   * @dev Returns the owner of the `tokenId` token.
   *
   * Requirements:
   *
   * - `tokenId` must exist.
   */
  function ownerOf(uint256 tokenId) external view returns (address owner);

  /**
   * @dev Safely transfers `tokenId` token from `from` to `to`.
   *
   * Requirements:
   *
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   * - `tokenId` token must exist and be owned by `from`.
   * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
   * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
   *
   * Emits a {Transfer} event.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes calldata data
  ) external;

  /**
   * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
   * are aware of the ERC721 protocol to prevent tokens from being forever locked.
   *
   * Requirements:
   *
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   * - `tokenId` token must exist and be owned by `from`.
   * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
   * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
   *
   * Emits a {Transfer} event.
   */
  function safeTransferFrom(address from, address to, uint256 tokenId) external;

  /**
   * @dev Transfers `tokenId` token from `from` to `to`.
   *
   * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
   * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
   * understand this adds an external call which potentially creates a reentrancy vulnerability.
   *
   * Requirements:
   *
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address from, address to, uint256 tokenId) external;

  /**
   * @dev Gives permission to `to` to transfer `tokenId` token to another account.
   * The approval is cleared when the token is transferred.
   *
   * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
   *
   * Requirements:
   *
   * - The caller must own the token or be an approved operator.
   * - `tokenId` must exist.
   *
   * Emits an {Approval} event.
   */
  function approve(address to, uint256 tokenId) external;

  /**
   * @dev Approve or remove `operator` as an operator for the caller.
   * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
   *
   * Requirements:
   *
   * - The `operator` cannot be the caller.
   *
   * Emits an {ApprovalForAll} event.
   */
  function setApprovalForAll(address operator, bool _approved) external;

  /**
   * @dev Returns the account approved for `tokenId` token.
   *
   * Requirements:
   *
   * - `tokenId` must exist.
   */
  function getApproved(uint256 tokenId) external view returns (address operator);

  /**
   * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
   *
   * See {setApprovalForAll}
   */
  function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 7 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.19;

import './IERC721.sol';

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
  /**
   * @dev Returns the total amount of tokens stored by the contract.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
   * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

  /**
   * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
   * Use along with {totalSupply} to enumerate all tokens.
   */
  function tokenByIndex(uint256 index) external view returns (uint256);
}

File 8 of 15: IWETH.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.8.19;

import './IERC20Metadata.sol';

interface IWETH is IERC20Metadata {
  function deposit() external payable;

  function transfer(address to, uint value) external returns (bool);

  function withdraw(uint) external;
}

File 9 of 15: IXfaiFactory.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.19;

interface IXfaiFactory {
  function getPool(address _token) external view returns (address pool);

  function allPools(uint256) external view returns (address pool);

  function poolCodeHash() external pure returns (bytes32);

  function allPoolsLength() external view returns (uint);

  function createPool(address _token) external returns (address pool);

  function setXfaiCore(address _core) external;

  function getXfaiCore() external view returns (address);

  function setOwner(address _owner) external;

  function getOwner() external view returns (address);

  event ChangedOwner(address indexed owner);
  event ChangedCore(address indexed core);
  event Whitelisting(bool state);
  event PoolCreated(address indexed token, address indexed pool, uint allPoolsSize);
}

File 10 of 15: IXfaiINFT.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.19;
import './IERC721Enumerable.sol';

interface IXfaiINFT is IERC721Enumerable {
  function reserve() external view returns (uint);

  function totalSharesIssued() external view returns (uint);

  function initialReserve() external view returns (uint);

  function harvestedBalance(address _token) external view returns (uint);

  function INFTShares(uint _id) external view returns (uint);

  function sharesHarvestedByPool(address _token, uint _id) external view returns (uint);

  function totalSharesHarvestedByPool(address _token) external view returns (uint);

  function setBaseURI(string memory _baseURI) external;

  function getStates() external view returns (uint, uint, uint);

  function shareToTokenAmount(
    uint _tokenID,
    address _token
  ) external view returns (uint share2amount, uint inftShare, uint harvestedShares);

  function premint(address[] memory _legacyLNFTHolders, uint[] memory _initialShares) external;

  function mint(address _to) external returns (uint tokenID, uint share);

  function boost(uint _tokenID) external returns (uint share);

  function harvestToken(address _token, uint _tokenID, uint _amount) external returns (uint);

  function harvestETH(uint _tokenID, uint _amount) external returns (uint);

  event Mint(address indexed from, address indexed to, uint share, uint id);
  event Boost(address indexed from, uint share, uint id);
  event HarvestToken(address token, uint harvestedAmount, uint harvestedShare, uint id);
  event HarvestETH(uint harvestedAmount, uint harvestedShare, uint id);
}

File 11 of 15: IXfaiPool.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.19;

import './IERC20Metadata.sol';

interface IXfaiPool is IERC20Metadata {
  function getXfaiCore() external view returns (address);

  function poolToken() external view returns (address);

  function initialize(address _token, address _xfaiFactory) external;

  function getStates() external view returns (uint, uint);

  function update(uint _reserveBalance, uint _weightBalance) external;

  function mint(address _to, uint _amount) external;

  function burn(address _to, uint _amount) external;

  function linkedTransfer(address _token, address _to, uint256 _value) external;

  event Sync(uint _reserve, uint _weight);
  event Write(uint _reserve, uint _weight, uint _blockTimestamp);
}

File 12 of 15: IXfaiV0Core.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.19;

interface IXfaiV0Core {
  function lpFee() external view returns (uint);

  function changeLpFee(uint _newFee) external;

  function infinityNFTFee() external view returns (uint);

  function changeInfinityNFTFee(uint _newFee) external;

  function getTotalFee() external view returns (uint);

  function pause(bool _p) external;

  function swap(
    address _token0,
    address _token1,
    address _to
  ) external returns (uint input, uint output);

  function flashLoan(
    address _token,
    uint _tokenAmount,
    uint _wethAmount,
    address _to,
    bytes calldata _data
  ) external;

  function mint(address _token, address _to) external returns (uint liquidity);

  function burn(
    address _token0,
    address _token1,
    address _to
  ) external returns (uint amount0, uint amount1);

  function skim(address _token, address _to) external;

  function sync(address _token) external;

  event ChangedOwner(address indexed owner);
  event Mint(address indexed sender, uint liquidity);
  event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
  event Swap(address indexed sender, uint input, uint output, address indexed to);
  event FlashLoan(address indexed sender, uint tokenAmount, uint wethAmount);
  event LpFeeChange(uint newFee);
  event InfinityNFTFeeChange(uint newFee);
  event Paused(bool p);
}

File 13 of 15: IXfaiV0Periphery03.sol
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.19;

interface IXfaiV0Periphery03 {
  function addLiquidity(
    address _to,
    address _token,
    uint _amountTokenDesired,
    uint _amountTokenMin,
    uint _amountETHMin,
    uint _deadline
  ) external payable returns (uint liquidity);

  function removeLiquidity(
    address _to,
    address _token0,
    address _token1,
    uint _liquidity,
    uint _amount0Min,
    uint _amount1Min,
    uint _deadline
  ) external returns (uint amount0, uint amount1);

  function swapExactTokensForTokens(
    address _to,
    address _token0,
    address _token1,
    uint _amount0In,
    uint _amount1OutMin,
    uint _deadline
  ) external returns (uint);

  function swapTokensForExactTokens(
    address _to,
    address _token0,
    address _token1,
    uint _amount1Out,
    uint _amount0InMax,
    uint _deadline
  ) external returns (uint);

  function swapExactETHForTokens(
    address _to,
    address _token,
    uint _amountOutMin,
    uint _deadline
  ) external payable returns (uint amountOut);

  function swapTokensForExactETH(
    address _to,
    address _token,
    uint _amountOut,
    uint _amountInMax,
    uint _deadline
  ) external returns (uint input);

  function swapExactTokensForETH(
    address _to,
    address _token,
    uint _amountIn,
    uint _amountOutMin,
    uint _deadline
  ) external returns (uint output);

  function swapETHForExactTokens(
    address _to,
    address _token,
    uint _amountOut,
    uint _deadline
  ) external payable returns (uint input);
}

File 14 of 15: TransferHelper.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

import './IERC20.sol';

library TransferHelper {
  function safeTransferFrom(address _token, address _from, address _to, uint256 _value) internal {
    require(_token.code.length > 0, 'Xfai: TRANSFERFROM_FAILED');
    (bool success, bytes memory data) = _token.call(
      abi.encodeWithSelector(IERC20.transferFrom.selector, _from, _to, _value)
    );
    require(success && (data.length == 0 || abi.decode(data, (bool))), 'Xfai: TRANSFERFROM_FAILED');
  }

  function safeTransferETH(address _to, uint _value) internal {
    (bool success, ) = _to.call{value: _value}(new bytes(0));
    require(success, 'Xfai: ETH_TRANSFER_FAILED');
  }

  function safeTransfer(address _token, address _to, uint256 _value) internal {
    require(_token.code.length > 0, 'Xfai: TRANSFER_FAILED');
    (bool success, bytes memory data) = _token.call(
      abi.encodeWithSelector(IERC20.transfer.selector, _to, _value)
    );
    require(success && (data.length == 0 || abi.decode(data, (bool))), 'Xfai: TRANSFER_FAILED');
  }
}

File 15 of 15: XfaiLibrary.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

import './IXfaiPool.sol';

library XfaiLibrary {
  /**
   * @notice Calculates the CREATE2 address for a pool without making any external calls
   * @param _token An ERC20 token address
   * @param _factory The factory contract of Xfai
   * @param _poolCodeHash The codehash of the Xfai pool contract
   * @return pool The deterministic pool address for a given _token
   */
  function poolFor(
    address _token,
    address _factory,
    bytes32 _poolCodeHash
  ) internal pure returns (address pool) {
    pool = address(
      uint160(
        uint256(
          keccak256(
            abi.encodePacked(
              hex'ff',
              _factory,
              keccak256(abi.encodePacked(_token)),
              _poolCodeHash // init code hash
            )
          )
        )
      )
    );
  }

  function getAdjustedOutput(uint _amountIn, uint _r, uint _w) internal pure returns (uint out) {
    out = (_amountIn * _w) / (_r + _amountIn);
  }

  function getAdjustedInput(uint _amountOut, uint _r, uint _w) internal pure returns (uint input) {
    input = ((_amountOut * _r) / (_w - _amountOut)) + 1;
  }

  function quote(uint _amountIn, uint _a, uint _b) internal pure returns (uint out) {
    out = (_amountIn * _a) / _b;
  }

  /**
   * @notice Calculates the adjusted price of an _amountIn (of a token from _pool0) in terms of the token in _pool1
   * @dev either token0 or token1 must be xfETH
   * @param _reserve0 The reserve of _token0 (can be xfETH)
   * @param _reserve1 The reserve of _token1 (can be xfETH)
   * @param _amountIn The token input amount to _pool0
   * @return output The token output between a token - xfETH interaction
   */
  function getAmountOut(
    uint _reserve0,
    uint _reserve1,
    uint _amountIn,
    uint _totalFee
  ) public pure returns (uint output) {
    require(_amountIn > 0, 'Xfai: INSUFFICIENT_AMOUNT');
    require(_reserve0 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY');
    require(_reserve1 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY');
    uint amountInWithFee = _amountIn * (10000 - _totalFee);
    uint numerator = amountInWithFee * _reserve1;
    output = numerator / (_reserve0 * 10000 + amountInWithFee);
  }

  /**
   * @notice Calculates the adjusted price of an _amountOut (of a token from _pool1) in terms of the token in _pool0
   * @param _reserve0 The reserve of _token0 (can be xfETH)
   * @param _reserve1 The reserve of _token1 (can be xfETH)
   * @param _amountOut The token output amount from _pool0
   * @return input The token input amount to _pool0
   */
  function getAmountIn(
    uint _reserve0,
    uint _reserve1,
    uint _amountOut,
    uint _totalFee
  ) public pure returns (uint input) {
    require(_amountOut > 0, 'Xfai: INSUFFICIENT_AMOUNT');
    require(_reserve0 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY');
    require(_reserve1 > 0, 'Xfai: INSUFFICIENT_LIQUIDITY');
    uint numerator = _amountOut * _reserve0 * 10000;
    uint denominator = (_reserve1 - _amountOut) * (10000 - _totalFee);
    input = (numerator / denominator) + 1;
  }

  /**
   * @notice Calculates the adjusted price of an _amountIn (of a token from _pool0) in terms of the token in _pool1
   * @param _pool0 A pool address
   * @param _pool1 A pool address
   * @param _amountIn The token input amount to _pool0
   * @return out1 The token output amount from _pool1
   */
  function getAmountsOut(
    address _pool0,
    address _pool1,
    uint _amountIn,
    uint _totalFee
  ) public view returns (uint out1) {
    (uint r0, uint w0) = IXfaiPool(_pool0).getStates();
    (uint r1, uint w1) = IXfaiPool(_pool1).getStates();
    uint weight0Out = getAmountOut(r0, w0, _amountIn, _totalFee);
    out1 = getAdjustedOutput(weight0Out, w1, r1);
  }

  /**
   * @notice Calculates the adjusted price of an _amountOut (of a token from _pool1) in terms of the token in _pool0
   * @param _pool0 A pool address
   * @param _pool1 A pool address
   * @param _amountOut The token output amount from _pool1
   * @return inp0 The token input amount to _pool0
   */
  function getAmountsIn(
    address _pool0,
    address _pool1,
    uint _amountOut,
    uint _totalFee
  ) public view returns (uint inp0) {
    (uint r0, uint w0) = IXfaiPool(_pool0).getStates();
    (uint r1, uint w1) = IXfaiPool(_pool1).getStates();
    uint weight0Out = getAdjustedInput(_amountOut, w1, r1);
    inp0 = getAmountIn(r0, w0, weight0Out, _totalFee);
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"_amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_amount0Min","type":"uint256"},{"internalType":"uint256","name":"_amount1Min","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256","name":"input","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256","name":"output","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"_amount0In","type":"uint256"},{"internalType":"uint256","name":"_amount1OutMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountOut","type":"uint256"},{"internalType":"uint256","name":"_amountInMax","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256","name":"input","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint256","name":"_amount1Out","type":"uint256"},{"internalType":"uint256","name":"_amount0InMax","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256","name":"amount0In","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040523480156200001257600080fd5b506040516200337c3803806200337c833981016040819052620000359162000149565b6001600160a01b038216608081905260408051637f86e3b960e01b81529051637f86e3b9916004808201926020929091908290030181865afa15801562000080573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a6919062000181565b6001600160a01b0390811660a05281811660c0526040805163554dcae760e01b815290519184169163554dcae7916004808201926020929091908290030181865afa158015620000fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001209190620001a6565b60e05250620001c09050565b80516001600160a01b03811681146200014457600080fd5b919050565b600080604083850312156200015d57600080fd5b62000168836200012c565b915062000178602084016200012c565b90509250929050565b6000602082840312156200019457600080fd5b6200019f826200012c565b9392505050565b600060208284031215620001b957600080fd5b5051919050565b60805160a05160c05160e05161305662000326600039600081816103d1015281816107ba01528181610be601528181610ea00152818161129f015281816112ec015281816115400152818161168a015281816116d701528181611a6d01528181611d4001528181611d920152612ab8015260008181609c01528181610247015281816105b601528181610c2e01528181610cb201528181610e2701528181611227015281816114c80152818161197101528181611cc801526128ac01526000818161087401528181610d2501528181610f5a015281816113a6015281816115fa0152818161171c01528181611fc80152612a710152600081816103b00152818161079901528181610bc501528181610e7f0152818161127e015281816112cb0152818161151f01528181611669015281816116b601528181611a4c01528181611d1f01528181611d7101528181612175015281816122440152612a9701526130566000f3fe60806040526004361061007f5760003560e01c8063515a22d31161004e578063515a22d31461013c578063b1f0d8401461015c578063cb7cfbe71461017c578063f448a616146101b157600080fd5b806312d4b07c146100d0578063293b15a9146100f65780633351733f14610109578063433182141461011c57600080fd5b366100cb573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100c9576100c9612cbd565b005b600080fd5b6100e36100de366004612d11565b6101d1565b6040519081526020015b60405180910390f35b6100e3610104366004612d11565b610547565b6100e3610117366004612d57565b610b50565b34801561012857600080fd5b506100e3610137366004612db0565b610db8565b34801561014857600080fd5b506100e3610157366004612e01565b6111b5565b34801561016857600080fd5b506100e3610177366004612db0565b611902565b34801561018857600080fd5b5061019c610197366004612e66565b611bca565b604080519283526020830191909152016100ed565b3480156101bd57600080fd5b506100e36101cc366004612e01565b611c57565b60008142811015610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a204558504952454400000000000060448201526064015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156102b057600080fd5b505af11580156102c4573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036103a8576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015234602483015282169063a9059cbb906044016020604051808303816000875af1158015610370573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103949190612ed4565b6103a0576103a0612cbd565b3492506104ad565b60006103f5877f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523460248301529192509083169063a9059cbb906044016020604051808303816000875af115801561046d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104919190612ed4565b61049d5761049d612cbd565b6104a882888a611f6e565b945050505b8483101561053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e5400000000000000000000000000000000000000606482015260840161023a565b5050949350505050565b600081428110156105b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff808216908716036107915734851115610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e540000000000000000000000000000000000000000606482015260840161023a565b8073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156106cd57600080fd5b505af11580156106e1573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152602482018a90528516935063a9059cbb925060440190506020604051808303816000875af115801561075c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107809190612ed4565b61078c5761078c612cbd565b610b35565b60006107de877f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa15801561082d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108519190612efd565b915091507359eaeb942af4b7025481e3ef46265c5dad50d31563571fd01282848b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109019190612f21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015610967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098b9190612f21565b955034861115610a1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e540000000000000000000000000000000000000000606482015260840161023a565b8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a6557600080fd5b505af1158015610a79573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018b90528816935063a9059cbb925060440190506020604051808303816000875af1158015610af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b189190612ed4565b610b2457610b24612cbd565b610b2f848a8c611f6e565b50505050505b8234111561053d5761053d33610b4b8534612f69565b612040565b60008142811015610bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b6000610c0a887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b9050600080610c1c8a8a348b8b612129565b91509150610c2c8a3385856124bc565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c9457600080fd5b505af1158015610ca8573d6000803e3d6000fd5b5050505050610cd87f000000000000000000000000000000000000000000000000000000000000000084836126b6565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528c811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ee1fe2ad906044016020604051808303816000875af1158015610d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d929190612f21565b945080341115610daa57610daa33610b4b8334612f69565b505050509695505050505050565b60008142811015610e25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff80821690881603610e7757610e72813330896124bc565b611120565b6000610ec4887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f379190612efd565b915091507359eaeb942af4b7025481e3ef46265c5dad50d31563571fd01283838c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190612f21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561104d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110719190612f21565b955087861115611103576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e540000000000000000000000000000000000000000606482015260840161023a565b61110f8a3385896124bc565b61111a8a8530611f6e565b50505050505b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b15801561118857600080fd5b505af115801561119c573d6000803e3d6000fd5b505050506111aa8887612040565b505095945050505050565b60008142811015611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036114c6576112c3887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b9150611310887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b90506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa15801561135f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113839190612efd565b915091507359eaeb942af4b7025481e3ef46265c5dad50d31563571fd01282848c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114339190612f21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bd9190612f21565b9550505061184c565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff160361166357611564897f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b91506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d79190612efd565b915091507359eaeb942af4b7025481e3ef46265c5dad50d31563571fd01283838c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140f573d6000803e3d6000fd5b6116ae897f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b91506116fb887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b90507359eaeb942af4b7025481e3ef46265c5dad50d3156364e2be4483838a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a99190612f21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611825573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118499190612f21565b93505b858411156118dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e540000000000000000000000000000000000000000606482015260840161023a565b6118e8893384876124bc565b6118f389898c611f6e565b50505050509695505050505050565b6000814281101561196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff80821690881603611a44576119bc873330896124bc565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b158015611a2457600080fd5b505af1158015611a38573d6000803e3d6000fd5b50505050859250611b30565b6000611a91887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b9050611a9f8833838a6124bc565b611aaa888330611f6e565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905290955073ffffffffffffffffffffffffffffffffffffffff84169150632e1a7d4d90602401600060405180830381600087803b158015611b1657600080fd5b505af1158015611b2a573d6000803e3d6000fd5b50505050505b84831015611bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e5400000000000000000000000000000000000000606482015260840161023a565b6111aa8884612040565b6000808242811015611c38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b611c468a8a8a8a8a8a6128a7565b909b909a5098505050505050505050565b60008142811015611cc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611d6b57611d64877f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b9050611db9565b611db6887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b90505b611dc5883383896124bc565b6000611dd289898c611f6e565b91505085811015611e65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e5400000000000000000000000000000000000000606482015260840161023a565b9998505050505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009083906034016040516020818303038152906040528051906020012083604051602001611f30939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6040517f9331621200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528381166024830152828116604483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063933162129060640160408051808303816000875af1158015612010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120349190612efd565b90969095509350505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516120779190612f82565b60006040518083038185875af1925050503d80600081146120b4576040519150601f19603f3d011682016040523d82523d6000602084013e6120b9565b606091505b5050905080612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a204554485f5452414e534645525f4641494c454400000000000000604482015260640161023a565b505050565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa1580156121be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e29190612fb1565b905073ffffffffffffffffffffffffffffffffffffffff81166122b4576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301527f00000000000000000000000000000000000000000000000000000000000000001690639049f9d2906024016020604051808303816000875af115801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b19190612fb1565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015612301573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123259190612efd565b91509150816000148015612337575080155b15612347578894508793506124af565b60006123548a8385612a4d565b90508881116123f857868110156123ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f315f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161023a565b8995509350836124ad565b60006124058a8585612a4d565b90508a81111561241757612417612cbd565b888110156124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f305f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161023a565b95508894505b505b5050509550959350505050565b60008473ffffffffffffffffffffffffffffffffffffffff163b1161253d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c454400000000000000604482015260640161023a565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916125dc9190612f82565b6000604051808303816000865af19150503d8060008114612619576040519150601f19603f3d011682016040523d82523d6000602084013e61261e565b606091505b50915091508180156126485750805115806126485750808060200190518101906126489190612ed4565b6126ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c454400000000000000604482015260640161023a565b505050505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b11612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c45440000000000000000000000604482015260640161023a565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916127ce9190612f82565b6000604051808303816000865af19150503d806000811461280b576040519150601f19603f3d011682016040523d82523d6000602084013e612810565b606091505b509150915081801561283a57508051158061283a57508080602001905181019061283a9190612ed4565b6128a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c45440000000000000000000000604482015260640161023a565b5050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff8082169089160361294d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f58666169563050657269706865727930333a20494e56414c49445f544f4b454e604482015260640161023a565b8073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612a2d5761298e888288888830612a6c565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101829052919450925073ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b1580156129fb57600080fd5b505af1158015612a0f573d6000803e3d6000fd5b50505050612a1d8983612040565b612a28888a856126b6565b612a41565b612a3b88888888888e612a6c565b90935091505b50965096945050505050565b600081612a5a8486612fce565b612a649190612fe5565b949350505050565b6000807f000000000000000000000000000000000000000000000000000000000000000081612adc8a7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611e72565b9050612aea8133848b6124bc565b6040517f45a11cec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a8116602483015286811660448301528316906345a11cec9060640160408051808303816000875af1158015612b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8b9190612efd565b909450925086841015612c20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f414d4f554e543000000000000000000000000000000000000000000000000000606482015260840161023a565b85831015612cb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f414d4f554e543100000000000000000000000000000000000000000000000000606482015260840161023a565b5050965096945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612d0e57600080fd5b50565b60008060008060808587031215612d2757600080fd5b8435612d3281612cec565b93506020850135612d4281612cec565b93969395505050506040820135916060013590565b60008060008060008060c08789031215612d7057600080fd5b8635612d7b81612cec565b95506020870135612d8b81612cec565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080600080600060a08688031215612dc857600080fd5b8535612dd381612cec565b94506020860135612de381612cec565b94979496505050506040830135926060810135926080909101359150565b60008060008060008060c08789031215612e1a57600080fd5b8635612e2581612cec565b95506020870135612e3581612cec565b94506040870135612e4581612cec565b959894975094956060810135955060808101359460a0909101359350915050565b600080600080600080600060e0888a031215612e8157600080fd5b8735612e8c81612cec565b96506020880135612e9c81612cec565b95506040880135612eac81612cec565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b600060208284031215612ee657600080fd5b81518015158114612ef657600080fd5b9392505050565b60008060408385031215612f1057600080fd5b505080516020909101519092909150565b600060208284031215612f3357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115612f7c57612f7c612f3a565b92915050565b6000825160005b81811015612fa35760208186018101518583015201612f89565b506000920191825250919050565b600060208284031215612fc357600080fd5b8151612ef681612cec565b8082028115828204841417612f7c57612f7c612f3a565b60008261301b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220b4a875164cf612857c9da07799465c7c18f71c3826b75cccdf197f92399f620664736f6c63430008130033000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca26000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f

Deployed Bytecode

0x60806040526004361061007f5760003560e01c8063515a22d31161004e578063515a22d31461013c578063b1f0d8401461015c578063cb7cfbe71461017c578063f448a616146101b157600080fd5b806312d4b07c146100d0578063293b15a9146100f65780633351733f14610109578063433182141461011c57600080fd5b366100cb573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f16146100c9576100c9612cbd565b005b600080fd5b6100e36100de366004612d11565b6101d1565b6040519081526020015b60405180910390f35b6100e3610104366004612d11565b610547565b6100e3610117366004612d57565b610b50565b34801561012857600080fd5b506100e3610137366004612db0565b610db8565b34801561014857600080fd5b506100e3610157366004612e01565b6111b5565b34801561016857600080fd5b506100e3610177366004612db0565b611902565b34801561018857600080fd5b5061019c610197366004612e66565b611bca565b604080519283526020830191909152016100ed565b3480156101bd57600080fd5b506100e36101cc366004612e01565b611c57565b60008142811015610243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a204558504952454400000000000060448201526064015b60405180910390fd5b60007f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f90508073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156102b057600080fd5b505af11580156102c4573d6000803e3d6000fd5b50505050508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16036103a8576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015234602483015282169063a9059cbb906044016020604051808303816000875af1158015610370573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103949190612ed4565b6103a0576103a0612cbd565b3492506104ad565b60006103f5877f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523460248301529192509083169063a9059cbb906044016020604051808303816000875af115801561046d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104919190612ed4565b61049d5761049d612cbd565b6104a882888a611f6e565b945050505b8483101561053d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e5400000000000000000000000000000000000000606482015260840161023a565b5050949350505050565b600081428110156105b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff808216908716036107915734851115610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e540000000000000000000000000000000000000000606482015260840161023a565b8073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156106cd57600080fd5b505af11580156106e1573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152602482018a90528516935063a9059cbb925060440190506020604051808303816000875af115801561075c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107809190612ed4565b61078c5761078c612cbd565b610b35565b60006107de877f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa15801561082d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108519190612efd565b915091507359eaeb942af4b7025481e3ef46265c5dad50d31563571fd01282848b7f0000000000000000000000008d58ee2d23f7920ea32e534aad8d6753c88bc01a73ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109019190612f21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015610967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098b9190612f21565b955034861115610a1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e540000000000000000000000000000000000000000606482015260840161023a565b8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b158015610a6557600080fd5b505af1158015610a79573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018b90528816935063a9059cbb925060440190506020604051808303816000875af1158015610af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b189190612ed4565b610b2457610b24612cbd565b610b2f848a8c611f6e565b50505050505b8234111561053d5761053d33610b4b8534612f69565b612040565b60008142811015610bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b6000610c0a887f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b9050600080610c1c8a8a348b8b612129565b91509150610c2c8a3385856124bc565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c9457600080fd5b505af1158015610ca8573d6000803e3d6000fd5b5050505050610cd87f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f84836126b6565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528c811660248301527f0000000000000000000000008d58ee2d23f7920ea32e534aad8d6753c88bc01a169063ee1fe2ad906044016020604051808303816000875af1158015610d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d929190612f21565b945080341115610daa57610daa33610b4b8334612f69565b505050509695505050505050565b60008142811015610e25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff80821690881603610e7757610e72813330896124bc565b611120565b6000610ec4887f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f379190612efd565b915091507359eaeb942af4b7025481e3ef46265c5dad50d31563571fd01283838c7f0000000000000000000000008d58ee2d23f7920ea32e534aad8d6753c88bc01a73ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe79190612f21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561104d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110719190612f21565b955087861115611103576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e540000000000000000000000000000000000000000606482015260840161023a565b61110f8a3385896124bc565b61111a8a8530611f6e565b50505050505b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b15801561118857600080fd5b505af115801561119c573d6000803e3d6000fd5b505050506111aa8887612040565b505095945050505050565b60008142811015611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b6000807f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036114c6576112c3887f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b9150611310887f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b90506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa15801561135f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113839190612efd565b915091507359eaeb942af4b7025481e3ef46265c5dad50d31563571fd01282848c7f0000000000000000000000008d58ee2d23f7920ea32e534aad8d6753c88bc01a73ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114339190612f21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015611499573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bd9190612f21565b9550505061184c565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff160361166357611564897f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b91506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d79190612efd565b915091507359eaeb942af4b7025481e3ef46265c5dad50d31563571fd01283838c7f0000000000000000000000008d58ee2d23f7920ea32e534aad8d6753c88bc01a73ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140f573d6000803e3d6000fd5b6116ae897f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b91506116fb887f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b90507359eaeb942af4b7025481e3ef46265c5dad50d3156364e2be4483838a7f0000000000000000000000008d58ee2d23f7920ea32e534aad8d6753c88bc01a73ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611785573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a99190612f21565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611825573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118499190612f21565b93505b858411156118dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e540000000000000000000000000000000000000000606482015260840161023a565b6118e8893384876124bc565b6118f389898c611f6e565b50505050509695505050505050565b6000814281101561196f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b7f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff80821690881603611a44576119bc873330896124bc565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810187905273ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b158015611a2457600080fd5b505af1158015611a38573d6000803e3d6000fd5b50505050859250611b30565b6000611a91887f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b9050611a9f8833838a6124bc565b611aaa888330611f6e565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905290955073ffffffffffffffffffffffffffffffffffffffff84169150632e1a7d4d90602401600060405180830381600087803b158015611b1657600080fd5b505af1158015611b2a573d6000803e3d6000fd5b50505050505b84831015611bc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e5400000000000000000000000000000000000000606482015260840161023a565b6111aa8884612040565b6000808242811015611c38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b611c468a8a8a8a8a8a6128a7565b909b909a5098505050505050505050565b60008142811015611cc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930333a2045585049524544000000000000604482015260640161023a565b60007f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611d6b57611d64877f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b9050611db9565b611db6887f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b90505b611dc5883383896124bc565b6000611dd289898c611f6e565b91505085811015611e65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e5400000000000000000000000000000000000000606482015260840161023a565b9998505050505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b16602082015260009083906034016040516020818303038152906040528051906020012083604051602001611f30939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6040517f9331621200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528381166024830152828116604483015260009182917f0000000000000000000000008d58ee2d23f7920ea32e534aad8d6753c88bc01a169063933162129060640160408051808303816000875af1158015612010573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120349190612efd565b90969095509350505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516120779190612f82565b60006040518083038185875af1925050503d80600081146120b4576040519150601f19603f3d011682016040523d82523d6000602084013e6120b9565b606091505b5050905080612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a204554485f5452414e534645525f4641494c454400000000000000604482015260640161023a565b505050565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152600091829182917f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca269091169063bbe4f6db90602401602060405180830381865afa1580156121be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e29190612fb1565b905073ffffffffffffffffffffffffffffffffffffffff81166122b4576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301527f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca261690639049f9d2906024016020604051808303816000875af115801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b19190612fb1565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015612301573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123259190612efd565b91509150816000148015612337575080155b15612347578894508793506124af565b60006123548a8385612a4d565b90508881116123f857868110156123ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f315f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161023a565b8995509350836124ad565b60006124058a8585612a4d565b90508a81111561241757612417612cbd565b888110156124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f305f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161023a565b95508894505b505b5050509550959350505050565b60008473ffffffffffffffffffffffffffffffffffffffff163b1161253d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c454400000000000000604482015260640161023a565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916125dc9190612f82565b6000604051808303816000865af19150503d8060008114612619576040519150601f19603f3d011682016040523d82523d6000602084013e61261e565b606091505b50915091508180156126485750805115806126485750808060200190518101906126489190612ed4565b6126ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c454400000000000000604482015260640161023a565b505050505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b11612737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c45440000000000000000000000604482015260640161023a565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916127ce9190612f82565b6000604051808303816000865af19150503d806000811461280b576040519150601f19603f3d011682016040523d82523d6000602084013e612810565b606091505b509150915081801561283a57508051158061283a57508080602001905181019061283a9190612ed4565b6128a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c45440000000000000000000000604482015260640161023a565b5050505050565b6000807f000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f73ffffffffffffffffffffffffffffffffffffffff8082169089160361294d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f58666169563050657269706865727930333a20494e56414c49445f544f4b454e604482015260640161023a565b8073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1603612a2d5761298e888288888830612a6c565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101829052919450925073ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b1580156129fb57600080fd5b505af1158015612a0f573d6000803e3d6000fd5b50505050612a1d8983612040565b612a28888a856126b6565b612a41565b612a3b88888888888e612a6c565b90935091505b50965096945050505050565b600081612a5a8486612fce565b612a649190612fe5565b949350505050565b6000807f0000000000000000000000008d58ee2d23f7920ea32e534aad8d6753c88bc01a81612adc8a7f000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca267fd29425d309539268aa2f934062f86ea332822e787dafc6baba7cfda029630330611e72565b9050612aea8133848b6124bc565b6040517f45a11cec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a8116602483015286811660448301528316906345a11cec9060640160408051808303816000875af1158015612b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8b9190612efd565b909450925086841015612c20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f414d4f554e543000000000000000000000000000000000000000000000000000606482015260840161023a565b85831015612cb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930333a20494e53554646494349454e545f60448201527f414d4f554e543100000000000000000000000000000000000000000000000000606482015260840161023a565b5050965096945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114612d0e57600080fd5b50565b60008060008060808587031215612d2757600080fd5b8435612d3281612cec565b93506020850135612d4281612cec565b93969395505050506040820135916060013590565b60008060008060008060c08789031215612d7057600080fd5b8635612d7b81612cec565b95506020870135612d8b81612cec565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080600080600060a08688031215612dc857600080fd5b8535612dd381612cec565b94506020860135612de381612cec565b94979496505050506040830135926060810135926080909101359150565b60008060008060008060c08789031215612e1a57600080fd5b8635612e2581612cec565b95506020870135612e3581612cec565b94506040870135612e4581612cec565b959894975094956060810135955060808101359460a0909101359350915050565b600080600080600080600060e0888a031215612e8157600080fd5b8735612e8c81612cec565b96506020880135612e9c81612cec565b95506040880135612eac81612cec565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b600060208284031215612ee657600080fd5b81518015158114612ef657600080fd5b9392505050565b60008060408385031215612f1057600080fd5b505080516020909101519092909150565b600060208284031215612f3357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115612f7c57612f7c612f3a565b92915050565b6000825160005b81811015612fa35760208186018101518583015201612f89565b506000920191825250919050565b600060208284031215612fc357600080fd5b8151612ef681612cec565b8082028115828204841417612f7c57612f7c612f3a565b60008261301b577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea2646970667358221220b4a875164cf612857c9da07799465c7c18f71c3826b75cccdf197f92399f620664736f6c63430008130033

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

000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca26000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f

-----Decoded View---------------
Arg [0] : _factory (address): 0xa5136eAd459F0E61C99Cec70fe8F5C24cF3ecA26
Arg [1] : _weth (address): 0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5136ead459f0e61c99cec70fe8f5c24cf3eca26
Arg [1] : 000000000000000000000000e5d7c2a44ffddf6b295a15c148167daaaf5cf34f


Deployed Bytecode Sourcemap

526:16416:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1607:10;:18;1621:4;1607:18;;1600:26;;;;:::i;:::-;526:16416;;;;;11715:644;;;;;;:::i;:::-;;:::i;:::-;;;1038:25:15;;;1026:2;1011:18;11715:644:14;;;;;;;;15946:994;;;;;;:::i;:::-;;:::i;3655:820::-;;;;;;:::i;:::-;;:::i;13067:865::-;;;;;;;;;;-1:-1:-1;13067:865:14;;;;;:::i;:::-;;:::i;9812:1325::-;;;;;;;;;;-1:-1:-1;9812:1325:14;;;;;:::i;:::-;;:::i;14595:800::-;;;;;;;;;;-1:-1:-1;14595:800:14;;;;;:::i;:::-;;:::i;6955:404::-;;;;;;;;;;-1:-1:-1;6955:404:14;;;;;:::i;:::-;;:::i;:::-;;;;4066:25:15;;;4122:2;4107:18;;4100:34;;;;4039:18;6955:404:14;3892:248:15;8386:662:14;;;;;;;;;;-1:-1:-1;8386:662:14;;;;;:::i;:::-;;:::i;11715:644::-;11884:11;11864:9;1163:15;1151:8;:27;;1143:66;;;;;;;4347:2:15;1143:66:14;;;4329:21:15;4386:2;4366:18;;;4359:30;4425:28;4405:18;;;4398:56;4471:18;;1143:66:14;;;;;;;;;11903:13:::1;11919:4;11903:20;;11935:5;11929:20;;;11957:9;11929:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;11989:5;11979:15;;:6;:15;;::::0;11975:293:::1;;12011:37;::::0;;;;:21:::1;4692:55:15::0;;;12011:37:14::1;::::0;::::1;4674:74:15::0;12038:9:14::1;4764:18:15::0;;;4757:34;12011:21:14;::::1;::::0;::::1;::::0;4647:18:15;;12011:37:14::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12004:45;;;;:::i;:::-;12066:9;12057:18;;11975:293;;;12096:12;12111:50;12131:6;12139:7;12148:12;12111:19;:50::i;:::-;12176:38;::::0;;;;:21:::1;4692:55:15::0;;;12176:38:14::1;::::0;::::1;4674:74:15::0;12204:9:14::1;4764:18:15::0;;;4757:34;12096:65:14;;-1:-1:-1;12176:21:14;;::::1;::::0;::::1;::::0;4647:18:15;;12176:38:14::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12169:46;;;;:::i;:::-;12236:25;12242:5;12249:6;12257:3;12236:5;:25::i;:::-;12223:38:::0;-1:-1:-1;;;11975:293:14::1;12291:13;12281:6;:23;;12273:81;;;::::0;::::1;::::0;;5286:2:15;12273:81:14::1;::::0;::::1;5268:21:15::0;5325:2;5305:18;;;5298:30;5364:34;5344:18;;;5337:62;5435:15;5415:18;;;5408:43;5468:19;;12273:81:14::1;5084:409:15::0;12273:81:14::1;11897:462;11715:644:::0;;;;;;;:::o;15946:994::-;16112:10;16092:9;1163:15;1151:8;:27;;1143:66;;;;;;;4347:2:15;1143:66:14;;;4329:21:15;4386:2;4366:18;;;4359:30;4425:28;4405:18;;;4398:56;4471:18;;1143:66:14;4145:350:15;1143:66:14;16146:4:::1;16160:15;::::0;;::::1;::::0;;::::1;::::0;16156:659:::1;;16207:9;16193:10;:23;;16185:80;;;::::0;::::1;::::0;;5700:2:15;16185:80:14::1;::::0;::::1;5682:21:15::0;5739:2;5719:18;;;5712:30;5778:34;5758:18;;;5751:62;5849:14;5829:18;;;5822:42;5881:19;;16185:80:14::1;5498:408:15::0;16185:80:14::1;16279:5;16273:20;;;16301:10;16273:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;16329:38:14::1;::::0;;;;:21:::1;4692:55:15::0;;;16329:38:14::1;::::0;::::1;4674:74:15::0;4764:18;;;4757:34;;;16329:21:14;::::1;::::0;-1:-1:-1;16329:21:14::1;::::0;-1:-1:-1;4647:18:15;;;-1:-1:-1;16329:38:14::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16322:46;;;;:::i;:::-;16156:659;;;16389:12;16404:50;16424:6;16432:7;16441:12;16404:19;:50::i;:::-;16389:65;;16463:6;16471::::0;16491:4:::1;16481:25;;;:27;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16462:46;;;;16524:11;:23;16548:1;16551;16554:10;16578:4;16566:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16524:74;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6589:25:15::0;;;;6630:18;;;6623:34;;;;6673:18;;;6666:34;6716:18;;;6709:34;6561:19;;16524:74:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16516:82;;16623:9;16614:5;:18;;16606:75;;;::::0;::::1;::::0;;5700:2:15;16606:75:14::1;::::0;::::1;5682:21:15::0;5739:2;5719:18;;;5712:30;5778:34;5758:18;;;5751:62;5849:14;5829:18;;;5822:42;5881:19;;16606:75:14::1;5498:408:15::0;16606:75:14::1;16695:5;16689:20;;;16717:5;16689:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;16740:34:14::1;::::0;;;;:21:::1;4692:55:15::0;;;16740:34:14::1;::::0;::::1;4674:74:15::0;4764:18;;;4757:34;;;16740:21:14;::::1;::::0;-1:-1:-1;16740:21:14::1;::::0;-1:-1:-1;4647:18:15;;;-1:-1:-1;16740:34:14::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16733:42;;;;:::i;:::-;16783:25;16789:5;16796:6;16804:3;16783:5;:25::i;:::-;;;16381:434;;;16156:659;16867:5;16855:9;:17;16851:84;;;16874:61;16905:10;16917:17;16929:5:::0;16917:9:::1;:17;:::i;:::-;16874:30;:61::i;3655:820::-:0;3871:14;3851:9;1163:15;1151:8;:27;;1143:66;;;;;;;4347:2:15;1143:66:14;;;4329:21:15;4386:2;4366:18;;;4359:30;4425:28;4405:18;;;4398:56;4471:18;;1143:66:14;4145:350:15;1143:66:14;3893:12:::1;3908:50;3928:6;3936:7;3945:12;3908:19;:50::i;:::-;3893:65;;3965:12;3979::::0;3995:128:::1;4023:6;4037:19;4064:9;4081:15;4104:13;3995:20;:128::i;:::-;3964:159;;;;4129:66;4161:6;4169:10;4181:4;4187:7;4129:31;:66::i;:::-;4207:4;4201:19;;;4228:7;4201:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;4244:48;4272:4;4278;4284:7;4244:27;:48::i;:::-;4310:35;::::0;;;;:22:::1;7329:15:15::0;;;4310:35:14::1;::::0;::::1;7311:34:15::0;7381:15;;;7361:18;;;7354:43;4322:4:14::1;4310:22;::::0;::::1;::::0;7223:18:15;;4310:35:14::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4298:47;;4398:7;4386:9;:19;4382:88;;;4407:63;4438:10;4450:19;4462:7:::0;4450:9:::1;:19;:::i;4407:63::-;3887:588;;;3655:820:::0;;;;;;;;;:::o;13067:865::-;13248:10;13228:9;1163:15;1151:8;:27;;1143:66;;;;;;;4347:2:15;1143:66:14;;;4329:21:15;4386:2;4366:18;;;4359:30;4425:28;4405:18;;;4398:56;4471:18;;1143:66:14;4145:350:15;1143:66:14;13282:4:::1;13296:15;::::0;;::::1;::::0;;::::1;::::0;13292:544:::1;;13321:77;13353:5;13360:10;13380:4;13387:10;13321:31;:77::i;:::-;13292:544;;;13419:12;13434:50;13454:6;13462:7;13471:12;13434:19;:50::i;:::-;13419:65;;13493:6;13501::::0;13521:4:::1;13511:25;;;:27;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13492:46;;;;13554:11;:23;13578:1;13581;13584:10;13608:4;13596:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13554:74;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6589:25:15::0;;;;6630:18;;;6623:34;;;;6673:18;;;6666:34;6716:18;;;6709:34;6561:19;;13554:74:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13546:82;;13653:12;13644:5;:21;;13636:78;;;::::0;::::1;::::0;;5700:2:15;13636:78:14::1;::::0;::::1;5682:21:15::0;5739:2;5719:18;;;5712:30;5778:34;5758:18;;;5751:62;5849:14;5829:18;;;5822:42;5881:19;;13636:78:14::1;5498:408:15::0;13636:78:14::1;13722:64;13754:6;13762:10;13774:4;13780:5;13722:31;:64::i;:::-;13794:35;13800:6;13808:5;13823:4;13794:5;:35::i;:::-;;;13411:425;;;13292:544;13841:33;::::0;;;;::::1;::::0;::::1;1038:25:15::0;;;13841:21:14::1;::::0;::::1;::::0;::::1;::::0;1011:18:15;;13841:33:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;13880:47;13911:3;13916:10;13880:30;:47::i;:::-;13260:672;13067:865:::0;;;;;;;;:::o;9812:1325::-;10020:14;10000:9;1163:15;1151:8;:27;;1143:66;;;;;;;4347:2:15;1143:66:14;;;4329:21:15;4386:2;4366:18;;;4359:30;4425:28;4405:18;;;4398:56;4471:18;;1143:66:14;4145:350:15;1143:66:14;10042:13:::1;10061::::0;10095:4:::1;10084:15;;:7;:15;;::::0;10080:854:::1;;10117:51;10137:7;10146;10155:12;10117:19;:51::i;:::-;10109:59;;10184:51;10204:7;10213;10222:12;10184:19;:51::i;:::-;10176:59;;10244:6;10252::::0;10272:5:::1;10262:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10243:47;;;;10310:11;:23;10334:1;10337;10340:11;10365:4;10353:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10310:75;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6589:25:15::0;;;;6630:18;;;6623:34;;;;6673:18;;;6666:34;6716:18;;;6709:34;6561:19;;10310:75:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10298:87;;10101:291;;10080:854;;;10413:4;10402:15;;:7;:15;;::::0;10398:536:::1;;10435:51;10455:7;10464;10473:12;10435:19;:51::i;:::-;10427:59;;10495:6;10503::::0;10523:5:::1;10513:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10494:47;;;;10561:11;:23;10585:1;10588;10591:11;10616:4;10604:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;10398:536;10665:51;10685:7;10694;10703:12;10665:19;:51::i;:::-;10657:59;;10732:51;10752:7;10761;10770:12;10732:19;:51::i;:::-;10724:59;;10803:11;:24;10837:5;10852;10867:11;10900:4;10888:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10803:124;::::0;;::::1;::::0;;;;;;7657:42:15;7726:15;;;10803:124:14::1;::::0;::::1;7708:34:15::0;7778:15;;;;7758:18;;;7751:43;7810:18;;;7803:34;7853:18;;;7846:34;7619:19;;10803:124:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10791:136;;10398:536;10960:13;10947:9;:26;;10939:83;;;::::0;::::1;::::0;;5700:2:15;10939:83:14::1;::::0;::::1;5682:21:15::0;5739:2;5719:18;;;5712:30;5778:34;5758:18;;;5751:62;5849:14;5829:18;;;5822:42;5881:19;;10939:83:14::1;5498:408:15::0;10939:83:14::1;11028:70;11060:7;11069:10;11081:5;11088:9;11028:31;:70::i;:::-;11104:28;11110:7;11119;11128:3;11104:5;:28::i;:::-;;;10036:1101;;9812:1325:::0;;;;;;;;;:::o;14595:800::-;14776:11;14756:9;1163:15;1151:8;:27;;1143:66;;;;;;;4347:2:15;1143:66:14;;;4329:21:15;4386:2;4366:18;;;4359:30;4425:28;4405:18;;;4398:56;4471:18;;1143:66:14;4145:350:15;1143:66:14;14811:4:::1;14825:15;::::0;;::::1;::::0;;::::1;::::0;14821:434:::1;;14850:77;14882:6;14890:10;14910:4;14917:9;14850:31;:77::i;:::-;14935:32;::::0;;;;::::1;::::0;::::1;1038:25:15::0;;;14935:21:14::1;::::0;::::1;::::0;::::1;::::0;1011:18:15;;14935:32:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;14984:9;14975:18;;14821:434;;;15014:12;15029:50;15049:6;15057:7;15066:12;15029:19;:50::i;:::-;15014:65;;15087:68;15119:6;15127:10;15139:4;15145:9;15087:31;:68::i;:::-;15176:35;15182:6;15190:5;15205:4;15176:5;:35::i;:::-;15219:29;::::0;;;;::::1;::::0;::::1;1038:25:15::0;;;15163:48:14;;-1:-1:-1;15219:21:14::1;::::0;::::1;::::0;-1:-1:-1;15219:21:14::1;::::0;1011:18:15;;15219:29:14::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15006:249;14821:434;15278:13;15268:6;:23;;15260:81;;;::::0;::::1;::::0;;5286:2:15;15260:81:14::1;::::0;::::1;5268:21:15::0;5325:2;5305:18;;;5298:30;5364:34;5344:18;;;5337:62;5435:15;5415:18;;;5408:43;5468:19;;15260:81:14::1;5084:409:15::0;15260:81:14::1;15347:43;15378:3;15383:6;15347:30;:43::i;6955:404::-:0;7173:12;7187;7153:9;1163:15;1151:8;:27;;1143:66;;;;;;;4347:2:15;1143:66:14;;;4329:21:15;4386:2;4366:18;;;4359:30;4425:28;4405:18;;;4398:56;4471:18;;1143:66:14;4145:350:15;1143:66:14;7228:126:::1;7259:3;7270:7;7285;7300:10;7318:11;7337;7228:23;:126::i;:::-;7207:147:::0;;;;-1:-1:-1;6955:404:14;-1:-1:-1;;;;;;;;;6955:404:14:o;8386:662::-;8594:4;8574:9;1163:15;1151:8;:27;;1143:66;;;;;;;4347:2:15;1143:66:14;;;4329:21:15;4386:2;4366:18;;;4359:30;4425:28;4405:18;;;4398:56;4471:18;;1143:66:14;4145:350:15;1143:66:14;8606:12:::1;8639:4;8628:15;;:7;:15;;::::0;8624:173:::1;;8660:51;8680:7;8689;8698:12;8660:19;:51::i;:::-;8653:58;;8624:173;;;8739:51;8759:7;8768;8777:12;8739:19;:51::i;:::-;8732:58;;8624:173;8802:70;8834:7;8843:10;8855:4;8861:10;8802:31;:70::i;:::-;8881:15;8900:28;8906:7;8915;8924:3;8900:5;:28::i;:::-;8878:50;;;8956:14;8942:10;:28;;8934:86;;;::::0;::::1;::::0;;5286:2:15;8934:86:14::1;::::0;::::1;5268:21:15::0;5325:2;5305:18;;;5298:30;5364:34;5344:18;;;5337:62;5435:15;5415:18;;;5408:43;5468:19;;8934:86:14::1;5084:409:15::0;8934:86:14::1;9033:10:::0;8386:662;-1:-1:-1;;;;;;;;;8386:662:14:o;440:430:13:-;743:24;;8053:66:15;8040:2;8036:15;;;8032:88;743:24:13;;;8020:101:15;553:12:13;;709:8;;8137:12:15;;743:24:13;;;;;;;;;;;;733:35;;;;;;784:13;654:175;;;;;;;;;8458:66:15;8446:79;;8562:2;8558:15;;;;8575:66;8554:88;8550:1;8541:11;;8534:109;8668:2;8659:12;;8652:28;;;;8705:2;8696:12;;8689:28;8742:2;8733:12;;8160:591;654:175:13;;;;;;;;;;;;;;631:210;;654:175;631:210;;;;;440:430;-1:-1:-1;;;;440:430:13:o;7462:195:14:-;7607:45;;;;;:22;9037:15:15;;;7607:45:14;;;9019:34:15;9089:15;;;9069:18;;;9062:43;9141:15;;;9121:18;;;9114:43;7558:10:14;;;;7619:4;7607:22;;;;8931:18:15;;7607:45:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7589:63;;;;-1:-1:-1;7462:195:14;-1:-1:-1;;;;7462:195:14:o;524:178:12:-;633:12;;;591;633;;;;;;;;;609:8;;;;625:6;;609:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;590:56;;;660:7;652:45;;;;;;;9976:2:15;652:45:12;;;9958:21:15;10015:2;9995:18;;;9988:30;10054:27;10034:18;;;10027:55;10099:18;;652:45:12;9774:349:15;652:45:12;584:118;524:178;;:::o;1720:1285:14:-;1958:37;;;;;:29;10292:55:15;;;1958:37:14;;;10274:74:15;-1:-1:-1;;;;;;1971:7:14;1958:29;;;;;;10247:18:15;;1958:37:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1943:52;-1:-1:-1;2005:18:14;;;2001:135;;2089:40;;;;;:32;10292:55:15;;;2089:40:14;;;10274:74:15;2102:7:14;2089:32;;;;10247:18:15;;2089:40:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2082:47;;2001:135;2142:12;2156:11;2181:4;2171:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2141:57;;;;2208:7;2219:1;2208:12;:27;;;;-1:-1:-1;2224:11:14;;2208:27;2204:797;;;2274:19;;-1:-1:-1;2295:18:14;;-1:-1:-1;2204:797:14;;;2335:22;2360:55;2378:19;2399:6;2407:7;2360:17;:55::i;:::-;2335:80;;2448:18;2427:17;:39;2423:572;;2507:14;2486:17;:35;;2478:88;;;;;;;10817:2:15;2478:88:14;;;10799:21:15;10856:2;10836:18;;;10829:30;10895:34;10875:18;;;10868:62;10966:10;10946:18;;;10939:38;10994:19;;2478:88:14;10615:404:15;2478:88:14;2605:19;;-1:-1:-1;2626:17:14;-1:-1:-1;2626:17:14;2423:572;;;2669:23;2695:54;2713:18;2733:7;2742:6;2695:17;:54::i;:::-;2669:80;;2788:19;2766:18;:41;;2759:49;;;;:::i;:::-;2848:15;2826:18;:37;;2818:90;;;;;;;11226:2:15;2818:90:14;;;11208:21:15;11265:2;11245:18;;;11238:30;11304:34;11284:18;;;11277:62;11375:10;11355:18;;;11348:38;11403:19;;2818:90:14;11024:404:15;2818:90:14;2947:18;-1:-1:-1;2967:18:14;;-1:-1:-1;2423:572:14;2327:674;2204:797;1937:1068;;;1720:1285;;;;;;;;:::o;114:406:12:-;244:1;223:6;:18;;;:22;215:60;;;;;;;11635:2:15;215:60:12;;;11617:21:15;11674:2;11654:18;;;11647:30;11713:27;11693:18;;;11686:55;11758:18;;215:60:12;11433:349:15;215:60:12;336:72;;;317:11;12068:15:15;;;336:72:12;;;12050:34:15;12120:15;;;12100:18;;;12093:43;12152:18;;;;12145:34;;;336:72:12;;;;;;;;;;11962:18:15;;;;336:72:12;;;;;;;;;359:28;336:72;;;317:97;;-1:-1:-1;;;;317:11:12;;;;:97;;336:72;317:97;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;281:133;;;;428:7;:57;;;;-1:-1:-1;440:11:12;;:16;;:44;;;471:4;460:24;;;;;;;;;;;;:::i;:::-;420:95;;;;;;;11635:2:15;420:95:12;;;11617:21:15;11674:2;11654:18;;;11647:30;11713:27;11693:18;;;11686:55;11758:18;;420:95:12;11433:349:15;420:95:12;209:311;;114:406;;;;:::o;706:368::-;817:1;796:6;:18;;;:22;788:56;;;;;;;12392:2:15;788:56:12;;;12374:21:15;12431:2;12411:18;;;12404:30;12470:23;12450:18;;;12443:51;12511:18;;788:56:12;12190:345:15;788:56:12;905:61;;;886:11;4692:55:15;;;905:61:12;;;4674:74:15;4764:18;;;;4757:34;;;905:61:12;;;;;;;;;;4647:18:15;;;;905:61:12;;;;;;;;;928:24;905:61;;;886:86;;-1:-1:-1;;;;886:11:12;;;;:86;;905:61;886:86;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;850:122;;;;986:7;:57;;;;-1:-1:-1;998:11:12;;:16;;:44;;;1029:4;1018:24;;;;;;;;;;;;:::i;:::-;978:91;;;;;;;12392:2:15;978:91:12;;;12374:21:15;12431:2;12411:18;;;12404:30;12470:23;12450:18;;;12443:51;12511:18;;978:91:12;12190:345:15;978:91:12;782:292;;706:368;;;:::o;5139:870:14:-;5317:12;;5372:4;5404:21;;;;;;;;5396:66;;;;;;;12742:2:15;5396:66:14;;;12724:21:15;;;12761:18;;;12754:30;12820:34;12800:18;;;12793:62;12872:18;;5396:66:14;12540:356:15;5396:66:14;5483:10;5472:21;;:7;:21;;;5468:537;;5524:146;5550:7;5567:10;5587;5607:11;5628;5657:4;5524:16;:146::i;:::-;5678:35;;;;;;;;1038:25:15;;;5503:167:14;;-1:-1:-1;5503:167:14;-1:-1:-1;5678:26:14;;;;;;1011:18:15;;5678:35:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5721:44;5752:3;5757:7;5721:30;:44::i;:::-;5773:50;5801:7;5810:3;5815:7;5773:27;:50::i;:::-;5468:537;;;5865:133;5891:7;5908;5925:10;5945:11;5966;5987:3;5865:16;:133::i;:::-;5844:154;;-1:-1:-1;5844:154:14;-1:-1:-1;5468:537:14;5345:664;5139:870;;;;;;;;;:::o;1186:120:13:-;1258:8;1299:2;1281:14;1293:2;1281:9;:14;:::i;:::-;1280:21;;;;:::i;:::-;1274:27;1186:120;-1:-1:-1;;;;1186:120:13:o;4512:623:14:-;4683:12;;4733:4;4683:12;4772:51;4792:7;4801;4810:12;4772:19;:51::i;:::-;4757:66;;4829:68;4861:4;4867:10;4879:5;4886:10;4829:31;:68::i;:::-;4924:46;;;;;:23;9037:15:15;;;4924:46:14;;;9019:34:15;9089:15;;;9069:18;;;9062:43;9141:15;;;9121:18;;;9114:43;4924:23:14;;;;;8931:18:15;;4924:46:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4903:67;;-1:-1:-1;4903:67:14;-1:-1:-1;4984:22:14;;;;4976:74;;;;;;;13555:2:15;4976:74:14;;;13537:21:15;13594:2;13574:18;;;13567:30;13633:34;13613:18;;;13606:62;13704:9;13684:18;;;13677:37;13731:19;;4976:74:14;13353:403:15;4976:74:14;5075:11;5064:7;:22;;5056:74;;;;;;;13963:2:15;5056:74:14;;;13945:21:15;14002:2;13982:18;;;13975:30;14041:34;14021:18;;;14014:62;14112:9;14092:18;;;14085:37;14139:19;;5056:74:14;13761:403:15;5056:74:14;4711:424;;4512:623;;;;;;;;;:::o;14:184:15:-;66:77;63:1;56:88;163:4;160:1;153:15;187:4;184:1;177:15;203:154;289:42;282:5;278:54;271:5;268:65;258:93;;347:1;344;337:12;258:93;203:154;:::o;362:525::-;448:6;456;464;472;525:3;513:9;504:7;500:23;496:33;493:53;;;542:1;539;532:12;493:53;581:9;568:23;600:31;625:5;600:31;:::i;:::-;650:5;-1:-1:-1;707:2:15;692:18;;679:32;720:33;679:32;720:33;:::i;:::-;362:525;;772:7;;-1:-1:-1;;;;826:2:15;811:18;;798:32;;877:2;862:18;849:32;;362:525::o;1074:663::-;1178:6;1186;1194;1202;1210;1218;1271:3;1259:9;1250:7;1246:23;1242:33;1239:53;;;1288:1;1285;1278:12;1239:53;1327:9;1314:23;1346:31;1371:5;1346:31;:::i;:::-;1396:5;-1:-1:-1;1453:2:15;1438:18;;1425:32;1466:33;1425:32;1466:33;:::i;:::-;1074:663;;1518:7;;-1:-1:-1;;;;1572:2:15;1557:18;;1544:32;;1623:2;1608:18;;1595:32;;1674:3;1659:19;;1646:33;;-1:-1:-1;1726:3:15;1711:19;;;1698:33;;-1:-1:-1;1074:663:15:o;1742:594::-;1837:6;1845;1853;1861;1869;1922:3;1910:9;1901:7;1897:23;1893:33;1890:53;;;1939:1;1936;1929:12;1890:53;1978:9;1965:23;1997:31;2022:5;1997:31;:::i;:::-;2047:5;-1:-1:-1;2104:2:15;2089:18;;2076:32;2117:33;2076:32;2117:33;:::i;:::-;1742:594;;2169:7;;-1:-1:-1;;;;2223:2:15;2208:18;;2195:32;;2274:2;2259:18;;2246:32;;2325:3;2310:19;;;2297:33;;-1:-1:-1;1742:594:15:o;2341:736::-;2445:6;2453;2461;2469;2477;2485;2538:3;2526:9;2517:7;2513:23;2509:33;2506:53;;;2555:1;2552;2545:12;2506:53;2594:9;2581:23;2613:31;2638:5;2613:31;:::i;:::-;2663:5;-1:-1:-1;2720:2:15;2705:18;;2692:32;2733:33;2692:32;2733:33;:::i;:::-;2785:7;-1:-1:-1;2844:2:15;2829:18;;2816:32;2857:33;2816:32;2857:33;:::i;:::-;2341:736;;;;-1:-1:-1;2909:7:15;;2963:2;2948:18;;2935:32;;-1:-1:-1;3014:3:15;2999:19;;2986:33;;3066:3;3051:19;;;3038:33;;-1:-1:-1;2341:736:15;-1:-1:-1;;2341:736:15:o;3082:805::-;3195:6;3203;3211;3219;3227;3235;3243;3296:3;3284:9;3275:7;3271:23;3267:33;3264:53;;;3313:1;3310;3303:12;3264:53;3352:9;3339:23;3371:31;3396:5;3371:31;:::i;:::-;3421:5;-1:-1:-1;3478:2:15;3463:18;;3450:32;3491:33;3450:32;3491:33;:::i;:::-;3543:7;-1:-1:-1;3602:2:15;3587:18;;3574:32;3615:33;3574:32;3615:33;:::i;:::-;3082:805;;;;-1:-1:-1;3667:7:15;;3721:2;3706:18;;3693:32;;-1:-1:-1;3772:3:15;3757:19;;3744:33;;3824:3;3809:19;;3796:33;;-1:-1:-1;3876:3:15;3861:19;;;3848:33;;-1:-1:-1;3082:805:15;-1:-1:-1;;3082:805:15:o;4802:277::-;4869:6;4922:2;4910:9;4901:7;4897:23;4893:32;4890:52;;;4938:1;4935;4928:12;4890:52;4970:9;4964:16;5023:5;5016:13;5009:21;5002:5;4999:32;4989:60;;5045:1;5042;5035:12;4989:60;5068:5;4802:277;-1:-1:-1;;;4802:277:15:o;5911:245::-;5990:6;5998;6051:2;6039:9;6030:7;6026:23;6022:32;6019:52;;;6067:1;6064;6057:12;6019:52;-1:-1:-1;;6090:16:15;;6146:2;6131:18;;;6125:25;6090:16;;6125:25;;-1:-1:-1;5911:245:15:o;6161:184::-;6231:6;6284:2;6272:9;6263:7;6259:23;6255:32;6252:52;;;6300:1;6297;6290:12;6252:52;-1:-1:-1;6323:16:15;;6161:184;-1:-1:-1;6161:184:15:o;6754:::-;6806:77;6803:1;6796:88;6903:4;6900:1;6893:15;6927:4;6924:1;6917:15;6943:128;7010:9;;;7031:11;;;7028:37;;;7045:18;;:::i;:::-;6943:128;;;;:::o;9357:412::-;9486:3;9524:6;9518:13;9549:1;9559:129;9573:6;9570:1;9567:13;9559:129;;;9671:4;9655:14;;;9651:25;;9645:32;9632:11;;;9625:53;9588:12;9559:129;;;-1:-1:-1;9743:1:15;9707:16;;9732:13;;;-1:-1:-1;9707:16:15;9357:412;-1:-1:-1;9357:412:15:o;10359:251::-;10429:6;10482:2;10470:9;10461:7;10457:23;10453:32;10450:52;;;10498:1;10495;10488:12;10450:52;10530:9;10524:16;10549:31;10574:5;10549:31;:::i;12901:168::-;12974:9;;;13005;;13022:15;;;13016:22;;13002:37;12992:71;;13043:18;;:::i;13074:274::-;13114:1;13140;13130:189;;13175:77;13172:1;13165:88;13276:4;13273:1;13266:15;13304:4;13301:1;13294:15;13130:189;-1:-1:-1;13333:9:15;;13074:274::o

Swarm Source

ipfs://b4a875164cf612857c9da07799465c7c18f71c3826b75cccdf197f92399f6206

Block Transaction Gas Used Reward
view all blocks sequenced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.