ETH Price: $3,375.93 (-2.37%)

Contract

0x83c3ABC8e656D07e38Bd2c62BB155968db4061C2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Remove Liquidity183342742023-10-12 12:15:59441 days ago1697112959IN
0x83c3ABC8...8db4061C2
0 ETH0.000948716.02830204
Remove Liquidity180143682023-08-28 16:35:35486 days ago1693240535IN
0x83c3ABC8...8db4061C2
0 ETH0.0047646833.98276208
Remove Liquidity180143492023-08-28 16:31:47486 days ago1693240307IN
0x83c3ABC8...8db4061C2
0 ETH0.0059066834.79494032
Remove Liquidity180143162023-08-28 16:25:11486 days ago1693239911IN
0x83c3ABC8...8db4061C2
0 ETH0.0052337937.27293734
Remove Liquidity180142612023-08-28 16:13:59486 days ago1693239239IN
0x83c3ABC8...8db4061C2
0 ETH0.0061731145.52984388
Remove Liquidity180142462023-08-28 16:10:59486 days ago1693239059IN
0x83c3ABC8...8db4061C2
0 ETH0.0068648448.94649264
Remove Liquidity179860082023-08-24 17:19:47490 days ago1692897587IN
0x83c3ABC8...8db4061C2
0 ETH0.0036448328.56879803
Remove Liquidity179859992023-08-24 17:17:59490 days ago1692897479IN
0x83c3ABC8...8db4061C2
0 ETH0.0041574227.84367661
Remove Liquidity179859542023-08-24 17:08:59490 days ago1692896939IN
0x83c3ABC8...8db4061C2
0 ETH0.0052109631.43568996
Remove Liquidity179859302023-08-24 17:04:11490 days ago1692896651IN
0x83c3ABC8...8db4061C2
0 ETH0.0041066226.9274577
Remove Liquidity179859122023-08-24 17:00:35490 days ago1692896435IN
0x83c3ABC8...8db4061C2
0 ETH0.00481135.13090445
Remove Liquidity179828412023-08-24 6:41:35490 days ago1692859295IN
0x83c3ABC8...8db4061C2
0 ETH0.0031227517.02439346
Remove Liquidity179827952023-08-24 6:32:11490 days ago1692858731IN
0x83c3ABC8...8db4061C2
0 ETH0.0032574417.75600556
Swap Exact Token...179760912023-08-23 8:03:35491 days ago1692777815IN
0x83c3ABC8...8db4061C2
0 ETH0.0035159517.92627134
Swap Exact ETH F...179749032023-08-23 4:04:23491 days ago1692763463IN
0x83c3ABC8...8db4061C2
0.01 ETH0.0031788317.99214545
Swap Exact Token...179733472023-08-22 22:50:59492 days ago1692744659IN
0x83c3ABC8...8db4061C2
0 ETH0.0033596425.53694404
Swap Exact ETH F...179724592023-08-22 19:52:11492 days ago1692733931IN
0x83c3ABC8...8db4061C2
0.4 ETH0.0048221327.75026338
Swap Exact Token...179724062023-08-22 19:41:35492 days ago1692733295IN
0x83c3ABC8...8db4061C2
0 ETH0.0033858428.3756979
Swap Exact Token...179715522023-08-22 16:49:59492 days ago1692722999IN
0x83c3ABC8...8db4061C2
0 ETH0.0089982346.9720048
Remove Liquidity179494992023-08-19 14:45:35495 days ago1692456335IN
0x83c3ABC8...8db4061C2
0 ETH0.0018740313.65477425
Remove Liquidity179494912023-08-19 14:43:59495 days ago1692456239IN
0x83c3ABC8...8db4061C2
0 ETH0.001834613.40383301
Remove Liquidity179494862023-08-19 14:42:59495 days ago1692456179IN
0x83c3ABC8...8db4061C2
0 ETH0.0018972513.83543384
Remove Liquidity179494752023-08-19 14:40:47495 days ago1692456047IN
0x83c3ABC8...8db4061C2
0 ETH0.0019593314.30738192
Remove Liquidity179494702023-08-19 14:39:47495 days ago1692455987IN
0x83c3ABC8...8db4061C2
0 ETH0.0020022314.27957422
Remove Liquidity179494632023-08-19 14:38:23495 days ago1692455903IN
0x83c3ABC8...8db4061C2
0 ETH0.0022294214.93362415
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
180143492023-08-28 16:31:47486 days ago1693240307
0x83c3ABC8...8db4061C2
10.2918371 ETH
180143492023-08-28 16:31:47486 days ago1693240307
0x83c3ABC8...8db4061C2
10.2918371 ETH
179859542023-08-24 17:08:59490 days ago1692896939
0x83c3ABC8...8db4061C2
7.30161383 ETH
179859542023-08-24 17:08:59490 days ago1692896939
0x83c3ABC8...8db4061C2
7.30161383 ETH
179828412023-08-24 6:41:35490 days ago1692859295
0x83c3ABC8...8db4061C2
5.03149012 ETH
179828412023-08-24 6:41:35490 days ago1692859295
0x83c3ABC8...8db4061C2
5.03149012 ETH
179827952023-08-24 6:32:11490 days ago1692858731
0x83c3ABC8...8db4061C2
29.02430816 ETH
179827952023-08-24 6:32:11490 days ago1692858731
0x83c3ABC8...8db4061C2
29.02430816 ETH
179749032023-08-23 4:04:23491 days ago1692763463
0x83c3ABC8...8db4061C2
0.01 ETH
179724592023-08-22 19:52:11492 days ago1692733931
0x83c3ABC8...8db4061C2
0.4 ETH
179715522023-08-22 16:49:59492 days ago1692722999
0x83c3ABC8...8db4061C2
0.28847958 ETH
179715522023-08-22 16:49:59492 days ago1692722999
0x83c3ABC8...8db4061C2
0.28847958 ETH
179488142023-08-19 12:27:23495 days ago1692448043
0x83c3ABC8...8db4061C2
0.6421382 ETH
179488142023-08-19 12:27:23495 days ago1692448043
0x83c3ABC8...8db4061C2
0.6421382 ETH
177509372023-07-22 20:05:47523 days ago1690056347
0x83c3ABC8...8db4061C2
0.60704866 ETH
177509372023-07-22 20:05:47523 days ago1690056347
0x83c3ABC8...8db4061C2
0.60704866 ETH
177346352023-07-20 13:20:47525 days ago1689859247
0x83c3ABC8...8db4061C2
0.31986124 ETH
177346352023-07-20 13:20:47525 days ago1689859247
0x83c3ABC8...8db4061C2
0.31986124 ETH
177056062023-07-16 11:39:11529 days ago1689507551
0x83c3ABC8...8db4061C2
0.83649699 ETH
177056062023-07-16 11:39:11529 days ago1689507551
0x83c3ABC8...8db4061C2
0.83649699 ETH
176519172023-07-08 22:09:35537 days ago1688854175
0x83c3ABC8...8db4061C2
0.18682765 ETH
176519172023-07-08 22:09:35537 days ago1688854175
0x83c3ABC8...8db4061C2
0.18682765 ETH
176412572023-07-07 10:12:59538 days ago1688724779
0x83c3ABC8...8db4061C2
0.45838905 ETH
176412572023-07-07 10:12:59538 days ago1688724779
0x83c3ABC8...8db4061C2
0.45838905 ETH
176355042023-07-06 14:50:23539 days ago1688655023
0x83c3ABC8...8db4061C2
0.00000036 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XfaiV0Periphery02

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 13: XfaiV0Periphery02.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.19;

import './IXfaiV0Core.sol';
import './IXfaiPool.sol';
import './IXfaiV0Periphery02.sol';
import './IXfaiFactory.sol';
import './IXFETH.sol';
import './IXfaiINFT.sol';
import './IERC20.sol';
import './IWETH.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');
  }
}


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);
  }
}


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

  /**
   * @notice The address of the xfETH token
   */
  address private immutable xfETH;

  /**
   * @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, 'XfaiV0Periphery02: EXPIRED');
    _;
  }

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

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

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

  function _getLiquidityAmounts(
    address _token,
    uint _amountTokenDesired,
    uint _amountXfETHDesired,
    uint _amountTokenMin,
    uint _amountXfETHMin
  ) internal returns (uint amountToken, uint amountXfETH) {
    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, amountXfETH) = (_amountTokenDesired, _amountXfETHDesired);
    } else {
      uint amountXfETHOptimal = XfaiLibrary.quote(_amountTokenDesired, weight, reserve);
      if (amountXfETHOptimal <= _amountXfETHDesired) {
        require(amountXfETHOptimal >= _amountXfETHMin, 'XfaiV0Periphery02: INSUFFICIENT_1_AMOUNT');
        (amountToken, amountXfETH) = (_amountTokenDesired, amountXfETHOptimal);
      } else {
        uint amountTokenOptimal = XfaiLibrary.quote(_amountXfETHDesired, reserve, weight);
        assert(amountTokenOptimal <= _amountTokenDesired);
        require(amountTokenOptimal >= _amountTokenMin, 'XfaiV0Periphery02: INSUFFICIENT_0_AMOUNT');
        (amountToken, amountXfETH) = (amountTokenOptimal, _amountXfETHDesired);
      }
    }
  }

  function _addLiquidity(
    address _token,
    uint _amountTokenDesired,
    uint _amountETHDesired,
    uint _amountTokenMin,
    uint _amountETHMin
  ) internal returns (uint amountToken, uint amountETH) {
    address _xfETH = xfETH; // gas saving
    uint amountXfETH;
    (amountToken, amountXfETH) = _getLiquidityAmounts(
      _token,
      _amountTokenDesired,
      IXFETH(_xfETH).ETHToXfETH(_amountETHDesired),
      _amountTokenMin,
      IXFETH(_xfETH).ETHToXfETH(_amountETHMin)
    );
    amountETH = IXFETH(_xfETH).xfETHToETH(amountXfETH);
  }

  /**
   * @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) = _addLiquidity(
      _token,
      _amountTokenDesired,
      msg.value,
      _amountTokenMin,
      _amountETHMin
    );
    TransferHelper.safeTransferFrom(_token, msg.sender, pool, amount0);
    uint amountXfETH = IXFETH(xfETH).deposit{value: amount1}();
    TransferHelper.safeTransfer(xfETH, pool, amountXfETH);
    liquidity = IXfaiV0Core(core).mint(_token, _to);
    // refund dust eth, if any
    if (msg.value > amount1) TransferHelper.safeTransferETH(msg.sender, msg.value - amount1);
  }

  /**
   * @notice Provide one-sided liquidity to the ETH pool
   * @dev A given amount of ETH get consumed and a given amount of liquidity tokens is minted
   * @param _to The address of the recipient
   * @param _deadline The UTC timestamp that if reached, causes the transaction to fail automatically
   */
  function addLiquidityETH(
    address _to,
    uint _deadline,
    uint _amountETHMin,
    uint _amountXfETHMin
  ) external payable override ensure(_deadline) returns (uint liquidity) {
    address _weth = weth; // gas saving
    address _xfeth = xfETH; // gas saving
    uint amountETH;
    uint amountXfETHtoETH;
    address pool = IXfaiFactory(factory).getPool(_weth);
    if (pool == address(0)) {
      // create the pool if it doesn't exist yet
      pool = IXfaiFactory(factory).createPool(_weth);
    }
    {
      (uint ETHReserve, uint xfETHReserve) = IXfaiPool(pool).getStates();
      if (ETHReserve == 0 && xfETHReserve == 0) {
        (amountETH, amountXfETHtoETH) = (msg.value / 2, msg.value / 2);
      } else {
        amountETH =
          (msg.value * ETHReserve) /
          (ETHReserve + IXFETH(_xfeth).xfETHToETH(xfETHReserve));
        amountXfETHtoETH = msg.value - amountETH;
      }
    }
    uint amountXfETH = IXFETH(_xfeth).deposit{value: amountXfETHtoETH}();
    require(amountETH >= _amountETHMin, 'XfaiV0Periphery02: INSUFFICIENT_0_AMOUNT');
    require(amountXfETH >= _amountXfETHMin, 'XfaiV0Periphery02: INSUFFICIENT_0_AMOUNT');
    IWETH(_weth).deposit{value: amountETH}();
    TransferHelper.safeTransfer(_xfeth, pool, amountXfETH);
    TransferHelper.safeTransfer(_weth, pool, amountETH);
    liquidity = IXfaiV0Core(core).mint(_weth, _to);
    require(msg.value == amountETH + amountXfETHtoETH, 'XfaiV0Periphery02: INSUFFICIENT_AMOUNT');
  }

  // **** 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, 'XfaiV0Periphery02: INSUFFICIENT_AMOUNT0');
    require(amount1 >= _amount1Min, 'XfaiV0Periphery02: 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
    if (_token0 == wrappedETH && _token1 == wrappedETH) {
      (amount0, amount1) = _removeLiquidity(
        _token0,
        xfETH,
        _liquidity,
        _amount0Min,
        _amount1Min,
        address(this)
      );
      IWETH(_token0).withdraw(amount0);
      uint amountInETH = IXFETH(xfETH).withdraw(amount1);
      TransferHelper.safeTransferETH(_to, amount0 + amountInETH);
    } else if (_token0 == wrappedETH) {
      (amount0, amount1) = _removeLiquidity(
        _token0,
        _token1,
        _liquidity,
        _amount0Min,
        _amount1Min,
        address(this)
      );
      IWETH(_token0).withdraw(amount0);
      TransferHelper.safeTransferETH(_to, amount0);
      TransferHelper.safeTransfer(_token1, _to, amount1);
    } else if (_token1 == wrappedETH) {
      (amount0, amount1) = _removeLiquidity(
        _token0,
        xfETH,
        _liquidity,
        _amount0Min,
        _amount1Min,
        address(this)
      );
      uint amountInETH = IXFETH(xfETH).withdraw(amount1);
      TransferHelper.safeTransferETH(_to, amountInETH);
      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 == xfETH) {
      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, 'XfaiV0Periphery02: 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 == xfETH) {
      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 == xfETH) {
      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, 'XfaiV0Periphery02: 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 _token1 An ERC20 token address
   * @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 swap transaction to fail automatically
   */
  function swapExactETHForTokens(
    address _to,
    address _token1,
    uint _amount1OutMin,
    uint _deadline
  ) external payable override ensure(_deadline) returns (uint amount1Out) {
    address wrappedETH = weth; // gas savings
    uint amount0In = msg.value;
    address pool0 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash);
    IWETH(wrappedETH).deposit{value: amount0In}();
    assert(IWETH(weth).transfer(pool0, amount0In));
    if (_token1 == xfETH) {
      (, amount1Out) = _swap(wrappedETH, xfETH, _to);
    } else {
      (, amount1Out) = _swap(wrappedETH, _token1, _to);
    }
    require(amount1Out >= _amount1OutMin, 'XfaiV0Periphery02: 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 _token0 An ERC20 token address
   * @param _amount1Out The amount of ether 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 swapTokensForExactETH(
    address _to,
    address _token0,
    uint _amount1Out,
    uint _amount0InMax,
    uint _deadline
  ) external override ensure(_deadline) returns (uint amount0In) {
    address wrappedETH = weth; // gas savings
    address pool0;
    if (_token0 == xfETH) {
      pool0 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash);
      (uint r, uint w) = IXfaiPool(pool0).getStates();
      amount0In = XfaiLibrary.getAmountIn(w, r, _amount1Out, IXfaiV0Core(core).getTotalFee());
    } else {
      pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash);
      amount0In = XfaiLibrary.getAmountsIn(
        pool0,
        XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash),
        _amount1Out,
        IXfaiV0Core(core).getTotalFee()
      );
    }
    require(amount0In <= _amount0InMax, 'XfaiV0Periphery02: INSUFFICIENT_INPUT_AMOUNT');
    TransferHelper.safeTransferFrom(_token0, msg.sender, pool0, amount0In);
    _swap(_token0, wrappedETH, address(this));
    IWETH(wrappedETH).withdraw(_amount1Out);
    TransferHelper.safeTransferETH(_to, _amount1Out);
    return amount0In;
  }

  /**
   * @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 _token0 An ERC20 token address
   * @param _amount0In The amount of _token0 to be swapped
   * @param _amount1OutMin 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 _token0,
    uint _amount0In,
    uint _amount1OutMin,
    uint _deadline
  ) external override ensure(_deadline) returns (uint amount1Out) {
    address pool0;
    address wrappedETH = weth;
    if (_token0 == xfETH) {
      pool0 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash);
    } else {
      pool0 = XfaiLibrary.poolFor(_token0, factory, poolCodeHash);
    }
    TransferHelper.safeTransferFrom(_token0, msg.sender, pool0, _amount0In);
    (, amount1Out) = _swap(_token0, wrappedETH, address(this));
    require(amount1Out >= _amount1OutMin, 'XfaiV0Periphery02: INSUFFICIENT_OUTPUT_AMOUNT');
    IWETH(wrappedETH).withdraw(amount1Out);
    TransferHelper.safeTransferETH(_to, amount1Out);
  }

  /**
   * @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 _token1 An ERC20 token address
   * @param _amount1Out 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 _token1,
    uint _amount1Out,
    uint _deadline
  ) external payable override ensure(_deadline) returns (uint input) {
    address wrappedETH = weth; // gas savings
    address pool0 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash);
    address pool1;
    if (_token1 == xfETH) {
      pool1 = XfaiLibrary.poolFor(wrappedETH, factory, poolCodeHash);
      (uint r, uint w) = IXfaiPool(pool1).getStates();
      input = XfaiLibrary.getAmountIn(r, w, _amount1Out, IXfaiV0Core(core).getTotalFee());
    } else {
      pool1 = XfaiLibrary.poolFor(_token1, factory, poolCodeHash);
      input = XfaiLibrary.getAmountsIn(pool0, pool1, _amount1Out, IXfaiV0Core(core).getTotalFee());
    }
    require(input <= msg.value, 'XfaiV0Periphery02: INSUFFICIENT_INPUT_AMOUNT');
    IWETH(wrappedETH).deposit{value: input}();
    assert(IWETH(weth).transfer(pool0, input));
    _swap(wrappedETH, _token1, _to);
    // refund dust eth, if any
    if (msg.value > input) TransferHelper.safeTransferETH(msg.sender, msg.value - input);
  }
}

File 2 of 13: 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 3 of 13: 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 4 of 13: 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 5 of 13: 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 6 of 13: 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 7 of 13: 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 8 of 13: 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 9 of 13: 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 10 of 13: 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 11 of 13: 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 _amount, 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 amount);
  event LpFeeChange(uint newFee);
  event InfinityNFTFeeChange(uint newFee);
  event Paused(bool p);
}

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

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

  function addLiquidityETH(
    address _to,
    uint _deadline,
    uint _amountETHMin,
    uint _amountXfETHMin
  ) 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 _token1,
    uint _amount1OutMin,
    uint _deadline
  ) external payable returns (uint);

  function swapTokensForExactETH(
    address _to,
    address _token0,
    uint _amount1Out,
    uint _amount0InMax,
    uint _deadline
  ) external returns (uint amount0In);

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

  function swapETHForExactTokens(
    address _to,
    address _token1,
    uint _amount1Out,
    uint _deadline
  ) external payable returns (uint input);
}

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

import './IERC20Metadata.sol';

interface IXFETH is IERC20Metadata {
  event Deposit(address indexed dst, uint amountXfETH, uint amountETH);
  event Withdrawal(address indexed src, uint amountETH);
  event FlashMint(address indexed dst, uint amountXfETH);
  event FeeChange(uint newFee);
  event OwnerChange(address newOwner);
  event ArbitrageurChange(address arbitrageur);
  event StatusChange(bool state);

  function owner() external view returns (address _owner);

  function flashMintFee() external view returns (uint _flashMintFee);

  function setStatus(bool _state) external;

  function setOwner(address _newOwner) external;

  function setArbitrageur(address _arbitrageur) external;

  function setFlashMintFee(uint _newFee) external;

  function xfETHToETH(uint _xfETHAmount) external view returns (uint _ETH);

  function ETHToXfETH(uint _ETHAmount) external view returns (uint _xfETH);

  function deposit() external payable returns (uint amountInXfETH);

  function withdraw(uint _liquidity) external returns (uint amountInETH);

  function flashMint(uint _amount) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_xfETH","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":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint256","name":"_amountETHMin","type":"uint256"},{"internalType":"uint256","name":"_amountXfETHMin","type":"uint256"}],"name":"addLiquidityETH","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":"_token1","type":"address"},{"internalType":"uint256","name":"_amount1Out","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":"_token1","type":"address"},{"internalType":"uint256","name":"_amount1OutMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256","name":"amount1Out","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"uint256","name":"_amount0In","type":"uint256"},{"internalType":"uint256","name":"_amount1OutMin","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256","name":"amount1Out","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":"_token0","type":"address"},{"internalType":"uint256","name":"_amount1Out","type":"uint256"},{"internalType":"uint256","name":"_amount0InMax","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256","name":"amount0In","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"}]

6101206040523480156200001257600080fd5b50604051620042e7380380620042e7833981016040819052620000359162000151565b6001600160a01b038316608081905260408051637f86e3b960e01b81529051637f86e3b9916004808201926020929091908290030181865afa15801562000080573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a691906200019b565b6001600160a01b0390811660c05281811660a05282811660e0526040805163554dcae760e01b815290519185169163554dcae7916004808201926020929091908290030181865afa15801562000100573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001269190620001c0565b6101005250620001da915050565b80516001600160a01b03811681146200014c57600080fd5b919050565b6000806000606084860312156200016757600080fd5b620001728462000134565b9250620001826020850162000134565b9150620001926040850162000134565b90509250925092565b600060208284031215620001ae57600080fd5b620001b98262000134565b9392505050565b600060208284031215620001d357600080fd5b5051919050565b60805160a05160c05160e05161010051613ed262000415600039600081816102fc01528181610632015281816106d4015281816108d501528181610cbf01528181610f9e0152818161119f0152818161120701528181611587015281816115d40152818161182801528181611972015281816119bf015281816123e401528181612436015281816127070152818161275901526138c701526000818160b7015281816102b3015281816103cc015281816105ea01528181610b8401528181610f1601528181611c850152818161235e01526130c301526000818161078e0152818161091a01528181610e13015281816110580152818161122e0152818161168e015281816118e201528181611a04015281816121d70152818161298f015261388001526000818160f60152818161044b015281816104a20152818161065c01528181610d0901528181610da001528181610f4e0152818161150f015281816117b001528181611caf015281816123940152818161268f01528181612af7015281816131400152818161321e015281816133d0015261342f0152600081816102db01528181610611015281816106b3015281816108b401528181610c9e01528181610f7d0152818161117e015281816111e601528181611566015281816115b301528181611807015281816119510152818161199e01528181611cd801528181611da7015281816123c301528181612415015281816126e601528181612738015281816135340152818161360301526138a60152613ed26000f3fe60806040526004361061009a5760003560e01c8063515a22d311610069578063b1f0d8401161004e578063b1f0d840146101ca578063cb7cfbe7146101ea578063f448a6161461021f57600080fd5b8063515a22d3146101975780635625d383146101b757600080fd5b806312d4b07c1461012b578063293b15a9146101515780633351733f14610164578063433182141461017757600080fd5b36610126573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148061011857503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b61012457610124613aeb565b005b600080fd5b61013e610139366004613b3f565b61023f565b6040519081526020015b60405180910390f35b61013e61015f366004613b3f565b61057b565b61013e610172366004613b85565b610c29565b34801561018357600080fd5b5061013e610192366004613bde565b610ea7565b3480156101a357600080fd5b5061013e6101b2366004613c2f565b61149d565b61013e6101c5366004613c94565b611bdb565b3480156101d657600080fd5b5061013e6101e5366004613bde565b6122ed565b3480156101f657600080fd5b5061020a610205366004613ccf565b612591565b60408051928352602083019190915201610148565b34801561022b57600080fd5b5061013e61023a366004613c2f565b61261e565b600081428110156102b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064015b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000346000610320837f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90508273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561036a57600080fd5b505af115801561037e573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018790527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d9190613d3d565b61044957610449613aeb565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036104d0576104c7837f00000000000000000000000000000000000000000000000000000000000000008b612935565b95506104df9050565b6104db83898b612935565b9550505b8685101561056f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b50505050949350505050565b600081428110156105e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b7f00000000000000000000000000000000000000000000000000000000000000006000610656827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036108ae576106f8837f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01283838c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081b9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015610881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a59190613d8a565b96505050610a4a565b6108f9887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be4483838a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015610a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a479190613d8a565b94505b34851115610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b8273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b2257600080fd5b505af1158015610b36573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018a90527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf59190613d3d565b610c0157610c01613aeb565b610c0c83898b612935565b50508434111561056f5761056f33610c248734613dd2565b612a07565b60008142811015610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6000610ce3887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b9050600080610cf58a8a348b8b612af0565b91509150610d058a338585612cd3565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b815260040160206040518083038185885af1158015610d74573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d999190613d8a565b9050610dc67f00000000000000000000000000000000000000000000000000000000000000008583612ecd565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301528d811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ee1fe2ad906044016020604051808303816000875af1158015610e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e809190613d8a565b955081341115610e9857610e9833610c248434613dd2565b50505050509695505050505050565b60008142811015610f14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b7f0000000000000000000000000000000000000000000000000000000000000000600073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169089160361117857610fc2827f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110359190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01282848c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e59190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190613d8a565b9550505061135e565b6111c3887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be448261122b857f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b8a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190613d8a565b93505b858411156113ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b6113fa88338387612cd3565b611405888330612935565b50506040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff831690632e1a7d4d90602401600060405180830381600087803b15801561146f57600080fd5b505af1158015611483573d6000803e3d6000fd5b505050506114918988612a07565b50505095945050505050565b6000814281101561150a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036117ae576115ab887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b91506115f8887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01282848c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171b9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015611781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a59190613d8a565b95505050611b34565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff160361194b5761184c897f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b91506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa15801561189b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bf9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01283838c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f7573d6000803e3d6000fd5b611996897f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b91506119e3887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be4483838a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a919190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b319190613d8a565b93505b85841115611bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b611bd089338487612cd3565b610e9889898c612935565b60008342811015611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008181166004840152917f000000000000000000000000000000000000000000000000000000000000000091600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190613deb565b905073ffffffffffffffffffffffffffffffffffffffff8116611e17576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f00000000000000000000000000000000000000000000000000000000000000001690639049f9d2906024016020604051808303816000875af1158015611df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e149190613deb565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e889190613d66565b91509150816000148015611e9a575080155b15611ebf57611eaa600234613e08565b611eb5600234613e08565b9095509350611f7b565b6040517fa398030d0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff87169063a398030d90602401602060405180830381865afa158015611f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4e9190613d8a565b611f589083613e43565b611f628334613e56565b611f6c9190613e08565b9450611f788534613dd2565b93505b505060008473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b815260040160206040518083038185885af1158015611fcc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ff19190613d8a565b905089841015612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b88811015612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b8573ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215b57600080fd5b505af115801561216f573d6000803e3d6000fd5b505050505061217f858383612ecd565b61218a868386612ecd565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528d811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ee1fe2ad906044016020604051808303816000875af1158015612220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122449190613d8a565b97506122508385613e43565b34146122de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016102a8565b50505050505050949350505050565b6000814281101561235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081169089160361240f57612408817f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b915061245d565b61245a887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b91505b6124698833848a612cd3565b612474888230612935565b94505085841015612507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b15801561256f57600080fd5b505af1158015612583573d6000803e3d6000fd5b505050506114918985612a07565b60008082428110156125ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b61260d8a8a8a8a8a8a6130be565b909b909a5098505050505050505050565b6000814281101561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036127325761272b877f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b9050612780565b61277d887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90505b61278c88338389612cd3565b600061279989898c612935565b9150508581101561282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b9998505050505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152600090839060340160405160208183030381529060405280519060200120836040516020016128f7939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6040517f9331621200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528381166024830152828116604483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063933162129060640160408051808303816000875af11580156129d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fb9190613d66565b90969095509350505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8416908390604051612a3e9190613e6d565b60006040518083038185875af1925050503d8060008114612a7b576040519150601f19603f3d011682016040523d82523d6000602084013e612a80565b606091505b5050905080612aeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a204554485f5452414e534645525f4641494c45440000000000000060448201526064016102a8565b505050565b60008060007f000000000000000000000000000000000000000000000000000000000000000090506000612c3189898473ffffffffffffffffffffffffffffffffffffffff1663b3c174048b6040518263ffffffff1660e01b8152600401612b5a91815260200190565b602060405180830381865afa158015612b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9b9190613d8a565b6040517fb3c17404000000000000000000000000000000000000000000000000000000008152600481018a90528a9073ffffffffffffffffffffffffffffffffffffffff88169063b3c1740490602401602060405180830381865afa158015612c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2c9190613d8a565b6134e8565b6040517fa398030d00000000000000000000000000000000000000000000000000000000815260048101829052919550915073ffffffffffffffffffffffffffffffffffffffff83169063a398030d90602401602060405180830381865afa158015612ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc59190613d8a565b925050509550959350505050565b60008473ffffffffffffffffffffffffffffffffffffffff163b11612d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c45440000000000000060448201526064016102a8565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691612df39190613e6d565b6000604051808303816000865af19150503d8060008114612e30576040519150601f19603f3d011682016040523d82523d6000602084013e612e35565b606091505b5091509150818015612e5f575080511580612e5f575080806020019051810190612e5f9190613d3d565b612ec5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c45440000000000000060448201526064016102a8565b505050505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b11612f4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c4544000000000000000000000060448201526064016102a8565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691612fe59190613e6d565b6000604051808303816000865af19150503d8060008114613022576040519150601f19603f3d011682016040523d82523d6000602084013e613027565b606091505b50915091508180156130515750805115806130515750808060200190518101906130519190613d3d565b6130b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c4544000000000000000000000060448201526064016102a8565b5050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff88811690821614801561313557508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b156132b757613168887f00000000000000000000000000000000000000000000000000000000000000008888883061387b565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101839052919450925073ffffffffffffffffffffffffffffffffffffffff891690632e1a7d4d90602401600060405180830381600087803b1580156131d557600080fd5b505af11580156131e9573d6000803e3d6000fd5b50506040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101859052600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169150632e1a7d4d906024016020604051808303816000875af115801561327d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a19190613d8a565b90506132b18a610c248387613e43565b506134dc565b8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603613397576132f888888888883061387b565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101839052919450925073ffffffffffffffffffffffffffffffffffffffff891690632e1a7d4d90602401600060405180830381600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b505050506133878984612a07565b613392878a84612ecd565b6134dc565b8073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036134c8576133f8887f00000000000000000000000000000000000000000000000000000000000000008888883061387b565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905291945092506000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024016020604051808303816000875af115801561348d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b19190613d8a565b90506134bd8a82612a07565b6132b1898b86612ecd565b6134d688888888888e61387b565b90935091505b50965096945050505050565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa15801561357d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a19190613deb565b905073ffffffffffffffffffffffffffffffffffffffff8116613673576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301527f00000000000000000000000000000000000000000000000000000000000000001690639049f9d2906024016020604051808303816000875af115801561364c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136709190613deb565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e49190613d66565b915091508160001480156136f6575080155b156137065788945087935061386e565b60006137138a8385613acc565b90508881116137b757868110156137ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f315f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b89955093508361386c565b60006137c48a8585613acc565b90508a8111156137d6576137d6613aeb565b88811015613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b95508894505b505b5050509550959350505050565b6000807f0000000000000000000000000000000000000000000000000000000000000000816138eb8a7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612839565b90506138f98133848b612cd3565b6040517f45a11cec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a8116602483015286811660448301528316906345a11cec9060640160408051808303816000875af1158015613976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399a9190613d66565b909450925086841015613a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54300000000000000000000000000000000000000000000000000060648201526084016102a8565b85831015613abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54310000000000000000000000000000000000000000000000000060648201526084016102a8565b5050965096945050505050565b600081613ad98486613e56565b613ae39190613e08565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114613b3c57600080fd5b50565b60008060008060808587031215613b5557600080fd5b8435613b6081613b1a565b93506020850135613b7081613b1a565b93969395505050506040820135916060013590565b60008060008060008060c08789031215613b9e57600080fd5b8635613ba981613b1a565b95506020870135613bb981613b1a565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080600080600060a08688031215613bf657600080fd5b8535613c0181613b1a565b94506020860135613c1181613b1a565b94979496505050506040830135926060810135926080909101359150565b60008060008060008060c08789031215613c4857600080fd5b8635613c5381613b1a565b95506020870135613c6381613b1a565b94506040870135613c7381613b1a565b959894975094956060810135955060808101359460a0909101359350915050565b60008060008060808587031215613caa57600080fd5b8435613cb581613b1a565b966020860135965060408601359560600135945092505050565b600080600080600080600060e0888a031215613cea57600080fd5b8735613cf581613b1a565b96506020880135613d0581613b1a565b95506040880135613d1581613b1a565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b600060208284031215613d4f57600080fd5b81518015158114613d5f57600080fd5b9392505050565b60008060408385031215613d7957600080fd5b505080516020909101519092909150565b600060208284031215613d9c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115613de557613de5613da3565b92915050565b600060208284031215613dfd57600080fd5b8151613d5f81613b1a565b600082613e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115613de557613de5613da3565b8082028115828204841417613de557613de5613da3565b6000825160005b81811015613e8e5760208186018101518583015201613e74565b50600092019182525091905056fea2646970667358221220a95f33b4286ad5dea5afdaed301e181f75bbf44e00456839003044a4264ee0c564736f6c634300081300330000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b7000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021

Deployed Bytecode

0x60806040526004361061009a5760003560e01c8063515a22d311610069578063b1f0d8401161004e578063b1f0d840146101ca578063cb7cfbe7146101ea578063f448a6161461021f57600080fd5b8063515a22d3146101975780635625d383146101b757600080fd5b806312d4b07c1461012b578063293b15a9146101515780633351733f14610164578063433182141461017757600080fd5b36610126573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216148061011857503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02116145b61012457610124613aeb565b005b600080fd5b61013e610139366004613b3f565b61023f565b6040519081526020015b60405180910390f35b61013e61015f366004613b3f565b61057b565b61013e610172366004613b85565b610c29565b34801561018357600080fd5b5061013e610192366004613bde565b610ea7565b3480156101a357600080fd5b5061013e6101b2366004613c2f565b61149d565b61013e6101c5366004613c94565b611bdb565b3480156101d657600080fd5b5061013e6101e5366004613bde565b6122ed565b3480156101f657600080fd5b5061020a610205366004613ccf565b612591565b60408051928352602083019190915201610148565b34801561022b57600080fd5b5061013e61023a366004613c2f565b61261e565b600081428110156102b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064015b60405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2346000610320837f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90508273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561036a57600080fd5b505af115801561037e573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018790527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af1158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d9190613d3d565b61044957610449613aeb565b7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036104d0576104c7837f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0218b612935565b95506104df9050565b6104db83898b612935565b9550505b8685101561056f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b50505050949350505050565b600081428110156105e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26000610656827f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b905060007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036108ae576106f8837f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015610747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076b9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01283838c7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081b9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015610881573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a59190613d8a565b96505050610a4a565b6108f9887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be4483838a7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a79190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015610a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a479190613d8a565b94505b34851115610ada576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b8273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b2257600080fd5b505af1158015610b36573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018a90527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af1158015610bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf59190613d3d565b610c0157610c01613aeb565b610c0c83898b612935565b50508434111561056f5761056f33610c248734613dd2565b612a07565b60008142811015610c96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6000610ce3887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b9050600080610cf58a8a348b8b612af0565b91509150610d058a338585612cd3565b60007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b815260040160206040518083038185885af1158015610d74573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d999190613d8a565b9050610dc67f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0218583612ecd565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c811660048301528d811660248301527f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e7169063ee1fe2ad906044016020604051808303816000875af1158015610e5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e809190613d8a565b955081341115610e9857610e9833610c248434613dd2565b50505050509695505050505050565b60008142811015610f14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02181169089160361117857610fc2827f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90506000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110359190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01282848c7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e59190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af415801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f9190613d8a565b9550505061135e565b6111c3887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be448261122b857f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b8a7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190613d8a565b93505b858411156113ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b6113fa88338387612cd3565b611405888330612935565b50506040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff831690632e1a7d4d90602401600060405180830381600087803b15801561146f57600080fd5b505af1158015611483573d6000803e3d6000fd5b505050506114918988612a07565b50505095945050505050565b6000814281101561150a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6000807f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16036117ae576115ab887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b91506115f8887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01282848c7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171b9190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526004810194909452602484019290925260448301526064820152608401602060405180830381865af4158015611781573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a59190613d8a565b95505050611b34565b7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff160361194b5761184c897f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b91506000808373ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa15801561189b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bf9190613d66565b915091507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c63571fd01283838c7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f7573d6000803e3d6000fd5b611996897f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b91506119e3887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90507305263e67f7ea29e023be1d4ec9aa2d89f3236d9c6364e2be4483838a7f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e773ffffffffffffffffffffffffffffffffffffffff16637ae316d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a919190613d8a565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815273ffffffffffffffffffffffffffffffffffffffff948516600482015293909216602484015260448301526064820152608401602060405180830381865af4158015611b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b319190613d8a565b93505b85841115611bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f494e5055545f414d4f554e54000000000000000000000000000000000000000060648201526084016102a8565b611bd089338487612cd3565b610e9889898c612935565b60008342811015611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28181166004840152917f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02191600091829182917f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b79091169063bbe4f6db90602401602060405180830381865afa158015611d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d459190613deb565b905073ffffffffffffffffffffffffffffffffffffffff8116611e17576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b71690639049f9d2906024016020604051808303816000875af1158015611df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e149190613deb565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa158015611e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e889190613d66565b91509150816000148015611e9a575080155b15611ebf57611eaa600234613e08565b611eb5600234613e08565b9095509350611f7b565b6040517fa398030d0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff87169063a398030d90602401602060405180830381865afa158015611f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4e9190613d8a565b611f589083613e43565b611f628334613e56565b611f6c9190613e08565b9450611f788534613dd2565b93505b505060008473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b815260040160206040518083038185885af1158015611fcc573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ff19190613d8a565b905089841015612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b88811015612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b8573ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215b57600080fd5b505af115801561216f573d6000803e3d6000fd5b505050505061217f858383612ecd565b61218a868386612ecd565b6040517fee1fe2ad00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528d811660248301527f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e7169063ee1fe2ad906044016020604051808303816000875af1158015612220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122449190613d8a565b97506122508385613e43565b34146122de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54000000000000000000000000000000000000000000000000000060648201526084016102a8565b50505050505050949350505050565b6000814281101561235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02181169089160361240f57612408817f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b915061245d565b61245a887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b91505b6124698833848a612cd3565b612474888230612935565b94505085841015612507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff821690632e1a7d4d90602401600060405180830381600087803b15801561256f57600080fd5b505af1158015612583573d6000803e3d6000fd5b505050506114918985612a07565b60008082428110156125ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b61260d8a8a8a8a8a8a6130be565b909b909a5098505050505050505050565b6000814281101561268b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f58666169563050657269706865727930323a204558504952454400000000000060448201526064016102a8565b60007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16036127325761272b877f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b9050612780565b61277d887f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90505b61278c88338389612cd3565b600061279989898c612935565b9150508581101561282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f4f55545055545f414d4f554e540000000000000000000000000000000000000060648201526084016102a8565b9998505050505050505050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152600090839060340160405160208183030381529060405280519060200120836040516020016128f7939291907fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120949350505050565b6040517f9331621200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301528381166024830152828116604483015260009182917f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e7169063933162129060640160408051808303816000875af11580156129d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fb9190613d66565b90969095509350505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8416908390604051612a3e9190613e6d565b60006040518083038185875af1925050503d8060008114612a7b576040519150601f19603f3d011682016040523d82523d6000602084013e612a80565b606091505b5050905080612aeb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a204554485f5452414e534645525f4641494c45440000000000000060448201526064016102a8565b505050565b60008060007f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02190506000612c3189898473ffffffffffffffffffffffffffffffffffffffff1663b3c174048b6040518263ffffffff1660e01b8152600401612b5a91815260200190565b602060405180830381865afa158015612b77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9b9190613d8a565b6040517fb3c17404000000000000000000000000000000000000000000000000000000008152600481018a90528a9073ffffffffffffffffffffffffffffffffffffffff88169063b3c1740490602401602060405180830381865afa158015612c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c2c9190613d8a565b6134e8565b6040517fa398030d00000000000000000000000000000000000000000000000000000000815260048101829052919550915073ffffffffffffffffffffffffffffffffffffffff83169063a398030d90602401602060405180830381865afa158015612ca1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc59190613d8a565b925050509550959350505050565b60008473ffffffffffffffffffffffffffffffffffffffff163b11612d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c45440000000000000060448201526064016102a8565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691612df39190613e6d565b6000604051808303816000865af19150503d8060008114612e30576040519150601f19603f3d011682016040523d82523d6000602084013e612e35565b606091505b5091509150818015612e5f575080511580612e5f575080806020019051810190612e5f9190613d3d565b612ec5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f586661693a205452414e5346455246524f4d5f4641494c45440000000000000060448201526064016102a8565b505050505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b11612f4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c4544000000000000000000000060448201526064016102a8565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790529151600092839290871691612fe59190613e6d565b6000604051808303816000865af19150503d8060008114613022576040519150601f19603f3d011682016040523d82523d6000602084013e613027565b606091505b50915091508180156130515750805115806130515750808060200190518101906130519190613d3d565b6130b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f586661693a205452414e534645525f4641494c4544000000000000000000000060448201526064016102a8565b5050505050565b6000807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff88811690821614801561313557508073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b156132b757613168887f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0218888883061387b565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101839052919450925073ffffffffffffffffffffffffffffffffffffffff891690632e1a7d4d90602401600060405180830381600087803b1580156131d557600080fd5b505af11580156131e9573d6000803e3d6000fd5b50506040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101859052600092507f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff169150632e1a7d4d906024016020604051808303816000875af115801561327d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a19190613d8a565b90506132b18a610c248387613e43565b506134dc565b8073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603613397576132f888888888883061387b565b6040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101839052919450925073ffffffffffffffffffffffffffffffffffffffff891690632e1a7d4d90602401600060405180830381600087803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b505050506133878984612a07565b613392878a84612ecd565b6134dc565b8073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036134c8576133f8887f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae0218888883061387b565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905291945092506000907f000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae02173ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024016020604051808303816000875af115801561348d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134b19190613d8a565b90506134bd8a82612a07565b6132b1898b86612ecd565b6134d688888888888e61387b565b90935091505b50965096945050505050565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152600091829182917f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b79091169063bbe4f6db90602401602060405180830381865afa15801561357d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a19190613deb565b905073ffffffffffffffffffffffffffffffffffffffff8116613673576040517f9049f9d200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301527f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b71690639049f9d2906024016020604051808303816000875af115801561364c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136709190613deb565b90505b6000808273ffffffffffffffffffffffffffffffffffffffff1663d8ab82746040518163ffffffff1660e01b81526004016040805180830381865afa1580156136c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e49190613d66565b915091508160001480156136f6575080155b156137065788945087935061386e565b60006137138a8385613acc565b90508881116137b757868110156137ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f315f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b89955093508361386c565b60006137c48a8585613acc565b90508a8111156137d6576137d6613aeb565b88811015613866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f305f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016102a8565b95508894505b505b5050509550959350505050565b6000807f000000000000000000000000cc4fce9171de972ae892bd0b749f96b49b3740e7816138eb8a7f0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b77f8f92f7e5e633cf0e16777f0f3dd2fc7041871898f9f7cbb26929a0be81e7923c612839565b90506138f98133848b612cd3565b6040517f45a11cec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b811660048301528a8116602483015286811660448301528316906345a11cec9060640160408051808303816000875af1158015613976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061399a9190613d66565b909450925086841015613a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54300000000000000000000000000000000000000000000000000060648201526084016102a8565b85831015613abf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f58666169563050657269706865727930323a20494e53554646494349454e545f60448201527f414d4f554e54310000000000000000000000000000000000000000000000000060648201526084016102a8565b5050965096945050505050565b600081613ad98486613e56565b613ae39190613e08565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114613b3c57600080fd5b50565b60008060008060808587031215613b5557600080fd5b8435613b6081613b1a565b93506020850135613b7081613b1a565b93969395505050506040820135916060013590565b60008060008060008060c08789031215613b9e57600080fd5b8635613ba981613b1a565b95506020870135613bb981613b1a565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080600080600060a08688031215613bf657600080fd5b8535613c0181613b1a565b94506020860135613c1181613b1a565b94979496505050506040830135926060810135926080909101359150565b60008060008060008060c08789031215613c4857600080fd5b8635613c5381613b1a565b95506020870135613c6381613b1a565b94506040870135613c7381613b1a565b959894975094956060810135955060808101359460a0909101359350915050565b60008060008060808587031215613caa57600080fd5b8435613cb581613b1a565b966020860135965060408601359560600135945092505050565b600080600080600080600060e0888a031215613cea57600080fd5b8735613cf581613b1a565b96506020880135613d0581613b1a565b95506040880135613d1581613b1a565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b600060208284031215613d4f57600080fd5b81518015158114613d5f57600080fd5b9392505050565b60008060408385031215613d7957600080fd5b505080516020909101519092909150565b600060208284031215613d9c57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115613de557613de5613da3565b92915050565b600060208284031215613dfd57600080fd5b8151613d5f81613b1a565b600082613e3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b80820180821115613de557613de5613da3565b8082028115828204841417613de557613de5613da3565b6000825160005b81811015613e8e5760208186018101518583015201613e74565b50600092019182525091905056fea2646970667358221220a95f33b4286ad5dea5afdaed301e181f75bbf44e00456839003044a4264ee0c564736f6c63430008130033

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

0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b7000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021

-----Decoded View---------------
Arg [0] : _factory (address): 0x0b51D00eF3Df0B66766938220542185F6fDbC0B7
Arg [1] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _xfETH (address): 0xa449845c3309ac5269DFA6b2F80eb6E73D0AE021

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000b51d00ef3df0b66766938220542185f6fdbc0b7
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 000000000000000000000000a449845c3309ac5269dfa6b2f80eb6e73d0ae021


Libraries Used


Deployed Bytecode Sourcemap

5843:20095:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7089:10;:18;7103:4;7089:18;;;:41;;-1:-1:-1;7111:10:12;:19;7125:5;7111:19;;7089:41;7082:49;;;;:::i;:::-;5843:20095;;;;;20317:699;;;;;;:::i;:::-;;:::i;:::-;;;1038:25:13;;;1026:2;1011:18;20317:699:12;;;;;;;;24846:1090;;;;;;:::i;:::-;;:::i;9736:839::-;;;;;;:::i;:::-;;:::i;21727:1130::-;;;;;;;;;;-1:-1:-1;21727:1130:12;;;;;:::i;:::-;;:::i;18410:1327::-;;;;;;;;;;-1:-1:-1;18410:1327:12;;;;;:::i;:::-;;:::i;10889:1480::-;;;;;;:::i;:::-;;:::i;23523:770::-;;;;;;;;;;-1:-1:-1;23523:770:12;;;;;:::i;:::-;;:::i;15552:404::-;;;;;;;;;;-1:-1:-1;15552:404:12;;;;;:::i;:::-;;:::i;:::-;;;;4523:25:13;;;4579:2;4564:18;;4557:34;;;;4496:18;15552:404:12;4349:248:13;16983:663:12;;;;;;;;;;-1:-1:-1;16983:663:12;;;;;:::i;:::-;;:::i;20317:699::-;20488:15;20468:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;;;;;;;;;20532:4:::1;20574:9;20511:18;20605:54;20532:4:::0;20637:7:::1;20646:12;20605:19;:54::i;:::-;20589:70;;20671:10;20665:25;;;20698:9;20665:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20723:38:12::1;::::0;;;;:20:::1;5149:55:13::0;;;20723:38:12::1;::::0;::::1;5131:74:13::0;5221:18;;;5214:34;;;20729:4:12::1;20723:20;::::0;-1:-1:-1;20723:20:12::1;::::0;-1:-1:-1;5104:18:13;;;-1:-1:-1;20723:38:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20716:46;;;;:::i;:::-;20783:5;20772:16;;:7;:16;;::::0;20768:152:::1;;20815:29;20821:10;20833:5;20840:3;20815:5;:29::i;:::-;20798:46:::0;-1:-1:-1;20768:152:12::1;::::0;-1:-1:-1;20768:152:12::1;;20882:31;20888:10;20900:7;20909:3;20882:5;:31::i;:::-;20865:48:::0;-1:-1:-1;;20768:152:12::1;20947:14;20933:10;:28;;20925:86;;;::::0;::::1;::::0;;5743:2:13;20925:86:12::1;::::0;::::1;5725:21:13::0;5782:2;5762:18;;;5755:30;5821:34;5801:18;;;5794:62;5892:15;5872:18;;;5865:43;5925:19;;20925:86:12::1;5541:409:13::0;20925:86:12::1;20505:511;;;20317:699:::0;;;;;;;:::o;24846:1090::-;25014:10;24994:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;25053:4:::1;25032:18;25094:54;25053:4:::0;25126:7:::1;25135:12;25094:19;:54::i;:::-;25078:70;;25154:13;25188:5;25177:16;;:7;:16;;::::0;25173:425:::1;;25211:54;25231:10;25243:7;25252:12;25211:19;:54::i;:::-;25203:62;;25274:6;25282::::0;25302:5:::1;25292:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25273:47;;;;25336:11;:23;25360:1;25363;25366:11;25391:4;25379:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25336:75;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6633:25:13::0;;;;6674:18;;;6667:34;;;;6717:18;;;6710:34;6760:18;;;6753:34;6605:19;;25336:75:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25328:83;;25195:223;;25173:425;;;25440:51;25460:7;25469;25478:12;25440:19;:51::i;:::-;25432:59;;25507:11;:24;25532:5;25539;25546:11;25571:4;25559:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25507:84;::::0;;::::1;::::0;;;;;;7047:42:13;7116:15;;;25507:84:12::1;::::0;::::1;7098:34:13::0;7168:15;;;;7148:18;;;7141:43;7200:18;;;7193:34;7243:18;;;7236:34;7009:19;;25507:84:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25499:92;;25173:425;25620:9;25611:5;:18;;25603:75;;;::::0;::::1;::::0;;7483:2:13;25603:75:12::1;::::0;::::1;7465:21:13::0;7522:2;7502:18;;;7495:30;7561:34;7541:18;;;7534:62;7632:14;7612:18;;;7605:42;7664:19;;25603:75:12::1;7281:408:13::0;25603:75:12::1;25690:10;25684:25;;;25717:5;25684:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;25738:34:12::1;::::0;;;;:20:::1;5149:55:13::0;;;25738:34:12::1;::::0;::::1;5131:74:13::0;5221:18;;;5214:34;;;25744:4:12::1;25738:20;::::0;-1:-1:-1;25738:20:12::1;::::0;-1:-1:-1;5104:18:13;;;-1:-1:-1;25738:34:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25731:42;;;;:::i;:::-;25779:31;25785:10;25797:7;25806:3;25779:5;:31::i;:::-;;;25863:5;25851:9;:17;25847:84;;;25870:61;25901:10;25913:17;25925:5:::0;25913:9:::1;:17;:::i;:::-;25870:30;:61::i;9736:839::-:0;9952:14;9932:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;9974:12:::1;9989:50;10009:6;10017:7;10026:12;9989:19;:50::i;:::-;9974:65;;10046:12;10060::::0;10076:121:::1;10097:6;10111:19;10138:9;10155:15;10178:13;10076;:121::i;:::-;10045:152;;;;10203:66;10235:6;10243:10;10255:4;10261:7;10203:31;:66::i;:::-;10275:16;10301:5;10294:21;;;10323:7;10294:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10275:58;;10339:53;10367:5;10374:4;10380:11;10339:27;:53::i;:::-;10410:35;::::0;;;;:22:::1;8269:15:13::0;;;10410:35:12::1;::::0;::::1;8251:34:13::0;8321:15;;;8301:18;;;8294:43;10422:4:12::1;10410:22;::::0;::::1;::::0;8163:18:13;;10410:35:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10398:47;;10498:7;10486:9;:19;10482:88;;;10507:63;10538:10;10550:19;10562:7:::0;10550:9:::1;:19;:::i;10507:63::-;9968:607;;;;9736:839:::0;;;;;;;;;:::o;21727:1130::-;21911:14;21891:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;21954:4:::1;21933:18;22002:16;22013:5;22002:16:::0;::::1;::::0;;::::1;::::0;21998:522:::1;;22036:54;22056:10;22068:7;22077:12;22036:19;:54::i;:::-;22028:62;;22099:6;22107::::0;22127:5:::1;22117:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22098:47;;;;22165:11;:23;22189:1;22192;22195:11;22220:4;22208:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22165:75;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6633:25:13::0;;;;6674:18;;;6667:34;;;;6717:18;;;6710:34;6760:18;;;6753:34;6605:19;;22165:75:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22153:87;;22020:227;;21998:522;;;22269:51;22289:7;22298;22307:12;22269:19;:51::i;:::-;22261:59;;22340:11;:24;22374:5;22389:54;22409:10;22421:7;22430:12;22389:19;:54::i;:::-;22453:11;22486:4;22474:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22340:173;::::0;;::::1;::::0;;;;;;7047:42:13;7116:15;;;22340:173:12::1;::::0;::::1;7098:34:13::0;7168:15;;;;7148:18;;;7141:43;7200:18;;;7193:34;7243:18;;;7236:34;7009:19;;22340:173:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22328:185;;21998:522;22546:13;22533:9;:26;;22525:83;;;::::0;::::1;::::0;;7483:2:13;22525:83:12::1;::::0;::::1;7465:21:13::0;7522:2;7502:18;;;7495:30;7561:34;7541:18;;;7534:62;7632:14;7612:18;;;7605:42;7664:19;;22525:83:12::1;7281:408:13::0;22525:83:12::1;22614:70;22646:7;22655:10;22667:5;22674:9;22614:31;:70::i;:::-;22690:41;22696:7;22705:10;22725:4;22690:5;:41::i;:::-;-1:-1:-1::0;;22737:39:12::1;::::0;;;;::::1;::::0;::::1;1038:25:13::0;;;22737:26:12::1;::::0;::::1;::::0;::::1;::::0;1011:18:13;;22737:39:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22782:48;22813:3;22818:11;22782:30;:48::i;:::-;22836:16;;21727:1130:::0;;;;;;;;:::o;18410:1327::-;18618:14;18598:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;18640:13:::1;18659::::0;18693:5:::1;18682:16;;:7;:16;;::::0;18678:856:::1;;18716:51;18736:7;18745;18754:12;18716:19;:51::i;:::-;18708:59;;18783:51;18803:7;18812;18821:12;18783:19;:51::i;:::-;18775:59;;18843:6;18851::::0;18871:5:::1;18861:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18842:47;;;;18909:11;:23;18933:1;18936;18939:11;18964:4;18952:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18909:75;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;6633:25:13::0;;;;6674:18;;;6667:34;;;;6717:18;;;6710:34;6760:18;;;6753:34;6605:19;;18909:75:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18897:87;;18700:291;;18678:856;;;19012:5;19001:16;;:7;:16;;::::0;18997:537:::1;;19035:51;19055:7;19064;19073:12;19035:19;:51::i;:::-;19027:59;;19095:6;19103::::0;19123:5:::1;19113:26;;;:28;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19094:47;;;;19161:11;:23;19185:1;19188;19191:11;19216:4;19204:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;18997:537;19265:51;19285:7;19294;19303:12;19265:19;:51::i;:::-;19257:59;;19332:51;19352:7;19361;19370:12;19332:19;:51::i;:::-;19324:59;;19403:11;:24;19437:5;19452;19467:11;19500:4;19488:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19403:124;::::0;;::::1;::::0;;;;;;7047:42:13;7116:15;;;19403:124:12::1;::::0;::::1;7098:34:13::0;7168:15;;;;7148:18;;;7141:43;7200:18;;;7193:34;7243:18;;;7236:34;7009:19;;19403:124:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19391:136;;18997:537;19560:13;19547:9;:26;;19539:83;;;::::0;::::1;::::0;;7483:2:13;19539:83:12::1;::::0;::::1;7465:21:13::0;7522:2;7502:18;;;7495:30;7561:34;7541:18;;;7534:62;7632:14;7612:18;;;7605:42;7664:19;;19539:83:12::1;7281:408:13::0;19539:83:12::1;19628:70;19660:7;19669:10;19681:5;19688:9;19628:31;:70::i;:::-;19704:28;19710:7;19719;19728:3;19704:5;:28::i;10889:1480::-:0;11058:14;11038:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;11224:36:::1;::::0;;;;:29:::1;11096:4;8512:55:13::0;;;11224:36:12::1;::::0;::::1;8494:74:13::0;11096:4:12;11137:5:::1;::::0;11080:13:::1;::::0;;;;;11237:7:::1;11224:29:::0;;::::1;::::0;::::1;::::0;8467:18:13;;11224:36:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11209:51:::0;-1:-1:-1;11270:18:12::1;::::0;::::1;11266:134;;11354:39;::::0;;;;:32:::1;8512:55:13::0;;;11354:39:12::1;::::0;::::1;8494:74:13::0;11367:7:12::1;11354:32;::::0;::::1;::::0;8467:18:13;;11354:39:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11347:46;;11266:134;11414:15;11431:17:::0;11462:4:::1;11452:25;;;:27;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11413:66;;;;11491:10;11505:1;11491:15;:36;;;;-1:-1:-1::0;11510:17:12;;11491:36:::1;11487:311;;;11572:13;11584:1;11572:9;:13;:::i;:::-;11587;11599:1;11587:9;:13;:::i;:::-;11539:62:::0;;-1:-1:-1;11539:62:12;-1:-1:-1;11487:311:12::1;;;11699:39;::::0;;;;::::1;::::0;::::1;1038:25:13::0;;;11699::12::1;::::0;::::1;::::0;::::1;::::0;1011:18:13;;11699:39:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11686:52;::::0;:10;:52:::1;:::i;:::-;11649:22;11661:10:::0;11649:9:::1;:22;:::i;:::-;11648:91;;;;:::i;:::-;11626:113:::0;-1:-1:-1;11768:21:12::1;11626:113:::0;11768:9:::1;:21;:::i;:::-;11749:40;;11487:311;11405:399;;11809:16;11835:6;11828:22;;;11858:16;11828:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11809:68;;11904:13;11891:9;:26;;11883:79;;;::::0;::::1;::::0;;9619:2:13;11883:79:12::1;::::0;::::1;9601:21:13::0;9658:2;9638:18;;;9631:30;9697:34;9677:18;;;9670:62;9768:10;9748:18;;;9741:38;9796:19;;11883:79:12::1;9417:404:13::0;11883:79:12::1;11991:15;11976:11;:30;;11968:83;;;::::0;::::1;::::0;;9619:2:13;11968:83:12::1;::::0;::::1;9601:21:13::0;9658:2;9638:18;;;9631:30;9697:34;9677:18;;;9670:62;9768:10;9748:18;;;9741:38;9796:19;;11968:83:12::1;9417:404:13::0;11968:83:12::1;12063:5;12057:20;;;12085:9;12057:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;12103:54;12131:6;12139:4;12145:11;12103:27;:54::i;:::-;12163:51;12191:5;12198:4;12204:9;12163:27;:51::i;:::-;12232:34;::::0;;;;:22:::1;8269:15:13::0;;;12232:34:12::1;::::0;::::1;8251::13::0;8321:15;;;8301:18;;;8294:43;12244:4:12::1;12232:22;::::0;::::1;::::0;8163:18:13;;12232:34:12::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12220:46:::0;-1:-1:-1;12293:28:12::1;12305:16:::0;12293:9;:28:::1;:::i;:::-;12280:9;:41;12272:92;;;::::0;::::1;::::0;;10028:2:13;12272:92:12::1;::::0;::::1;10010:21:13::0;10067:2;10047:18;;;10040:30;10106:34;10086:18;;;10079:62;10177:8;10157:18;;;10150:36;10203:19;;12272:92:12::1;9826:402:13::0;12272:92:12::1;11074:1295;;;;;;10889:1480:::0;;;;;;;:::o;23523:770::-;23707:15;23687:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;23730:13:::1;23770:4;23784:16;23795:5;23784:16:::0;::::1;::::0;;::::1;::::0;23780:179:::1;;23818:54;23838:10;23850:7;23859:12;23818:19;:54::i;:::-;23810:62;;23780:179;;;23901:51;23921:7;23930;23939:12;23901:19;:51::i;:::-;23893:59;;23780:179;23964:71;23996:7;24005:10;24017:5;24024:10;23964:31;:71::i;:::-;24058:41;24064:7;24073:10;24093:4;24058:5;:41::i;:::-;24041:58:::0;-1:-1:-1;;24113:28:12;;::::1;;24105:86;;;::::0;::::1;::::0;;5743:2:13;24105:86:12::1;::::0;::::1;5725:21:13::0;5782:2;5762:18;;;5755:30;5821:34;5801:18;;;5794:62;5892:15;5872:18;;;5865:43;5925:19;;24105:86:12::1;5541:409:13::0;24105:86:12::1;24197:38;::::0;;;;::::1;::::0;::::1;1038:25:13::0;;;24197:26:12::1;::::0;::::1;::::0;::::1;::::0;1011:18:13;;24197:38:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24241:47;24272:3;24277:10;24241:30;:47::i;15552:404::-:0;15770:12;15784;15750:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;15825:126:::1;15856:3;15867:7;15882;15897:10;15915:11;15934;15825:23;:126::i;:::-;15804:147:::0;;;;-1:-1:-1;15552:404:12;-1:-1:-1;;;;;;;;;15552:404:12:o;16983:663::-;17191:4;17171:9;6572:15;6560:8;:27;;6552:66;;;;;;;4804:2:13;6552:66:12;;;4786:21:13;4843:2;4823:18;;;4816:30;4882:28;4862:18;;;4855:56;4928:18;;6552:66:12;4602:350:13;6552:66:12;17203:12:::1;17236:5;17225:16;;:7;:16;;::::0;17221:174:::1;;17258:51;17278:7;17287;17296:12;17258:19;:51::i;:::-;17251:58;;17221:174;;;17337:51;17357:7;17366;17375:12;17337:19;:51::i;:::-;17330:58;;17221:174;17400:70;17432:7;17441:10;17453:4;17459:10;17400:31;:70::i;:::-;17479:15;17498:28;17504:7;17513;17522:3;17498:5;:28::i;:::-;17476:50;;;17554:14;17540:10;:28;;17532:86;;;::::0;::::1;::::0;;5743:2:13;17532:86:12::1;::::0;::::1;5725:21:13::0;5782:2;5762:18;;;5755:30;5821:34;5801:18;;;5794:62;5892:15;5872:18;;;5865:43;5925:19;;17532:86:12::1;5541:409:13::0;17532:86:12::1;17631:10:::0;16983:663;-1:-1:-1;;;;;;;;;16983:663:12:o;1619:430::-;1922:24;;10395:66:13;10382:2;10378:15;;;10374:88;1922:24:12;;;10362:101:13;1732:12:12;;1888:8;;10479:12:13;;1922:24:12;;;;;;;;;;;;1912:35;;;;;;1963:13;1833:175;;;;;;;;;10800:66:13;10788:79;;10904:2;10900:15;;;;10917:66;10896:88;10892:1;10883:11;;10876:109;11010:2;11001:12;;10994:28;;;;11047:2;11038:12;;11031:28;11084:2;11075:12;;10502:591;1833:175:12;;;;;;;;;;;;;;1810:210;;1833:175;1810:210;;;;;1619:430;-1:-1:-1;;;;1619:430:12:o;16059:195::-;16204:45;;;;;:22;11379:15:13;;;16204:45:12;;;11361:34:13;11431:15;;;11411:18;;;11404:43;11483:15;;;11463:18;;;11456:43;16155:10:12;;;;16216:4;16204:22;;;;11273:18:13;;16204:45:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16186:63;;;;-1:-1:-1;16059:195:12;-1:-1:-1;;;;16059:195:12:o;714:178::-;823:12;;;781;823;;;;;;;;;799:8;;;;815:6;;799:37;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;780:56;;;850:7;842:45;;;;;;;12318:2:13;842:45:12;;;12300:21:13;12357:2;12337:18;;;12330:30;12396:27;12376:18;;;12369:55;12441:18;;842:45:12;12116:349:13;842:45:12;774:118;714:178;;:::o;8529:557::-;8702:16;8720:14;8742;8759:5;8742:22;;8784:16;8835:190;8863:6;8877:19;8911:6;8904:25;;;8930:17;8904:44;;;;;;;;;;;;;1038:25:13;;1026:2;1011:18;;892:177;8904:44:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8979:40;;;;;;;;1038:25:13;;;8956:15:12;;8979:25;;;;;;1011:18:13;;8979:40:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8835:20;:190::i;:::-;9043:38;;;;;;;;1038:25:13;;;8806:219:12;;-1:-1:-1;8806:219:12;-1:-1:-1;9043:25:12;;;;;;1011:18:13;;9043:38:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9031:50;;8736:350;;8529:557;;;;;;;;:::o;304:406::-;434:1;413:6;:18;;;:22;405:60;;;;;;;12672:2:13;405:60:12;;;12654:21:13;12711:2;12691:18;;;12684:30;12750:27;12730:18;;;12723:55;12795:18;;405:60:12;12470:349:13;405:60:12;526:72;;;507:11;13105:15:13;;;526:72:12;;;13087:34:13;13157:15;;;13137:18;;;13130:43;13189:18;;;;13182:34;;;526:72:12;;;;;;;;;;12999:18:13;;;;526:72:12;;;;;;;;;549:28;526:72;;;507:97;;-1:-1:-1;;;;507:11:12;;;;:97;;526:72;507:97;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;471:133;;;;618:7;:57;;;;-1:-1:-1;630:11:12;;:16;;:44;;;661:4;650:24;;;;;;;;;;;;:::i;:::-;610:95;;;;;;;12672:2:13;610:95:12;;;12654:21:13;12711:2;12691:18;;;12684:30;12750:27;12730:18;;;12723:55;12795:18;;610:95:12;12470:349:13;610:95:12;399:311;;304:406;;;;:::o;896:368::-;1007:1;986:6;:18;;;:22;978:56;;;;;;;13429:2:13;978:56:12;;;13411:21:13;13468:2;13448:18;;;13441:30;13507:23;13487:18;;;13480:51;13548:18;;978:56:12;13227:345:13;978:56:12;1095:61;;;1076:11;5149:55:13;;;1095:61:12;;;5131:74:13;5221:18;;;;5214:34;;;1095:61:12;;;;;;;;;;5104:18:13;;;;1095:61:12;;;;;;;;;1118:24;1095:61;;;1076:86;;-1:-1:-1;;;;1076:11:12;;;;:86;;1095:61;1076:86;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1040:122;;;;1176:7;:57;;;;-1:-1:-1;1188:11:12;;:16;;:44;;;1219:4;1208:24;;;;;;;;;;;;:::i;:::-;1168:91;;;;;;;13429:2:13;1168:91:12;;;13411:21:13;13468:2;13448:18;;;13441:30;13507:23;13487:18;;;13480:51;13548:18;;1168:91:12;13227:345:13;1168:91:12;972:292;;896:368;;;:::o;13033:1573::-;13211:12;;13266:4;13294:21;;;;;;;;:46;;;;;13330:10;13319:21;;:7;:21;;;13294:46;13290:1312;;;13371:141;13397:7;13414:5;13429:10;13449:11;13470;13499:4;13371:16;:141::i;:::-;13520:32;;;;;;;;1038:25:13;;;13350:162:12;;-1:-1:-1;13350:162:12;-1:-1:-1;13520:23:12;;;;;;1011:18:13;;13520:32:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13579:31:12;;;;;;;;1038:25:13;;;13560:16:12;;-1:-1:-1;13586:5:12;13579:22;;;-1:-1:-1;13579:22:12;;1011:18:13;;13579:31:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13560:50;-1:-1:-1;13618:58:12;13649:3;13654:21;13560:50;13654:7;:21;:::i;13618:58::-;13342:341;13290:1312;;;13704:10;13693:21;;:7;:21;;;13689:913;;13745:143;13771:7;13788;13805:10;13825:11;13846;13875:4;13745:16;:143::i;:::-;13896:32;;;;;;;;1038:25:13;;;13724:164:12;;-1:-1:-1;13724:164:12;-1:-1:-1;13896:23:12;;;;;;1011:18:13;;13896:32:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13936:44;13967:3;13972:7;13936:30;:44::i;:::-;13988:50;14016:7;14025:3;14030:7;13988:27;:50::i;:::-;13689:913;;;14066:10;14055:21;;:7;:21;;;14051:551;;14107:141;14133:7;14150:5;14165:10;14185:11;14206;14235:4;14107:16;:141::i;:::-;14275:31;;;;;;;;1038:25:13;;;14086:162:12;;-1:-1:-1;14086:162:12;-1:-1:-1;14256:16:12;;14282:5;14275:22;;;;;1011:18:13;;14275:31:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14256:50;;14314:48;14345:3;14350:11;14314:30;:48::i;:::-;14370:50;14398:7;14407:3;14412:7;14370:27;:50::i;14051:551::-;14462:133;14488:7;14505;14522:10;14542:11;14563;14584:3;14462:16;:133::i;:::-;14441:154;;-1:-1:-1;14441:154:12;-1:-1:-1;14051:551:12;13239:1367;13033:1573;;;;;;;;;:::o;7225:1300::-;7466:37;;;;;:29;8512:55:13;;;7466:37:12;;;8494:74:13;-1:-1:-1;;;;;;7479:7:12;7466:29;;;;;;8467:18:13;;7466:37:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7451:52;-1:-1:-1;7513:18:12;;;7509:135;;7597:40;;;;;:32;8512:55:13;;;7597:40:12;;;8494:74:13;7610:7:12;7597:32;;;;8467:18:13;;7597:40:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7590:47;;7509:135;7650:12;7664:11;7689:4;7679:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7649:57;;;;7716:7;7727:1;7716:12;:27;;;;-1:-1:-1;7732:11:12;;7716:27;7712:809;;;7783:19;;-1:-1:-1;7804:19:12;;-1:-1:-1;7712:809:12;;;7845:23;7871:55;7889:19;7910:6;7918:7;7871:17;:55::i;:::-;7845:81;;7960:19;7938:18;:41;7934:581;;8021:15;7999:18;:37;;7991:90;;;;;;;13779:2:13;7991:90:12;;;13761:21:13;13818:2;13798:18;;;13791:30;13857:34;13837:18;;;13830:62;13928:10;13908:18;;;13901:38;13956:19;;7991:90:12;13577:404:13;7991:90:12;8121:19;;-1:-1:-1;8142:18:12;-1:-1:-1;8142:18:12;7934:581;;;8186:23;8212:55;8230:19;8251:7;8260:6;8212:17;:55::i;:::-;8186:81;;8306:19;8284:18;:41;;8277:49;;;;:::i;:::-;8366:15;8344:18;:37;;8336:90;;;;;;;9619:2:13;8336:90:12;;;9601:21:13;9658:2;9638:18;;;9631:30;9697:34;9677:18;;;9670:62;9768:10;9748:18;;;9741:38;9796:19;;8336:90:12;9417:404:13;8336:90:12;8466:18;-1:-1:-1;8486:19:12;;-1:-1:-1;7934:581:12;7837:684;7712:809;7445:1080;;;7225:1300;;;;;;;;:::o;12406:623::-;12577:12;;12627:4;12577:12;12666:51;12686:7;12695;12704:12;12666:19;:51::i;:::-;12651:66;;12723:68;12755:4;12761:10;12773:5;12780:10;12723:31;:68::i;:::-;12818:46;;;;;:23;11379:15:13;;;12818:46:12;;;11361:34:13;11431:15;;;11411:18;;;11404:43;11483:15;;;11463:18;;;11456:43;12818:23:12;;;;;11273:18:13;;12818:46:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12797:67;;-1:-1:-1;12797:67:12;-1:-1:-1;12878:22:12;;;;12870:74;;;;;;;14188:2:13;12870:74:12;;;14170:21:13;14227:2;14207:18;;;14200:30;14266:34;14246:18;;;14239:62;14337:9;14317:18;;;14310:37;14364:19;;12870:74:12;13986:403:13;12870:74:12;12969:11;12958:7;:22;;12950:74;;;;;;;14596:2:13;12950:74:12;;;14578:21:13;14635:2;14615:18;;;14608:30;14674:34;14654:18;;;14647:62;14745:9;14725:18;;;14718:37;14772:19;;12950:74:12;14394:403:13;12950:74:12;12605:424;;12406:623;;;;;;;;;:::o;2365:120::-;2437:8;2478:2;2460:14;2472:2;2460:9;:14;:::i;:::-;2459:21;;;;:::i;:::-;2453:27;2365:120;-1:-1:-1;;;;2365:120:12:o;14:184:13:-;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:13;692:18;;679:32;720:33;679:32;720:33;:::i;:::-;362:525;;772:7;;-1:-1:-1;;;;826:2:13;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:13;1438:18;;1425:32;1466:33;1425:32;1466:33;:::i;:::-;1074:663;;1518:7;;-1:-1:-1;;;;1572:2:13;1557:18;;1544:32;;1623:2;1608:18;;1595:32;;1674:3;1659:19;;1646:33;;-1:-1:-1;1726:3:13;1711:19;;;1698:33;;-1:-1:-1;1074:663:13: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:13;2089:18;;2076:32;2117:33;2076:32;2117:33;:::i;:::-;1742:594;;2169:7;;-1:-1:-1;;;;2223:2:13;2208:18;;2195:32;;2274:2;2259:18;;2246:32;;2325:3;2310:19;;;2297:33;;-1:-1:-1;1742:594:13: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:13;2705:18;;2692:32;2733:33;2692:32;2733:33;:::i;:::-;2785:7;-1:-1:-1;2844:2:13;2829:18;;2816:32;2857:33;2816:32;2857:33;:::i;:::-;2341:736;;;;-1:-1:-1;2909:7:13;;2963:2;2948:18;;2935:32;;-1:-1:-1;3014:3:13;2999:19;;2986:33;;3066:3;3051:19;;;3038:33;;-1:-1:-1;2341:736:13;-1:-1:-1;;2341:736:13:o;3082:452::-;3168:6;3176;3184;3192;3245:3;3233:9;3224:7;3220:23;3216:33;3213:53;;;3262:1;3259;3252:12;3213:53;3301:9;3288:23;3320:31;3345:5;3320:31;:::i;:::-;3370:5;3422:2;3407:18;;3394:32;;-1:-1:-1;3473:2:13;3458:18;;3445:32;;3524:2;3509:18;3496:32;;-1:-1:-1;3082:452:13;-1:-1:-1;;;3082:452:13:o;3539:805::-;3652:6;3660;3668;3676;3684;3692;3700;3753:3;3741:9;3732:7;3728:23;3724:33;3721:53;;;3770:1;3767;3760:12;3721:53;3809:9;3796:23;3828:31;3853:5;3828:31;:::i;:::-;3878:5;-1:-1:-1;3935:2:13;3920:18;;3907:32;3948:33;3907:32;3948:33;:::i;:::-;4000:7;-1:-1:-1;4059:2:13;4044:18;;4031:32;4072:33;4031:32;4072:33;:::i;:::-;3539:805;;;;-1:-1:-1;4124:7:13;;4178:2;4163:18;;4150:32;;-1:-1:-1;4229:3:13;4214:19;;4201:33;;4281:3;4266:19;;4253:33;;-1:-1:-1;4333:3:13;4318:19;;;4305:33;;-1:-1:-1;3539:805:13;-1:-1:-1;;3539:805:13:o;5259:277::-;5326:6;5379:2;5367:9;5358:7;5354:23;5350:32;5347:52;;;5395:1;5392;5385:12;5347:52;5427:9;5421:16;5480:5;5473:13;5466:21;5459:5;5456:32;5446:60;;5502:1;5499;5492:12;5446:60;5525:5;5259:277;-1:-1:-1;;;5259:277:13:o;5955:245::-;6034:6;6042;6095:2;6083:9;6074:7;6070:23;6066:32;6063:52;;;6111:1;6108;6101:12;6063:52;-1:-1:-1;;6134:16:13;;6190:2;6175:18;;;6169:25;6134:16;;6169:25;;-1:-1:-1;5955:245:13:o;6205:184::-;6275:6;6328:2;6316:9;6307:7;6303:23;6299:32;6296:52;;;6344:1;6341;6334:12;6296:52;-1:-1:-1;6367:16:13;;6205:184;-1:-1:-1;6205:184:13:o;7694:::-;7746:77;7743:1;7736:88;7843:4;7840:1;7833:15;7867:4;7864:1;7857:15;7883:128;7950:9;;;7971:11;;;7968:37;;;7985:18;;:::i;:::-;7883:128;;;;:::o;8579:251::-;8649:6;8702:2;8690:9;8681:7;8677:23;8673:32;8670:52;;;8718:1;8715;8708:12;8670:52;8750:9;8744:16;8769:31;8794:5;8769:31;:::i;8835:274::-;8875:1;8901;8891:189;;8936:77;8933:1;8926:88;9037:4;9034:1;9027:15;9065:4;9062:1;9055:15;8891:189;-1:-1:-1;9094:9:13;;8835:274::o;9114:125::-;9179:9;;;9200:10;;;9197:36;;;9213:18;;:::i;9244:168::-;9317:9;;;9348;;9365:15;;;9359:22;;9345:37;9335:71;;9386:18;;:::i;11699:412::-;11828:3;11866:6;11860:13;11891:1;11901:129;11915:6;11912:1;11909:13;11901:129;;;12013:4;11997:14;;;11993:25;;11987:32;11974:11;;;11967:53;11930:12;11901:129;;;-1:-1:-1;12085:1:13;12049:16;;12074:13;;;-1:-1:-1;12049:16:13;11699:412;-1:-1:-1;11699:412:13:o

Swarm Source

ipfs://a95f33b4286ad5dea5afdaed301e181f75bbf44e00456839003044a4264ee0c5

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.