POL Price: $0.21833 (+0.00%)
Gas: 32.9 GWei
 

Overview

POL Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 POL

POL Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Swap Exact Token...705895062025-04-21 21:35:2233 hrs ago1745271322IN
0xbE75Dd16...20Dd2862e
0 POL0.0134689639
Swap Exact Token...705893582025-04-21 21:30:0633 hrs ago1745271006IN
0xbE75Dd16...20Dd2862e
0 POL0.0067787439
Remove Liquidity705893232025-04-21 21:28:5233 hrs ago1745270932IN
0xbE75Dd16...20Dd2862e
0 POL0.0096184939
Swap Exact Token...705890612025-04-21 21:19:3633 hrs ago1745270376IN
0xbE75Dd16...20Dd2862e
0 POL0.0093981839
Swap Exact Token...705781082025-04-21 14:50:3540 hrs ago1745247035IN
0xbE75Dd16...20Dd2862e
0 POL0.0151860538
Add Liquidity705707212025-04-21 10:28:5944 hrs ago1745231339IN
0xbE75Dd16...20Dd2862e
0 POL0.0019151739
Add Liquidity705707002025-04-21 10:28:1344 hrs ago1745231293IN
0xbE75Dd16...20Dd2862e
0 POL0.0088643139
Add Liquidity705706822025-04-21 10:27:3544 hrs ago1745231255IN
0xbE75Dd16...20Dd2862e
0 POL0.0088387239
Swap Exact Token...705706162025-04-21 10:25:1544 hrs ago1745231115IN
0xbE75Dd16...20Dd2862e
0 POL0.010256139
Swap Exact Token...705697472025-04-21 9:54:2945 hrs ago1745229269IN
0xbE75Dd16...20Dd2862e
0 POL0.0088293239
Swap Exact Token...705016732025-04-19 17:41:083 days ago1745084468IN
0xbE75Dd16...20Dd2862e
0 POL0.0130517739
Add Liquidity705015652025-04-19 17:37:183 days ago1745084238IN
0xbE75Dd16...20Dd2862e
0 POL0.0084182437
Add Liquidity705015032025-04-19 17:35:063 days ago1745084106IN
0xbE75Dd16...20Dd2862e
0 POL0.0087789937
Swap Exact Token...705014702025-04-19 17:33:563 days ago1745084036IN
0xbE75Dd16...20Dd2862e
0 POL0.006613637
Add Liquidity705013342025-04-19 17:29:083 days ago1745083748IN
0xbE75Dd16...20Dd2862e
0 POL0.008593137
Add Liquidity705013072025-04-19 17:28:103 days ago1745083690IN
0xbE75Dd16...20Dd2862e
0 POL0.0061199437
Add Liquidity705012302025-04-19 17:25:243 days ago1745083524IN
0xbE75Dd16...20Dd2862e
0 POL0.0085750837
Swap Exact Token...705011882025-04-19 17:23:563 days ago1745083436IN
0xbE75Dd16...20Dd2862e
0 POL0.0091912837
Swap Exact Token...704535782025-04-18 13:11:234 days ago1744981883IN
0xbE75Dd16...20Dd2862e
0 POL0.0075341634
Swap Exact Token...702293882025-04-13 0:01:3710 days ago1744502497IN
0xbE75Dd16...20Dd2862e
0 POL0.0079773436
Swap Exact Token...700884702025-04-09 12:44:0713 days ago1744202647IN
0xbE75Dd16...20Dd2862e
0 POL0.0077557535
Swap Exact Token...699912202025-04-07 2:51:4516 days ago1743994305IN
0xbE75Dd16...20Dd2862e
0 POL0.0229975101.59299411
Swap Exact Token...696067942025-03-28 14:47:0225 days ago1743173222IN
0xbE75Dd16...20Dd2862e
0 POL0.0270167876.54652329
Swap Exact Token...696067372025-03-28 14:45:0225 days ago1743173102IN
0xbE75Dd16...20Dd2862e
0 POL0.027506460.03655173
Swap Exact Token...696066702025-03-28 14:42:3825 days ago1743172958IN
0xbE75Dd16...20Dd2862e
0 POL0.0141325163.77690833
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
705890612025-04-21 21:19:3633 hrs ago1745270376
0xbE75Dd16...20Dd2862e
7.55192489 POL
705890612025-04-21 21:19:3633 hrs ago1745270376
0xbE75Dd16...20Dd2862e
7.55192489 POL
695610572025-03-27 11:38:2526 days ago1743075505
0xbE75Dd16...20Dd2862e
0.72067569 POL
695610572025-03-27 11:38:2526 days ago1743075505
0xbE75Dd16...20Dd2862e
0.72067569 POL
695610332025-03-27 11:37:3326 days ago1743075453
0xbE75Dd16...20Dd2862e
3.22746969 POL
695610332025-03-27 11:37:3326 days ago1743075453
0xbE75Dd16...20Dd2862e
3.22746969 POL
693866832025-03-23 3:44:0331 days ago1742701443
0xbE75Dd16...20Dd2862e
2.78 POL
692863692025-03-20 16:17:4433 days ago1742487464
0xbE75Dd16...20Dd2862e
3.6123272 POL
692863692025-03-20 16:17:4433 days ago1742487464
0xbE75Dd16...20Dd2862e
3.6123272 POL
689833222025-03-13 3:45:4641 days ago1741837546
0xbE75Dd16...20Dd2862e
0.70802461 POL
689833222025-03-13 3:45:4641 days ago1741837546
0xbE75Dd16...20Dd2862e
0.70802461 POL
688830692025-03-10 15:52:4143 days ago1741621961
0xbE75Dd16...20Dd2862e
4.5380732 POL
688830692025-03-10 15:52:4143 days ago1741621961
0xbE75Dd16...20Dd2862e
4.5380732 POL
688827692025-03-10 15:42:0543 days ago1741621325
0xbE75Dd16...20Dd2862e
2.19664111 POL
688827692025-03-10 15:42:0543 days ago1741621325
0xbE75Dd16...20Dd2862e
2.19664111 POL
688824952025-03-10 15:32:2143 days ago1741620741
0xbE75Dd16...20Dd2862e
0.6877264 POL
688824952025-03-10 15:32:2143 days ago1741620741
0xbE75Dd16...20Dd2862e
0.6877264 POL
688043222025-03-08 17:08:3145 days ago1741453711
0xbE75Dd16...20Dd2862e
0.83804616 POL
688043222025-03-08 17:08:3145 days ago1741453711
0xbE75Dd16...20Dd2862e
0.83804616 POL
686803762025-03-05 15:03:3248 days ago1741187012
0xbE75Dd16...20Dd2862e
3.38673578 POL
686803762025-03-05 15:03:3248 days ago1741187012
0xbE75Dd16...20Dd2862e
3.38673578 POL
686740092025-03-05 11:18:0248 days ago1741173482
0xbE75Dd16...20Dd2862e
10.25547959 POL
684375742025-02-27 13:45:0254 days ago1740663902
0xbE75Dd16...20Dd2862e
1.00356407 POL
684375742025-02-27 13:45:0254 days ago1740663902
0xbE75Dd16...20Dd2862e
1.00356407 POL
684331832025-02-27 11:09:3054 days ago1740654570
0xbE75Dd16...20Dd2862e
1 POL
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DystRouter01

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : DystRouter01.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

import "../../lib/Math.sol";
import "../../lib/SafeERC20.sol";
import "../../interface/IERC20.sol";
import "../../interface/IWMATIC.sol";
import "../../interface/IPair.sol";
import "../../interface/IFactory.sol";

contract DystRouter01 {
  using SafeERC20 for IERC20;

  struct Route {
    address from;
    address to;
    bool stable;
  }

  address public immutable factory;
  IWMATIC public immutable wmatic;
  uint internal constant MINIMUM_LIQUIDITY = 10 ** 3;
  bytes32 immutable pairCodeHash;

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

  constructor(address _factory, address _wmatic) {
    factory = _factory;
    pairCodeHash = IFactory(_factory).pairCodeHash();
    wmatic = IWMATIC(_wmatic);
  }

  receive() external payable {
    // only accept ETH via fallback from the WETH contract
    require(msg.sender == address(wmatic), "DystRouter: NOT_WMATIC");
  }

  function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1) {
    return _sortTokens(tokenA, tokenB);
  }

  function _sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
    require(tokenA != tokenB, 'DystRouter: IDENTICAL_ADDRESSES');
    (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
    require(token0 != address(0), 'DystRouter: ZERO_ADDRESS');
  }

  function pairFor(address tokenA, address tokenB, bool stable) external view returns (address pair) {
    return _pairFor(tokenA, tokenB, stable);
  }

  /// @dev Calculates the CREATE2 address for a pair without making any external calls.
  function _pairFor(address tokenA, address tokenB, bool stable) internal view returns (address pair) {
    (address token0, address token1) = _sortTokens(tokenA, tokenB);
    pair = address(uint160(uint(keccak256(abi.encodePacked(
        hex'ff',
        factory,
        keccak256(abi.encodePacked(token0, token1, stable)),
        pairCodeHash // init code hash
      )))));
  }

  function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB) {
    return _quoteLiquidity(amountA, reserveA, reserveB);
  }

  /// @dev Given some amount of an asset and pair reserves, returns an equivalent amount of the other asset.
  function _quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
    require(amountA > 0, 'DystRouter: INSUFFICIENT_AMOUNT');
    require(reserveA > 0 && reserveB > 0, 'DystRouter: INSUFFICIENT_LIQUIDITY');
    amountB = amountA * reserveB / reserveA;
  }

  function getReserves(address tokenA, address tokenB, bool stable) external view returns (uint reserveA, uint reserveB) {
    return _getReserves(tokenA, tokenB, stable);
  }

  /// @dev Fetches and sorts the reserves for a pair.
  function _getReserves(address tokenA, address tokenB, bool stable) internal view returns (uint reserveA, uint reserveB) {
    (address token0,) = _sortTokens(tokenA, tokenB);
    (uint reserve0, uint reserve1,) = IPair(_pairFor(tokenA, tokenB, stable)).getReserves();
    (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
  }

  /// @dev Performs chained getAmountOut calculations on any number of pairs.
  function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amount, bool stable) {
    address pair = _pairFor(tokenIn, tokenOut, true);
    uint amountStable;
    uint amountVolatile;
    if (IFactory(factory).isPair(pair)) {
      amountStable = IPair(pair).getAmountOut(amountIn, tokenIn);
    }
    pair = _pairFor(tokenIn, tokenOut, false);
    if (IFactory(factory).isPair(pair)) {
      amountVolatile = IPair(pair).getAmountOut(amountIn, tokenIn);
    }
    return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false);
  }

  function getExactAmountOut(uint amountIn, address tokenIn, address tokenOut, bool stable) external view returns (uint) {
    address pair = _pairFor(tokenIn, tokenOut, stable);
    if (IFactory(factory).isPair(pair)) {
      return IPair(pair).getAmountOut(amountIn, tokenIn);
    }
    return 0;
  }

  /// @dev Performs chained getAmountOut calculations on any number of pairs.
  function getAmountsOut(uint amountIn, Route[] memory routes) external view returns (uint[] memory amounts) {
    return _getAmountsOut(amountIn, routes);
  }

  function _getAmountsOut(uint amountIn, Route[] memory routes) internal view returns (uint[] memory amounts) {
    require(routes.length >= 1, 'DystRouter: INVALID_PATH');
    amounts = new uint[](routes.length + 1);
    amounts[0] = amountIn;
    for (uint i = 0; i < routes.length; i++) {
      address pair = _pairFor(routes[i].from, routes[i].to, routes[i].stable);
      if (IFactory(factory).isPair(pair)) {
        amounts[i + 1] = IPair(pair).getAmountOut(amounts[i], routes[i].from);
      }
    }
  }

  function isPair(address pair) external view returns (bool) {
    return IFactory(factory).isPair(pair);
  }

  function quoteAddLiquidity(
    address tokenA,
    address tokenB,
    bool stable,
    uint amountADesired,
    uint amountBDesired
  ) external view returns (uint amountA, uint amountB, uint liquidity) {
    // create the pair if it doesn't exist yet
    address _pair = IFactory(factory).getPair(tokenA, tokenB, stable);
    (uint reserveA, uint reserveB) = (0, 0);
    uint _totalSupply = 0;
    if (_pair != address(0)) {
      _totalSupply = IERC20(_pair).totalSupply();
      (reserveA, reserveB) = _getReserves(tokenA, tokenB, stable);
    }
    if (reserveA == 0 && reserveB == 0) {
      (amountA, amountB) = (amountADesired, amountBDesired);
      liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY;
    } else {

      uint amountBOptimal = _quoteLiquidity(amountADesired, reserveA, reserveB);
      if (amountBOptimal <= amountBDesired) {
        (amountA, amountB) = (amountADesired, amountBOptimal);
        liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
      } else {
        uint amountAOptimal = _quoteLiquidity(amountBDesired, reserveB, reserveA);
        (amountA, amountB) = (amountAOptimal, amountBDesired);
        liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
      }
    }
  }

  function quoteRemoveLiquidity(
    address tokenA,
    address tokenB,
    bool stable,
    uint liquidity
  ) external view returns (uint amountA, uint amountB) {
    // create the pair if it doesn't exist yet
    address _pair = IFactory(factory).getPair(tokenA, tokenB, stable);

    if (_pair == address(0)) {
      return (0, 0);
    }

    (uint reserveA, uint reserveB) = _getReserves(tokenA, tokenB, stable);
    uint _totalSupply = IERC20(_pair).totalSupply();
    // using balances ensures pro-rata distribution
    amountA = liquidity * reserveA / _totalSupply;
    // using balances ensures pro-rata distribution
    amountB = liquidity * reserveB / _totalSupply;

  }

  function _addLiquidity(
    address tokenA,
    address tokenB,
    bool stable,
    uint amountADesired,
    uint amountBDesired,
    uint amountAMin,
    uint amountBMin
  ) internal returns (uint amountA, uint amountB) {
    require(amountADesired >= amountAMin, "DystRouter: DESIRED_A_AMOUNT");
    require(amountBDesired >= amountBMin, "DystRouter: DESIRED_B_AMOUNT");
    // create the pair if it doesn't exist yet
    address _pair = IFactory(factory).getPair(tokenA, tokenB, stable);
    if (_pair == address(0)) {
      _pair = IFactory(factory).createPair(tokenA, tokenB, stable);
    }
    (uint reserveA, uint reserveB) = _getReserves(tokenA, tokenB, stable);
    if (reserveA == 0 && reserveB == 0) {
      (amountA, amountB) = (amountADesired, amountBDesired);
    } else {
      uint amountBOptimal = _quoteLiquidity(amountADesired, reserveA, reserveB);
      if (amountBOptimal <= amountBDesired) {
        require(amountBOptimal >= amountBMin, 'DystRouter: INSUFFICIENT_B_AMOUNT');
        (amountA, amountB) = (amountADesired, amountBOptimal);
      } else {
        uint amountAOptimal = _quoteLiquidity(amountBDesired, reserveB, reserveA);
        assert(amountAOptimal <= amountADesired);
        require(amountAOptimal >= amountAMin, 'DystRouter: INSUFFICIENT_A_AMOUNT');
        (amountA, amountB) = (amountAOptimal, amountBDesired);
      }
    }
  }

  function addLiquidity(
    address tokenA,
    address tokenB,
    bool stable,
    uint amountADesired,
    uint amountBDesired,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline
  ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
    (amountA, amountB) = _addLiquidity(
      tokenA,
      tokenB,
      stable,
      amountADesired,
      amountBDesired,
      amountAMin,
      amountBMin
    );
    address pair = _pairFor(tokenA, tokenB, stable);
    SafeERC20.safeTransferFrom(IERC20(tokenA), msg.sender, pair, amountA);
    SafeERC20.safeTransferFrom(IERC20(tokenB), msg.sender, pair, amountB);
    liquidity = IPair(pair).mint(to);
  }

  function addLiquidityMATIC(
    address token,
    bool stable,
    uint amountTokenDesired,
    uint amountTokenMin,
    uint amountMATICMin,
    address to,
    uint deadline
  ) external payable ensure(deadline) returns (uint amountToken, uint amountMATIC, uint liquidity) {
    (amountToken, amountMATIC) = _addLiquidity(
      token,
      address(wmatic),
      stable,
      amountTokenDesired,
      msg.value,
      amountTokenMin,
      amountMATICMin
    );
    address pair = _pairFor(token, address(wmatic), stable);
    IERC20(token).safeTransferFrom(msg.sender, pair, amountToken);
    wmatic.deposit{value : amountMATIC}();
    assert(wmatic.transfer(pair, amountMATIC));
    liquidity = IPair(pair).mint(to);
    // refund dust eth, if any
    if (msg.value > amountMATIC) _safeTransferMATIC(msg.sender, msg.value - amountMATIC);
  }

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

  function removeLiquidity(
    address tokenA,
    address tokenB,
    bool stable,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline
  ) external returns (uint amountA, uint amountB) {
    return _removeLiquidity(
      tokenA,
      tokenB,
      stable,
      liquidity,
      amountAMin,
      amountBMin,
      to,
      deadline
    );
  }

  function _removeLiquidity(
    address tokenA,
    address tokenB,
    bool stable,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline
  ) internal ensure(deadline) returns (uint amountA, uint amountB) {
    address pair = _pairFor(tokenA, tokenB, stable);
    IERC20(pair).safeTransferFrom(msg.sender, pair, liquidity);
    // send liquidity to pair
    (uint amount0, uint amount1) = IPair(pair).burn(to);
    (address token0,) = _sortTokens(tokenA, tokenB);
    (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
    require(amountA >= amountAMin, 'DystRouter: INSUFFICIENT_A_AMOUNT');
    require(amountB >= amountBMin, 'DystRouter: INSUFFICIENT_B_AMOUNT');
  }

  function removeLiquidityMATIC(
    address token,
    bool stable,
    uint liquidity,
    uint amountTokenMin,
    uint amountMATICMin,
    address to,
    uint deadline
  ) external returns (uint amountToken, uint amountMATIC) {
    return _removeLiquidityMATIC(
      token,
      stable,
      liquidity,
      amountTokenMin,
      amountMATICMin,
      to,
      deadline
    );
  }

  function _removeLiquidityMATIC(
    address token,
    bool stable,
    uint liquidity,
    uint amountTokenMin,
    uint amountMATICMin,
    address to,
    uint deadline
  ) internal ensure(deadline) returns (uint amountToken, uint amountMATIC) {
    (amountToken, amountMATIC) = _removeLiquidity(
      token,
      address(wmatic),
      stable,
      liquidity,
      amountTokenMin,
      amountMATICMin,
      address(this),
      deadline
    );
    IERC20(token).safeTransfer(to, amountToken);
    wmatic.withdraw(amountMATIC);
    _safeTransferMATIC(to, amountMATIC);
  }

  function removeLiquidityWithPermit(
    address tokenA,
    address tokenB,
    bool stable,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline,
    bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external returns (uint amountA, uint amountB) {
    address pair = _pairFor(tokenA, tokenB, stable);
    {
      uint value = approveMax ? type(uint).max : liquidity;
      IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    }

    (amountA, amountB) = _removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline);
  }

  function removeLiquidityMATICWithPermit(
    address token,
    bool stable,
    uint liquidity,
    uint amountTokenMin,
    uint amountMATICMin,
    address to,
    uint deadline,
    bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external returns (uint amountToken, uint amountMATIC) {
    address pair = _pairFor(token, address(wmatic), stable);
    uint value = approveMax ? type(uint).max : liquidity;
    IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    (amountToken, amountMATIC) = _removeLiquidityMATIC(token, stable, liquidity, amountTokenMin, amountMATICMin, to, deadline);
  }

  function removeLiquidityMATICSupportingFeeOnTransferTokens(
    address token,
    bool stable,
    uint liquidity,
    uint amountTokenMin,
    uint amountFTMMin,
    address to,
    uint deadline
  ) external returns (uint amountToken, uint amountFTM) {
    return _removeLiquidityMATICSupportingFeeOnTransferTokens(
      token,
      stable,
      liquidity,
      amountTokenMin,
      amountFTMMin,
      to,
      deadline
    );
  }

  function _removeLiquidityMATICSupportingFeeOnTransferTokens(
    address token,
    bool stable,
    uint liquidity,
    uint amountTokenMin,
    uint amountFTMMin,
    address to,
    uint deadline
  ) internal ensure(deadline) returns (uint amountToken, uint amountFTM) {
    (amountToken, amountFTM) = _removeLiquidity(
      token,
      address(wmatic),
      stable,
      liquidity,
      amountTokenMin,
      amountFTMMin,
      address(this),
      deadline
    );
    IERC20(token).safeTransfer(to, IERC20(token).balanceOf(address(this)));
    wmatic.withdraw(amountFTM);
    _safeTransferMATIC(to, amountFTM);
  }

  function removeLiquidityMATICWithPermitSupportingFeeOnTransferTokens(
    address token,
    bool stable,
    uint liquidity,
    uint amountTokenMin,
    uint amountFTMMin,
    address to,
    uint deadline,
    bool approveMax, uint8 v, bytes32 r, bytes32 s
  ) external returns (uint amountToken, uint amountFTM) {
    address pair = _pairFor(token, address(wmatic), stable);
    uint value = approveMax ? type(uint).max : liquidity;
    IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
    (amountToken, amountFTM) = _removeLiquidityMATICSupportingFeeOnTransferTokens(
      token, stable, liquidity, amountTokenMin, amountFTMMin, to, deadline
    );
  }

  // **** SWAP ****
  // requires the initial amount to have already been sent to the first pair
  function _swap(uint[] memory amounts, Route[] memory routes, address _to) internal virtual {
    for (uint i = 0; i < routes.length; i++) {
      (address token0,) = _sortTokens(routes[i].from, routes[i].to);
      uint amountOut = amounts[i + 1];
      (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
      address to = i < routes.length - 1 ? _pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to;
      IPair(_pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(
        amount0Out, amount1Out, to, new bytes(0)
      );
    }
  }

  function _swapSupportingFeeOnTransferTokens(Route[] memory routes, address _to) internal virtual {
    for (uint i; i < routes.length; i++) {
      (address input, address output) = (routes[i].from, routes[i].to);
      (address token0,) = _sortTokens(input, output);
      IPair pair = IPair(_pairFor(routes[i].from, routes[i].to, routes[i].stable));
      uint amountInput;
      uint amountOutput;
      {// scope to avoid stack too deep errors
        (uint reserve0, uint reserve1,) = pair.getReserves();
        uint reserveInput = input == token0 ? reserve0 : reserve1;
        amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput;
        //(amountOutput,) = getAmountOut(amountInput, input, output, stable);
        amountOutput = pair.getAmountOut(amountInput, input);
      }
      (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
      address to = i < routes.length - 1 ? _pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to;
      pair.swap(amount0Out, amount1Out, to, new bytes(0));
    }
  }

  function swapExactTokensForTokensSimple(
    uint amountIn,
    uint amountOutMin,
    address tokenFrom,
    address tokenTo,
    bool stable,
    address to,
    uint deadline
  ) external ensure(deadline) returns (uint[] memory amounts) {
    Route[] memory routes = new Route[](1);
    routes[0].from = tokenFrom;
    routes[0].to = tokenTo;
    routes[0].stable = stable;
    amounts = _getAmountsOut(amountIn, routes);
    require(amounts[amounts.length - 1] >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT');
    IERC20(routes[0].from).safeTransferFrom(
      msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
    );
    _swap(amounts, routes, to);
  }

  function swapExactTokensForTokens(
    uint amountIn,
    uint amountOutMin,
    Route[] calldata routes,
    address to,
    uint deadline
  ) external ensure(deadline) returns (uint[] memory amounts) {
    amounts = _getAmountsOut(amountIn, routes);
    require(amounts[amounts.length - 1] >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT');
    IERC20(routes[0].from).safeTransferFrom(
      msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
    );
    _swap(amounts, routes, to);
  }

  function swapExactMATICForTokens(uint amountOutMin, Route[] calldata routes, address to, uint deadline)
  external
  payable
  ensure(deadline)
  returns (uint[] memory amounts)
  {
    require(routes[0].from == address(wmatic), 'DystRouter: INVALID_PATH');
    amounts = _getAmountsOut(msg.value, routes);
    require(amounts[amounts.length - 1] >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT');
    wmatic.deposit{value : amounts[0]}();
    assert(wmatic.transfer(_pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
    _swap(amounts, routes, to);
  }

  function swapExactTokensForMATIC(uint amountIn, uint amountOutMin, Route[] calldata routes, address to, uint deadline)
  external
  ensure(deadline)
  returns (uint[] memory amounts)
  {
    require(routes[routes.length - 1].to == address(wmatic), 'DystRouter: INVALID_PATH');
    amounts = _getAmountsOut(amountIn, routes);
    require(amounts[amounts.length - 1] >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT');
    IERC20(routes[0].from).safeTransferFrom(
      msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
    );
    _swap(amounts, routes, address(this));
    wmatic.withdraw(amounts[amounts.length - 1]);
    _safeTransferMATIC(to, amounts[amounts.length - 1]);
  }

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    Route[] calldata routes,
    address to,
    uint deadline
  ) external ensure(deadline) {
    IERC20(routes[0].from).safeTransferFrom(
      msg.sender,
      _pairFor(routes[0].from, routes[0].to, routes[0].stable),
      amountIn
    );
    uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(routes, to);
    require(
      IERC20(routes[routes.length - 1].to).balanceOf(to) - balanceBefore >= amountOutMin,
      'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT'
    );
  }

  function swapExactMATICForTokensSupportingFeeOnTransferTokens(
    uint amountOutMin,
    Route[] calldata routes,
    address to,
    uint deadline
  )
  external
  payable
  ensure(deadline)
  {
    require(routes[0].from == address(wmatic), 'DystRouter: INVALID_PATH');
    uint amountIn = msg.value;
    wmatic.deposit{value : amountIn}();
    assert(wmatic.transfer(_pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn));
    uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to);
    _swapSupportingFeeOnTransferTokens(routes, to);
    require(
      IERC20(routes[routes.length - 1].to).balanceOf(to) - balanceBefore >= amountOutMin,
      'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT'
    );
  }

  function swapExactTokensForMATICSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    Route[] calldata routes,
    address to,
    uint deadline
  )
  external
  ensure(deadline)
  {
    require(routes[routes.length - 1].to == address(wmatic), 'DystRouter: INVALID_PATH');
    IERC20(routes[0].from).safeTransferFrom(
      msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn
    );
    _swapSupportingFeeOnTransferTokens(routes, address(this));
    uint amountOut = IERC20(address(wmatic)).balanceOf(address(this));
    require(amountOut >= amountOutMin, 'DystRouter: INSUFFICIENT_OUTPUT_AMOUNT');
    wmatic.withdraw(amountOut);
    _safeTransferMATIC(to, amountOut);
  }

  function UNSAFE_swapExactTokensForTokens(
    uint[] memory amounts,
    Route[] calldata routes,
    address to,
    uint deadline
  ) external ensure(deadline) returns (uint[] memory) {
    IERC20(routes[0].from).safeTransferFrom(msg.sender, _pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]);
    _swap(amounts, routes, to);
    return amounts;
  }

  function _safeTransferMATIC(address to, uint value) internal {
    (bool success,) = to.call{value : value}(new bytes(0));
    require(success, 'DystRouter: ETH_TRANSFER_FAILED');
  }
}

File 2 of 8 : Math.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

library Math {

  function max(uint a, uint b) internal pure returns (uint) {
    return a >= b ? a : b;
  }

  function min(uint a, uint b) internal pure returns (uint) {
    return a < b ? a : b;
  }

  function positiveInt128(int128 value) internal pure returns (int128) {
    return value < 0 ? int128(0) : value;
  }

  function closeTo(uint a, uint b, uint target) internal pure returns (bool) {
    if (a > b) {
      if (a - b <= target) {
        return true;
      }
    } else {
      if (b - a <= target) {
        return true;
      }
    }
    return false;
  }

  function sqrt(uint y) internal pure returns (uint z) {
    if (y > 3) {
      z = y;
      uint x = y / 2 + 1;
      while (x < z) {
        z = x;
        x = (y / x + x) / 2;
      }
    } else if (y != 0) {
      z = 1;
    }
  }

}

File 3 of 8 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.13;

import "../interface/IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  using Address for address;

  function safeTransfer(
    IERC20 token,
    address to,
    uint value
  ) internal {
    _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
  }

  function safeTransferFrom(
    IERC20 token,
    address from,
    address to,
    uint value
  ) internal {
    _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
  }

  function safeIncreaseAllowance(
    IERC20 token,
    address spender,
    uint value
  ) internal {
    uint newAllowance = token.allowance(address(this), spender) + value;
    _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
  }

  /**
   * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
  function _callOptionalReturn(IERC20 token, bytes memory data) private {
    // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
    // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
    // the target address contains contract code and also asserts for success in the low-level call.

    bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
    if (returndata.length > 0) {
      // Return data is optional
      require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }
  }

}

File 4 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
  /**
   * @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 `recipient`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
    address recipient,
    uint256 amount
  ) external returns (bool);

  /**
   * @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);
}

File 5 of 8 : IWMATIC.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

interface IWMATIC {
  function name() external view returns (string memory);

  function approve(address guy, uint256 wad) external returns (bool);

  function totalSupply() external view returns (uint256);

  function transferFrom(
    address src,
    address dst,
    uint256 wad
  ) external returns (bool);

  function withdraw(uint256 wad) external;

  function decimals() external view returns (uint8);

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

  function symbol() external view returns (string memory);

  function transfer(address dst, uint256 wad) external returns (bool);

  function deposit() external payable;

  function allowance(address, address) external view returns (uint256);

}

File 6 of 8 : IPair.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

interface IPair {

  // Structure to capture time period obervations every 30 minutes, used for local oracles
  struct Observation {
    uint timestamp;
    uint reserve0Cumulative;
    uint reserve1Cumulative;
  }

  function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

  function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;

  function burn(address to) external returns (uint amount0, uint amount1);

  function mint(address to) external returns (uint liquidity);

  function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast);

  function getAmountOut(uint, address) external view returns (uint);

  function claimFees() external returns (uint, uint);

  function tokens() external returns (address, address);

  function token0() external returns (address);

  function token1() external returns (address);
}

File 7 of 8 : IFactory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

interface IFactory {
  function treasury() external view returns (address);

  function isPair(address pair) external view returns (bool);

  function getInitializable() external view returns (address, address, bool);

  function isPaused() external view returns (bool);

  function pairCodeHash() external pure returns (bytes32);

  function getPair(address tokenA, address token, bool stable) external view returns (address);

  function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
}

File 8 of 8 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.13;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
  /**
   * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
  function isContract(address account) internal view returns (bool) {
    // This method relies on extcodesize/address.code.length, which returns 0
    // for contracts in construction, since the code is only stored at the end
    // of the constructor execution.

    return account.code.length > 0;
  }

  function functionCall(
    address target,
    bytes memory data,
    string memory errorMessage
  ) internal returns (bytes memory) {
    require(isContract(target), "Address: call to non-contract");
    (bool success, bytes memory returndata) = target.call(data);
    return verifyCallResult(success, returndata, errorMessage);
  }

  /**
   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
  function verifyCallResult(
    bool success,
    bytes memory returndata,
    string memory errorMessage
  ) internal pure returns (bytes memory) {
    if (success) {
      return returndata;
    } else {
      // Look for revert reason and bubble it up if present
      if (returndata.length > 0) {
        // The easiest way to bubble the revert reason is using memory via assembly
        assembly {
          let returndata_size := mload(returndata)
          revert(add(32, returndata), returndata_size)
        }
      } else {
        revert(errorMessage);
      }
    }
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wmatic","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountMATICMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityMATIC","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountMATIC","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getExactAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quoteLiquidity","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountMATICMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityMATIC","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountMATIC","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityMATICSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountMATICMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityMATICWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountMATIC","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountFTMMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityMATICWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountFTM","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactMATICForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactMATICForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForMATIC","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForMATICSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct DystRouter01.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wmatic","outputs":[{"internalType":"contract IWMATIC","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162004bad38038062004bad8339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c05161497a620002336000396000612ace0152600081816101cb01528181610629015281816108d901528181610957015281816109cb01528181610cfe01528181610eea015281816117b9015281816118cc0152818161195a01528181611e9201528181611f7d0152818161205d01528181612093015281816120d101528181612166015281816124640152818161256c01528181612617015281816136d301528181613797015261398f01526000818161055201528181610fd0015281816112780152818161138c01528181611a9e01528181611d8e0152818161229d015281816128e001528181612a93015281816134c20152613563015261497a6000f3fe6080604052600436106101bb5760003560e01c80639881fcb4116100ec578063cf14e1b11161008a578063e5e31b1311610064578063e5e31b13146105c7578063f41766d8146105f7578063fb41be1614610617578063fbace4151461064b57600080fd5b8063cf14e1b114610574578063d251deed14610594578063e2dbe241146105b457600080fd5b8063ae568868116100c6578063ae568868146104d2578063b6710cb914610500578063c11efebc14610520578063c45a01551461054057600080fd5b80639881fcb41461047257806398a0fb3c14610492578063a32b1fcd146104b257600080fd5b80635a47ddc3116101595780636cc1ae13116101335780636cc1ae13146103ff5780637301e3c81461041f578063765f62a91461043f57806392e364411461045f57600080fd5b80635a47ddc31461036f5780635e1e6325146103aa5780635e60dab5146103df57600080fd5b8063340dbb0b11610195578063340dbb0b146102b75780634386e63c146102d75780634c1ee03e146102f7578063544caa561461032f57600080fd5b80630dede6c41461023d57806313dcfc591461027757806325200f17146102a457600080fd5b3661023857336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102365760405162461bcd60e51b815260206004820152601660248201527544797374526f757465723a204e4f545f574d4154494360501b60448201526064015b60405180910390fd5b005b600080fd5b34801561024957600080fd5b5061025d610258366004613c0e565b61066b565b604080519283526020830191909152015b60405180910390f35b34801561028357600080fd5b50610297610292366004613c93565b61068f565b60405161026e9190613d0e565b6102366102b2366004613d97565b6108b6565b3480156102c357600080fd5b506102976102d2366004613dfe565b610cd1565b3480156102e357600080fd5b5061025d6102f2366004613e71565b610fc9565b34801561030357600080fd5b50610317610312366004613ec2565b611130565b6040516001600160a01b03909116815260200161026e565b34801561033b57600080fd5b5061034f61034a366004613f0d565b611147565b604080516001600160a01b0393841681529290911660208301520161026e565b34801561037b57600080fd5b5061038f61038a366004613f46565b611160565b6040805193845260208401929092529082015260600161026e565b3480156103b657600080fd5b506103ca6103c5366004613fd5565b611240565b6040805192835290151560208301520161026e565b3480156103eb57600080fd5b5061025d6103fa366004613ec2565b611494565b34801561040b57600080fd5b5061023661041a366004613dfe565b6114ae565b34801561042b57600080fd5b5061029761043a366004614077565b6116b7565b34801561044b57600080fd5b5061025d61045a366004614143565b611772565b61029761046d366004613d97565b611794565b34801561047e57600080fd5b5061029761048d366004614214565b611a8a565b34801561049e57600080fd5b5061038f6104ad3660046142ba565b611a96565b3480156104be57600080fd5b5061025d6104cd366004614326565b611c96565b3480156104de57600080fd5b506104f26104ed3660046143e2565b611d51565b60405190815260200161026e565b34801561050c57600080fd5b506104f261051b36600461440e565b611d5e565b34801561052c57600080fd5b5061025d61053b366004614461565b611e87565b34801561054c57600080fd5b506103177f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b5061025d61058f366004614143565b611f60565b3480156105a057600080fd5b5061025d6105af366004614461565b611f72565b61038f6105c2366004614143565b612031565b3480156105d357600080fd5b506105e76105e236600461450b565b61227b565b604051901515815260200161026e565b34801561060357600080fd5b50610297610612366004613dfe565b612310565b34801561062357600080fd5b506103177f000000000000000000000000000000000000000000000000000000000000000081565b34801561065757600080fd5b50610236610666366004613dfe565b612439565b60008061067e8a8a8a8a8a8a8a8a612685565b915091509850989650505050505050565b606081428110156106b25760405162461bcd60e51b815260040161022d90614528565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816106c9579050509050878160008151811061070c5761070c614555565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061074457610744614555565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061077c5761077c614555565b602090810291909101015190151560409091015261079a8a826127ca565b92508883600185516107ac9190614581565b815181106107bc576107bc614555565b602002602001015110156107e25760405162461bcd60e51b815260040161022d90614598565b61089e3361084b836000815181106107fc576107fc614555565b6020026020010151600001518460008151811061081b5761081b614555565b6020026020010151602001518560008151811061083a5761083a614555565b602002602001015160400151612a4c565b8560008151811061085e5761085e614555565b60200260200101518460008151811061087957610879614555565b6020026020010151600001516001600160a01b0316612b54909392919063ffffffff16565b6108a9838287612bc5565b5050979650505050505050565b80428110156108d75760405162461bcd60e51b815260040161022d90614528565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061091457610914614555565b61092a926020606090920201908101915061450b565b6001600160a01b0316146109505760405162461bcd60e51b815260040161022d906145de565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109b057600080fd5b505af11580156109c4573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb610a7f88886000818110610a0e57610a0e614555565b610a24926020606090920201908101915061450b565b89896000818110610a3757610a37614555565b9050606002016020016020810190610a4f919061450b565b8a8a6000818110610a6257610a62614555565b9050606002016040016020810190610a7a9190614615565b612a4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af09190614632565b610afc57610afc61464f565b60008686610b0b600182614581565b818110610b1a57610b1a614555565b9050606002016020016020810190610b32919061450b565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015610b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614665565b9050610bfc8787808060200260200160405190810160405280939291908181526020016000905b82821015610bf157610be26060830286013681900381019061467e565b81526020019060010190610bc5565b505050505086612e14565b87818888610c0b600182614581565b818110610c1a57610c1a614555565b9050606002016020016020810190610c32919061450b565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa158015610c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9f9190614665565b610ca99190614581565b1015610cc75760405162461bcd60e51b815260040161022d90614598565b5050505050505050565b60608142811015610cf45760405162461bcd60e51b815260040161022d90614528565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610d2b600182614581565b818110610d3a57610d3a614555565b9050606002016020016020810190610d52919061450b565b6001600160a01b031614610d785760405162461bcd60e51b815260040161022d906145de565b610dd4888787808060200260200160405190810160405280939291908181526020016000905b82821015610dca57610dbb6060830286013681900381019061467e565b81526020019060010190610d9e565b50505050506127ca565b9150868260018451610de69190614581565b81518110610df657610df6614555565b60200260200101511015610e1c5760405162461bcd60e51b815260040161022d90614598565b610e8b33610e3688886000818110610a0e57610a0e614555565b84600081518110610e4957610e49614555565b602002602001015189896000818110610e6457610e64614555565b610e7a926020606090920201908101915061450b565b6001600160a01b0316929190612b54565b610ee8828787808060200260200160405190810160405280939291908181526020016000905b82821015610edd57610ece6060830286013681900381019061467e565b81526020019060010190610eb1565b505050505030612bc5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610f269190614581565b81518110610f3657610f36614555565b60200260200101516040518263ffffffff1660e01b8152600401610f5c91815260200190565b600060405180830381600087803b158015610f7657600080fd5b505af1158015610f8a573d6000803e3d6000fd5b50505050610fbe848360018551610fa19190614581565b81518110610fb157610fb1614555565b602002602001015161319c565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b815260040161101e9392919061469a565b602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f91906146be565b90506001600160a01b03811661107c576000809250925050611127565b60008061108a898989613259565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f29190614665565b9050806110ff84896146db565b61110991906146fa565b95508061111683896146db565b61112091906146fa565b9450505050505b94509492505050565b600061113d848484612a4c565b90505b9392505050565b6000806111548484613323565b915091505b9250929050565b600080600083428110156111865760405162461bcd60e51b815260040161022d90614528565b6111958d8d8d8d8d8d8d613405565b909450925060006111a78e8e8e612a4c565b90506111b58e338388612b54565b6111c18d338387612b54565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190614665565b9250505099509950999650505050505050565b600080600061125185856001612a4c565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190614632565b1561135e576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190614665565b91505b61136a87876000612a4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190614632565b15611472576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f9190614665565b90505b80821161148157806000611485565b8160015b94509450505050935093915050565b6000806114a2858585613259565b91509150935093915050565b80428110156114cf5760405162461bcd60e51b815260040161022d90614528565b6115513361153d878760008181106114e9576114e9614555565b6114ff926020606090920201908101915061450b565b8888600081811061151257611512614555565b905060600201602001602081019061152a919061450b565b89896000818110610a6257610a62614555565b8988886000818110610e6457610e64614555565b60008585611560600182614581565b81811061156f5761156f614555565b9050606002016020016020810190611587919061450b565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f39190614665565b90506116518686808060200260200160405190810160405280939291908181526020016000905b82821015611646576116376060830286013681900381019061467e565b8152602001906001019061161a565b505050505085612e14565b86818787611660600182614581565b81811061166f5761166f614555565b9050606002016020016020810190611687919061450b565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a0823190602401610c5e565b606081428110156116da5760405162461bcd60e51b815260040161022d90614528565b611707336116f488886000818110610a0e57610a0e614555565b89600081518110610e4957610e49614555565b611764878787808060200260200160405190810160405280939291908181526020016000905b828210156117595761174a6060830286013681900381019061467e565b8152602001906001019061172d565b505050505086612bc5565b8691505b5095945050505050565b600080611784898989898989896136a9565b9150915097509795505050505050565b606081428110156117b75760405162461bcd60e51b815260040161022d90614528565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106117f4576117f4614555565b61180a926020606090920201908101915061450b565b6001600160a01b0316146118305760405162461bcd60e51b815260040161022d906145de565b611882348787808060200260200160405190810160405280939291908181526020016000905b82821015610dca576118736060830286013681900381019061467e565b81526020019060010190611856565b91508682600184516118949190614581565b815181106118a4576118a4614555565b602002602001015110156118ca5760405162461bcd60e51b815260040161022d90614598565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061190c5761190c614555565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561193f57600080fd5b505af1158015611953573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61199d88886000818110610a0e57610a0e614555565b846000815181106119b0576119b0614555565b60200260200101516040518363ffffffff1660e01b81526004016119e99291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2c9190614632565b611a3857611a3861464f565b611768828787808060200260200160405190810160405280939291908181526020016000905b8282101561175957611a7b6060830286013681900381019061467e565b81526020019060010190611a5e565b606061114083836127ca565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611aec9392919061469a565b602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906146be565b9050600080806001600160a01b03841615611bb757836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba49190614665565b9050611bb18c8c8c613259565b90935091505b82158015611bc3575081155b15611bf4578896508795506103e8611be3611bde888a6146db565b613812565b611bed9190614581565b9450611c87565b6000611c018a8585613882565b9050888111611c4957899750955085611c4284611c1e848b6146db565b611c2891906146fa565b84611c33858b6146db565b611c3d91906146fa565b61394f565b9550611c85565b6000611c568a8587613882565b9850899750889050611c8185611c6c85846146db565b611c7691906146fa565b85611c33868c6146db565b9650505b505b50505050955095509592505050565b6000806000611ca68f8f8f612a4c565b9050600087611cb5578c611cb9565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611cf4903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b158015611d0e57600080fd5b505af1158015611d22573d6000803e3d6000fd5b5050505050611d378f8f8f8f8f8f8f8f612685565b8093508194505050509c509c9a5050505050505050505050565b600061113d848484613882565b600080611d6c858585612a4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015611dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfb9190614632565b15611e79576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a90604401602060405180830381865afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e719190614665565b915050611e7f565b60009150505b949350505050565b6000806000611eb78e7f00000000000000000000000000000000000000000000000000000000000000008f612a4c565b9050600087611ec6578c611eca565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611f05903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b158015611f1f57600080fd5b505af1158015611f33573d6000803e3d6000fd5b50505050611f468f8f8f8f8f8f8f613965565b809450819550505050509b509b9950505050505050505050565b60008061178489898989898989613965565b6000806000611fa28e7f00000000000000000000000000000000000000000000000000000000000000008f612a4c565b9050600087611fb1578c611fb5565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611ff0903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b15801561200a57600080fd5b505af115801561201e573d6000803e3d6000fd5b50505050611f468f8f8f8f8f8f8f6136a9565b600080600083428110156120575760405162461bcd60e51b815260040161022d90614528565b6120868b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d613405565b909450925060006120b88c7f00000000000000000000000000000000000000000000000000000000000000008d612a4c565b90506120cf6001600160a01b038d16338388612b54565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561212a57600080fd5b505af115801561213e573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156121b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d79190614632565b6121e3576121e361464f565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561222b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224f9190614665565b92508334111561226c5761226c336122678634614581565b61319c565b50509750975097945050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa1580156122e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230a9190614632565b92915050565b606081428110156123335760405162461bcd60e51b815260040161022d90614528565b612385888787808060200260200160405190810160405280939291908181526020016000905b82821015610dca576123766060830286013681900381019061467e565b81526020019060010190612359565b91508682600184516123979190614581565b815181106123a7576123a7614555565b602002602001015110156123cd5760405162461bcd60e51b815260040161022d90614598565b6123e733610e3688886000818110610a0e57610a0e614555565b610fbe828787808060200260200160405190810160405280939291908181526020016000905b828210156117595761242a6060830286013681900381019061467e565b8152602001906001019061240d565b804281101561245a5760405162461bcd60e51b815260040161022d90614528565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585612491600182614581565b8181106124a0576124a0614555565b90506060020160200160208101906124b8919061450b565b6001600160a01b0316146124de5760405162461bcd60e51b815260040161022d906145de565b6124f83361153d878760008181106114e9576114e9614555565b6125548585808060200260200160405190810160405280939291908181526020016000905b828210156125495761253a6060830286013681900381019061467e565b8152602001906001019061251d565b505050505030612e14565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df9190614665565b9050868110156126015760405162461bcd60e51b815260040161022d90614598565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561266357600080fd5b505af1158015612677573d6000803e3d6000fd5b50505050610cc7848261319c565b60008082428110156126a95760405162461bcd60e51b815260040161022d90614528565b60006126b68c8c8c612a4c565b90506126cd6001600160a01b03821633838c612b54565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015612719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273d919061475d565b91509150600061274d8f8f613323565b509050806001600160a01b03168f6001600160a01b031614612770578183612773565b82825b90975095508a8710156127985760405162461bcd60e51b815260040161022d90614781565b898610156127b85760405162461bcd60e51b815260040161022d906147c2565b50505050509850989650505050505050565b60606001825110156127ee5760405162461bcd60e51b815260040161022d906145de565b81516127fb906001614803565b67ffffffffffffffff8111156128135761281361400c565b60405190808252806020026020018201604052801561283c578160200160208202803683370190505b509050828160008151811061285357612853614555565b60200260200101818152505060005b8251811015612a455760006128be84838151811061288257612882614555565b6020026020010151600001518584815181106128a0576128a0614555565b60200260200101516020015186858151811061083a5761083a614555565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d9190614632565b15612a3257806001600160a01b031663f140a35a84848151811061297357612973614555565b602002602001015186858151811061298d5761298d614555565b6020026020010151600001516040518363ffffffff1660e01b81526004016129c89291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156129e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a099190614665565b83612a15846001614803565b81518110612a2557612a25614555565b6020026020010181815250505b5080612a3d8161481b565b915050612862565b5092915050565b6000806000612a5b8686613323565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f0000000000000000000000000000000000000000000000000000000000000000604051602001612b32939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612bbf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139d2565b50505050565b60005b8251811015612bbf576000612c17848381518110612be857612be8614555565b602002602001015160000151858481518110612c0657612c06614555565b602002602001015160200151613323565b509050600085612c28846001614803565b81518110612c3857612c38614555565b60200260200101519050600080836001600160a01b0316878681518110612c6157612c61614555565b6020026020010151600001516001600160a01b031614612c8357826000612c87565b6000835b91509150600060018851612c9b9190614581565b8610612ca75786612d1a565b612d1a88612cb6886001614803565b81518110612cc657612cc6614555565b60200260200101516000015189886001612ce09190614803565b81518110612cf057612cf0614555565b6020026020010151602001518a896001612d0a9190614803565b8151811061083a5761083a614555565b9050612d6d888781518110612d3157612d31614555565b602002602001015160000151898881518110612d4f57612d4f614555565b6020026020010151602001518a898151811061083a5761083a614555565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612daa576020820181803683370190505b506040518563ffffffff1660e01b8152600401612dca949392919061488c565b600060405180830381600087803b158015612de457600080fd5b505af1158015612df8573d6000803e3d6000fd5b5050505050505050508080612e0c9061481b565b915050612bc8565b60005b825181101561319757600080848381518110612e3557612e35614555565b602002602001015160000151858481518110612e5357612e53614555565b602002602001015160200151915091506000612e6f8383613323565b5090506000612ec5878681518110612e8957612e89614555565b602002602001015160000151888781518110612ea757612ea7614555565b60200260200101516020015189888151811061083a5761083a614555565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2f91906148d0565b506001600160701b031691506001600160701b031691506000866001600160a01b0316896001600160a01b031614612f675781612f69565b825b6040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa158015612fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd89190614665565b612fe29190614581565b6040516378a051ad60e11b8152600481018290526001600160a01b038b811660248301529196509087169063f140a35a90604401602060405180830381865afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190614665565b9350505050600080856001600160a01b0316886001600160a01b03161461308057826000613084565b6000835b91509150600060018c516130989190614581565b8a106130a4578a613107565b6131078c6130b38c6001614803565b815181106130c3576130c3614555565b6020026020010151600001518d8c60016130dd9190614803565b815181106130ed576130ed614555565b6020026020010151602001518e8d6001612d0a9190614803565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613149908690869086906024810161488c565b600060405180830381600087803b15801561316357600080fd5b505af1158015613177573d6000803e3d6000fd5b50505050505050505050505050808061318f9061481b565b915050612e17565b505050565b604080516000808252602082019092526001600160a01b0384169083906040516131c69190614915565b60006040518083038185875af1925050503d8060008114613203576040519150601f19603f3d011682016040523d82523d6000602084013e613208565b606091505b50509050806131975760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a204554485f5452414e534645525f4641494c454400604482015260640161022d565b60008060006132688686613323565b509050600080613279888888612a4c565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156132b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132da91906148d0565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b031614613311578082613314565b81815b90999098509650505050505050565b600080826001600160a01b0316846001600160a01b0316036133875760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a204944454e544943414c5f41444452455353455300604482015260640161022d565b826001600160a01b0316846001600160a01b0316106133a75782846133aa565b83835b90925090506001600160a01b0382166111595760405162461bcd60e51b815260206004820152601860248201527f44797374526f757465723a205a45524f5f414444524553530000000000000000604482015260640161022d565b600080838610156134585760405162461bcd60e51b815260206004820152601c60248201527f44797374526f757465723a20444553495245445f415f414d4f554e5400000000604482015260640161022d565b828510156134a85760405162461bcd60e51b815260206004820152601c60248201527f44797374526f757465723a20444553495245445f425f414d4f554e5400000000604482015260640161022d565b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc30906134fb908d908d908d9060040161469a565b602060405180830381865afa158015613518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353c91906146be565b90506001600160a01b0381166135e2576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce49061359c908d908d908d9060040161469a565b6020604051808303816000875af11580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df91906146be565b90505b6000806135f08c8c8c613259565b91509150816000148015613602575080155b156136125788945087935061369a565b600061361f8a8484613882565b905088811161365357868110156136485760405162461bcd60e51b815260040161022d906147c2565b899550935083613698565b60006136608a8486613882565b90508a8111156136725761367261464f565b888110156136925760405162461bcd60e51b815260040161022d90614781565b95508894505b505b50505097509795505050505050565b60008082428110156136cd5760405162461bcd60e51b815260040161022d90614528565b6136fd8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b612685565b6040516370a0823160e01b815230600482015291945092506137819086906001600160a01b038d16906370a0823190602401602060405180830381865afa15801561374c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137709190614665565b6001600160a01b038d169190613aa4565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156137e357600080fd5b505af11580156137f7573d6000803e3d6000fd5b50505050613805858361319c565b5097509795505050505050565b60006003821115613873575080600061382c6002836146fa565b613837906001614803565b90505b8181101561386d5790508060028161385281866146fa565b61385c9190614803565b61386691906146fa565b905061383a565b50919050565b811561387d575060015b919050565b60008084116138d35760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a20494e53554646494349454e545f414d4f554e5400604482015260640161022d565b6000831180156138e35750600082115b61393a5760405162461bcd60e51b815260206004820152602260248201527f44797374526f757465723a20494e53554646494349454e545f4c495155494449604482015261545960f01b606482015260840161022d565b8261394583866146db565b61113d91906146fa565b600081831061395e5781611140565b5090919050565b60008082428110156139895760405162461bcd60e51b815260040161022d90614528565b6139b98a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b612685565b90935091506137816001600160a01b038b168685613aa4565b6000613a27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ad49092919063ffffffff16565b8051909150156131975780806020019051810190613a459190614632565b6131975760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161022d565b6040516001600160a01b03831660248201526044810182905261319790849063a9059cbb60e01b90606401612b88565b60606001600160a01b0384163b613b2d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161022d565b600080856001600160a01b031685604051613b489190614915565b6000604051808303816000865af19150503d8060008114613b85576040519150601f19603f3d011682016040523d82523d6000602084013e613b8a565b606091505b5091509150613b9a828286613ba4565b9695505050505050565b60608315613bb3575081611140565b825115613bc35782518084602001fd5b8160405162461bcd60e51b815260040161022d9190614931565b6001600160a01b0381168114613bf257600080fd5b50565b803561387d81613bdd565b8015158114613bf257600080fd5b600080600080600080600080610100898b031215613c2b57600080fd5b8835613c3681613bdd565b97506020890135613c4681613bdd565b96506040890135613c5681613c00565b9550606089013594506080890135935060a0890135925060c0890135613c7b81613bdd565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613cae57600080fd5b87359650602088013595506040880135613cc781613bdd565b94506060880135613cd781613bdd565b93506080880135613ce781613c00565b925060a0880135613cf781613bdd565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613d4657835183529284019291840191600101613d2a565b50909695505050505050565b60008083601f840112613d6457600080fd5b50813567ffffffffffffffff811115613d7c57600080fd5b60208301915083602060608302850101111561115957600080fd5b600080600080600060808688031215613daf57600080fd5b85359450602086013567ffffffffffffffff811115613dcd57600080fd5b613dd988828901613d52565b9095509350506040860135613ded81613bdd565b949793965091946060013592915050565b60008060008060008060a08789031215613e1757600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613e3c57600080fd5b613e4889828a01613d52565b9095509350506060870135613e5c81613bdd565b80925050608087013590509295509295509295565b60008060008060808587031215613e8757600080fd5b8435613e9281613bdd565b93506020850135613ea281613bdd565b92506040850135613eb281613c00565b9396929550929360600135925050565b600080600060608486031215613ed757600080fd5b8335613ee281613bdd565b92506020840135613ef281613bdd565b91506040840135613f0281613c00565b809150509250925092565b60008060408385031215613f2057600080fd5b8235613f2b81613bdd565b91506020830135613f3b81613bdd565b809150509250929050565b60008060008060008060008060006101208a8c031215613f6557600080fd5b8935613f7081613bdd565b985060208a0135613f8081613bdd565b975060408a0135613f9081613c00565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613fbc81613bdd565b809250506101008a013590509295985092959850929598565b600080600060608486031215613fea57600080fd5b833592506020840135613ffc81613bdd565b91506040840135613f0281613bdd565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561404b5761404b61400c565b604052919050565b600067ffffffffffffffff82111561406d5761406d61400c565b5060051b60200190565b60008060008060006080868803121561408f57600080fd5b853567ffffffffffffffff808211156140a757600080fd5b818801915088601f8301126140bb57600080fd5b813560206140d06140cb83614053565b614022565b82815260059290921b8401810191818101908c8411156140ef57600080fd5b948201945b8386101561410d578535825294820194908201906140f4565b9950508901359250508082111561412357600080fd5b5061413088828901613d52565b9095509350613ded905060408701613bf5565b600080600080600080600060e0888a03121561415e57600080fd5b873561416981613bdd565b9650602088013561417981613c00565b955060408801359450606088013593506080880135925060a0880135613cf781613bdd565b6000606082840312156141b057600080fd5b6040516060810181811067ffffffffffffffff821117156141d3576141d361400c565b60405290508082356141e481613bdd565b815260208301356141f481613bdd565b6020820152604083013561420781613c00565b6040919091015292915050565b6000806040838503121561422757600080fd5b8235915060208084013567ffffffffffffffff81111561424657600080fd5b8401601f8101861361425757600080fd5b80356142656140cb82614053565b8181526060918202830184019184820191908984111561428457600080fd5b938501935b838510156142aa5761429b8a8661419e565b83529384019391850191614289565b5080955050505050509250929050565b600080600080600060a086880312156142d257600080fd5b85356142dd81613bdd565b945060208601356142ed81613bdd565b935060408601356142fd81613c00565b94979396509394606081013594506080013592915050565b803560ff8116811461387d57600080fd5b6000806000806000806000806000806000806101808d8f03121561434957600080fd5b8c3561435481613bdd565b9b5060208d013561436481613bdd565b9a5060408d013561437481613c00565b995060608d0135985060808d0135975060a08d0135965060c08d013561439981613bdd565b955060e08d013594506101008d01356143b181613c00565b93506143c06101208e01614315565b92506101408d013591506101608d013590509295989b509295989b509295989b565b6000806000606084860312156143f757600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561442457600080fd5b84359350602085013561443681613bdd565b9250604085013561444681613bdd565b9150606085013561445681613c00565b939692955090935050565b60008060008060008060008060008060006101608c8e03121561448357600080fd5b8b3561448e81613bdd565b9a5060208c013561449e81613c00565b995060408c0135985060608c0135975060808c0135965060a08c01356144c381613bdd565b955060c08c0135945060e08c01356144da81613c00565b93506144e96101008d01614315565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60006020828403121561451d57600080fd5b813561114081613bdd565b602080825260139082015272111e5cdd149bdd5d195c8e8811561412549151606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156145935761459361456b565b500390565b60208082526026908201527f44797374526f757465723a20494e53554646494349454e545f4f55545055545f604082015265105353d5539560d21b606082015260800190565b60208082526018908201527f44797374526f757465723a20494e56414c49445f504154480000000000000000604082015260600190565b60006020828403121561462757600080fd5b813561114081613c00565b60006020828403121561464457600080fd5b815161114081613c00565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561467757600080fd5b5051919050565b60006060828403121561469057600080fd5b611140838361419e565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156146d057600080fd5b815161114081613bdd565b60008160001904831182151516156146f5576146f561456b565b500290565b60008261471757634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6000806040838503121561477057600080fd5b505080516020909101519092909150565b60208082526021908201527f44797374526f757465723a20494e53554646494349454e545f415f414d4f554e6040820152601560fa1b606082015260800190565b60208082526021908201527f44797374526f757465723a20494e53554646494349454e545f425f414d4f554e6040820152601560fa1b606082015260800190565b600082198211156148165761481661456b565b500190565b60006001820161482d5761482d61456b565b5060010190565b60005b8381101561484f578181015183820152602001614837565b83811115612bbf5750506000910152565b60008151808452614878816020860160208601614834565b601f01601f19169290920160200192915050565b84815283602082015260018060a01b0383166040820152608060608201526000613b9a6080830184614860565b80516001600160701b038116811461387d57600080fd5b6000806000606084860312156148e557600080fd5b6148ee846148b9565b92506148fc602085016148b9565b9150604084015163ffffffff81168114613f0257600080fd5b60008251614927818460208701614834565b9190910192915050565b602081526000611140602083018461486056fea2646970667358221220b8778e24ce11299fa15b6e6e6848c3232e6eaec9bba1df8244d538430bb1f09a64736f6c634300080d00330000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec90000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

Deployed Bytecode

0x6080604052600436106101bb5760003560e01c80639881fcb4116100ec578063cf14e1b11161008a578063e5e31b1311610064578063e5e31b13146105c7578063f41766d8146105f7578063fb41be1614610617578063fbace4151461064b57600080fd5b8063cf14e1b114610574578063d251deed14610594578063e2dbe241146105b457600080fd5b8063ae568868116100c6578063ae568868146104d2578063b6710cb914610500578063c11efebc14610520578063c45a01551461054057600080fd5b80639881fcb41461047257806398a0fb3c14610492578063a32b1fcd146104b257600080fd5b80635a47ddc3116101595780636cc1ae13116101335780636cc1ae13146103ff5780637301e3c81461041f578063765f62a91461043f57806392e364411461045f57600080fd5b80635a47ddc31461036f5780635e1e6325146103aa5780635e60dab5146103df57600080fd5b8063340dbb0b11610195578063340dbb0b146102b75780634386e63c146102d75780634c1ee03e146102f7578063544caa561461032f57600080fd5b80630dede6c41461023d57806313dcfc591461027757806325200f17146102a457600080fd5b3661023857336001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127016146102365760405162461bcd60e51b815260206004820152601660248201527544797374526f757465723a204e4f545f574d4154494360501b60448201526064015b60405180910390fd5b005b600080fd5b34801561024957600080fd5b5061025d610258366004613c0e565b61066b565b604080519283526020830191909152015b60405180910390f35b34801561028357600080fd5b50610297610292366004613c93565b61068f565b60405161026e9190613d0e565b6102366102b2366004613d97565b6108b6565b3480156102c357600080fd5b506102976102d2366004613dfe565b610cd1565b3480156102e357600080fd5b5061025d6102f2366004613e71565b610fc9565b34801561030357600080fd5b50610317610312366004613ec2565b611130565b6040516001600160a01b03909116815260200161026e565b34801561033b57600080fd5b5061034f61034a366004613f0d565b611147565b604080516001600160a01b0393841681529290911660208301520161026e565b34801561037b57600080fd5b5061038f61038a366004613f46565b611160565b6040805193845260208401929092529082015260600161026e565b3480156103b657600080fd5b506103ca6103c5366004613fd5565b611240565b6040805192835290151560208301520161026e565b3480156103eb57600080fd5b5061025d6103fa366004613ec2565b611494565b34801561040b57600080fd5b5061023661041a366004613dfe565b6114ae565b34801561042b57600080fd5b5061029761043a366004614077565b6116b7565b34801561044b57600080fd5b5061025d61045a366004614143565b611772565b61029761046d366004613d97565b611794565b34801561047e57600080fd5b5061029761048d366004614214565b611a8a565b34801561049e57600080fd5b5061038f6104ad3660046142ba565b611a96565b3480156104be57600080fd5b5061025d6104cd366004614326565b611c96565b3480156104de57600080fd5b506104f26104ed3660046143e2565b611d51565b60405190815260200161026e565b34801561050c57600080fd5b506104f261051b36600461440e565b611d5e565b34801561052c57600080fd5b5061025d61053b366004614461565b611e87565b34801561054c57600080fd5b506103177f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec981565b34801561058057600080fd5b5061025d61058f366004614143565b611f60565b3480156105a057600080fd5b5061025d6105af366004614461565b611f72565b61038f6105c2366004614143565b612031565b3480156105d357600080fd5b506105e76105e236600461450b565b61227b565b604051901515815260200161026e565b34801561060357600080fd5b50610297610612366004613dfe565b612310565b34801561062357600080fd5b506103177f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127081565b34801561065757600080fd5b50610236610666366004613dfe565b612439565b60008061067e8a8a8a8a8a8a8a8a612685565b915091509850989650505050505050565b606081428110156106b25760405162461bcd60e51b815260040161022d90614528565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816106c9579050509050878160008151811061070c5761070c614555565b6020026020010151600001906001600160a01b031690816001600160a01b031681525050868160008151811061074457610744614555565b6020026020010151602001906001600160a01b031690816001600160a01b031681525050858160008151811061077c5761077c614555565b602090810291909101015190151560409091015261079a8a826127ca565b92508883600185516107ac9190614581565b815181106107bc576107bc614555565b602002602001015110156107e25760405162461bcd60e51b815260040161022d90614598565b61089e3361084b836000815181106107fc576107fc614555565b6020026020010151600001518460008151811061081b5761081b614555565b6020026020010151602001518560008151811061083a5761083a614555565b602002602001015160400151612a4c565b8560008151811061085e5761085e614555565b60200260200101518460008151811061087957610879614555565b6020026020010151600001516001600160a01b0316612b54909392919063ffffffff16565b6108a9838287612bc5565b5050979650505050505050565b80428110156108d75760405162461bcd60e51b815260040161022d90614528565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b03168585600081811061091457610914614555565b61092a926020606090920201908101915061450b565b6001600160a01b0316146109505760405162461bcd60e51b815260040161022d906145de565b60003490507f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109b057600080fd5b505af11580156109c4573d6000803e3d6000fd5b50505050507f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663a9059cbb610a7f88886000818110610a0e57610a0e614555565b610a24926020606090920201908101915061450b565b89896000818110610a3757610a37614555565b9050606002016020016020810190610a4f919061450b565b8a8a6000818110610a6257610a62614555565b9050606002016040016020810190610a7a9190614615565b612a4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af09190614632565b610afc57610afc61464f565b60008686610b0b600182614581565b818110610b1a57610b1a614555565b9050606002016020016020810190610b32919061450b565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015610b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614665565b9050610bfc8787808060200260200160405190810160405280939291908181526020016000905b82821015610bf157610be26060830286013681900381019061467e565b81526020019060010190610bc5565b505050505086612e14565b87818888610c0b600182614581565b818110610c1a57610c1a614555565b9050606002016020016020810190610c32919061450b565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa158015610c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9f9190614665565b610ca99190614581565b1015610cc75760405162461bcd60e51b815260040161022d90614598565b5050505050505050565b60608142811015610cf45760405162461bcd60e51b815260040161022d90614528565b6001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270168686610d2b600182614581565b818110610d3a57610d3a614555565b9050606002016020016020810190610d52919061450b565b6001600160a01b031614610d785760405162461bcd60e51b815260040161022d906145de565b610dd4888787808060200260200160405190810160405280939291908181526020016000905b82821015610dca57610dbb6060830286013681900381019061467e565b81526020019060010190610d9e565b50505050506127ca565b9150868260018451610de69190614581565b81518110610df657610df6614555565b60200260200101511015610e1c5760405162461bcd60e51b815260040161022d90614598565b610e8b33610e3688886000818110610a0e57610a0e614555565b84600081518110610e4957610e49614555565b602002602001015189896000818110610e6457610e64614555565b610e7a926020606090920201908101915061450b565b6001600160a01b0316929190612b54565b610ee8828787808060200260200160405190810160405280939291908181526020016000905b82821015610edd57610ece6060830286013681900381019061467e565b81526020019060010190610eb1565b505050505030612bc5565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b0316632e1a7d4d8360018551610f269190614581565b81518110610f3657610f36614555565b60200260200101516040518263ffffffff1660e01b8152600401610f5c91815260200190565b600060405180830381600087803b158015610f7657600080fd5b505af1158015610f8a573d6000803e3d6000fd5b50505050610fbe848360018551610fa19190614581565b81518110610fb157610fb1614555565b602002602001015161319c565b509695505050505050565b60008060007f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec96001600160a01b0316636801cc308888886040518463ffffffff1660e01b815260040161101e9392919061469a565b602060405180830381865afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f91906146be565b90506001600160a01b03811661107c576000809250925050611127565b60008061108a898989613259565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f29190614665565b9050806110ff84896146db565b61110991906146fa565b95508061111683896146db565b61112091906146fa565b9450505050505b94509492505050565b600061113d848484612a4c565b90505b9392505050565b6000806111548484613323565b915091505b9250929050565b600080600083428110156111865760405162461bcd60e51b815260040161022d90614528565b6111958d8d8d8d8d8d8d613405565b909450925060006111a78e8e8e612a4c565b90506111b58e338388612b54565b6111c18d338387612b54565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190614665565b9250505099509950999650505050505050565b600080600061125185856001612a4c565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa1580156112c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e59190614632565b1561135e576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b9190614665565b91505b61136a87876000612a4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa1580156113d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f99190614632565b15611472576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa15801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f9190614665565b90505b80821161148157806000611485565b8160015b94509450505050935093915050565b6000806114a2858585613259565b91509150935093915050565b80428110156114cf5760405162461bcd60e51b815260040161022d90614528565b6115513361153d878760008181106114e9576114e9614555565b6114ff926020606090920201908101915061450b565b8888600081811061151257611512614555565b905060600201602001602081019061152a919061450b565b89896000818110610a6257610a62614555565b8988886000818110610e6457610e64614555565b60008585611560600182614581565b81811061156f5761156f614555565b9050606002016020016020810190611587919061450b565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f39190614665565b90506116518686808060200260200160405190810160405280939291908181526020016000905b82821015611646576116376060830286013681900381019061467e565b8152602001906001019061161a565b505050505085612e14565b86818787611660600182614581565b81811061166f5761166f614555565b9050606002016020016020810190611687919061450b565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a0823190602401610c5e565b606081428110156116da5760405162461bcd60e51b815260040161022d90614528565b611707336116f488886000818110610a0e57610a0e614555565b89600081518110610e4957610e49614555565b611764878787808060200260200160405190810160405280939291908181526020016000905b828210156117595761174a6060830286013681900381019061467e565b8152602001906001019061172d565b505050505086612bc5565b8691505b5095945050505050565b600080611784898989898989896136a9565b9150915097509795505050505050565b606081428110156117b75760405162461bcd60e51b815260040161022d90614528565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b0316868660008181106117f4576117f4614555565b61180a926020606090920201908101915061450b565b6001600160a01b0316146118305760405162461bcd60e51b815260040161022d906145de565b611882348787808060200260200160405190810160405280939291908181526020016000905b82821015610dca576118736060830286013681900381019061467e565b81526020019060010190611856565b91508682600184516118949190614581565b815181106118a4576118a4614555565b602002602001015110156118ca5760405162461bcd60e51b815260040161022d90614598565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663d0e30db08360008151811061190c5761190c614555565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561193f57600080fd5b505af1158015611953573d6000803e3d6000fd5b50505050507f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663a9059cbb61199d88886000818110610a0e57610a0e614555565b846000815181106119b0576119b0614555565b60200260200101516040518363ffffffff1660e01b81526004016119e99291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2c9190614632565b611a3857611a3861464f565b611768828787808060200260200160405190810160405280939291908181526020016000905b8282101561175957611a7b6060830286013681900381019061467e565b81526020019060010190611a5e565b606061114083836127ca565b6000806000807f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec96001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b8152600401611aec9392919061469a565b602060405180830381865afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906146be565b9050600080806001600160a01b03841615611bb757836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba49190614665565b9050611bb18c8c8c613259565b90935091505b82158015611bc3575081155b15611bf4578896508795506103e8611be3611bde888a6146db565b613812565b611bed9190614581565b9450611c87565b6000611c018a8585613882565b9050888111611c4957899750955085611c4284611c1e848b6146db565b611c2891906146fa565b84611c33858b6146db565b611c3d91906146fa565b61394f565b9550611c85565b6000611c568a8587613882565b9850899750889050611c8185611c6c85846146db565b611c7691906146fa565b85611c33868c6146db565b9650505b505b50505050955095509592505050565b6000806000611ca68f8f8f612a4c565b9050600087611cb5578c611cb9565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611cf4903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b158015611d0e57600080fd5b505af1158015611d22573d6000803e3d6000fd5b5050505050611d378f8f8f8f8f8f8f8f612685565b8093508194505050509c509c9a5050505050505050505050565b600061113d848484613882565b600080611d6c858585612a4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa158015611dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfb9190614632565b15611e79576040516378a051ad60e11b8152600481018790526001600160a01b03868116602483015282169063f140a35a90604401602060405180830381865afa158015611e4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e719190614665565b915050611e7f565b60009150505b949350505050565b6000806000611eb78e7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708f612a4c565b9050600087611ec6578c611eca565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611f05903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b158015611f1f57600080fd5b505af1158015611f33573d6000803e3d6000fd5b50505050611f468f8f8f8f8f8f8f613965565b809450819550505050509b509b9950505050505050505050565b60008061178489898989898989613965565b6000806000611fa28e7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708f612a4c565b9050600087611fb1578c611fb5565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611ff0903390309086908f908e908e908e9060040161471c565b600060405180830381600087803b15801561200a57600080fd5b505af115801561201e573d6000803e3d6000fd5b50505050611f468f8f8f8f8f8f8f6136a9565b600080600083428110156120575760405162461bcd60e51b815260040161022d90614528565b6120868b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708c8c348d8d613405565b909450925060006120b88c7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708d612a4c565b90506120cf6001600160a01b038d16338388612b54565b7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561212a57600080fd5b505af115801561213e573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127016935063a9059cbb925060440190506020604051808303816000875af11580156121b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d79190614632565b6121e3576121e361464f565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561222b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224f9190614665565b92508334111561226c5761226c336122678634614581565b61319c565b50509750975097945050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa1580156122e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230a9190614632565b92915050565b606081428110156123335760405162461bcd60e51b815260040161022d90614528565b612385888787808060200260200160405190810160405280939291908181526020016000905b82821015610dca576123766060830286013681900381019061467e565b81526020019060010190612359565b91508682600184516123979190614581565b815181106123a7576123a7614555565b602002602001015110156123cd5760405162461bcd60e51b815260040161022d90614598565b6123e733610e3688886000818110610a0e57610a0e614555565b610fbe828787808060200260200160405190810160405280939291908181526020016000905b828210156117595761242a6060830286013681900381019061467e565b8152602001906001019061240d565b804281101561245a5760405162461bcd60e51b815260040161022d90614528565b6001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270168585612491600182614581565b8181106124a0576124a0614555565b90506060020160200160208101906124b8919061450b565b6001600160a01b0316146124de5760405162461bcd60e51b815260040161022d906145de565b6124f83361153d878760008181106114e9576114e9614555565b6125548585808060200260200160405190810160405280939291908181526020016000905b828210156125495761253a6060830286013681900381019061467e565b8152602001906001019061251d565b505050505030612e14565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b0316906370a0823190602401602060405180830381865afa1580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df9190614665565b9050868110156126015760405162461bcd60e51b815260040161022d90614598565b604051632e1a7d4d60e01b8152600481018290527f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561266357600080fd5b505af1158015612677573d6000803e3d6000fd5b50505050610cc7848261319c565b60008082428110156126a95760405162461bcd60e51b815260040161022d90614528565b60006126b68c8c8c612a4c565b90506126cd6001600160a01b03821633838c612b54565b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015612719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273d919061475d565b91509150600061274d8f8f613323565b509050806001600160a01b03168f6001600160a01b031614612770578183612773565b82825b90975095508a8710156127985760405162461bcd60e51b815260040161022d90614781565b898610156127b85760405162461bcd60e51b815260040161022d906147c2565b50505050509850989650505050505050565b60606001825110156127ee5760405162461bcd60e51b815260040161022d906145de565b81516127fb906001614803565b67ffffffffffffffff8111156128135761281361400c565b60405190808252806020026020018201604052801561283c578160200160208202803683370190505b509050828160008151811061285357612853614555565b60200260200101818152505060005b8251811015612a455760006128be84838151811061288257612882614555565b6020026020010151600001518584815181106128a0576128a0614555565b60200260200101516020015186858151811061083a5761083a614555565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec99091169063e5e31b1390602401602060405180830381865afa158015612929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294d9190614632565b15612a3257806001600160a01b031663f140a35a84848151811061297357612973614555565b602002602001015186858151811061298d5761298d614555565b6020026020010151600001516040518363ffffffff1660e01b81526004016129c89291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156129e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a099190614665565b83612a15846001614803565b81518110612a2557612a25614555565b6020026020010181815250505b5080612a3d8161481b565b915050612862565b5092915050565b6000806000612a5b8686613323565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec990604901604051602081830303815290604052805190602001207f009bce6d7eb00d3d075e5bd9851068137f44bba159f1cde806a268e20baaf2e8604051602001612b32939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612bbf9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139d2565b50505050565b60005b8251811015612bbf576000612c17848381518110612be857612be8614555565b602002602001015160000151858481518110612c0657612c06614555565b602002602001015160200151613323565b509050600085612c28846001614803565b81518110612c3857612c38614555565b60200260200101519050600080836001600160a01b0316878681518110612c6157612c61614555565b6020026020010151600001516001600160a01b031614612c8357826000612c87565b6000835b91509150600060018851612c9b9190614581565b8610612ca75786612d1a565b612d1a88612cb6886001614803565b81518110612cc657612cc6614555565b60200260200101516000015189886001612ce09190614803565b81518110612cf057612cf0614555565b6020026020010151602001518a896001612d0a9190614803565b8151811061083a5761083a614555565b9050612d6d888781518110612d3157612d31614555565b602002602001015160000151898881518110612d4f57612d4f614555565b6020026020010151602001518a898151811061083a5761083a614555565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612daa576020820181803683370190505b506040518563ffffffff1660e01b8152600401612dca949392919061488c565b600060405180830381600087803b158015612de457600080fd5b505af1158015612df8573d6000803e3d6000fd5b5050505050505050508080612e0c9061481b565b915050612bc8565b60005b825181101561319757600080848381518110612e3557612e35614555565b602002602001015160000151858481518110612e5357612e53614555565b602002602001015160200151915091506000612e6f8383613323565b5090506000612ec5878681518110612e8957612e89614555565b602002602001015160000151888781518110612ea757612ea7614555565b60200260200101516020015189888151811061083a5761083a614555565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612f0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2f91906148d0565b506001600160701b031691506001600160701b031691506000866001600160a01b0316896001600160a01b031614612f675781612f69565b825b6040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa158015612fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd89190614665565b612fe29190614581565b6040516378a051ad60e11b8152600481018290526001600160a01b038b811660248301529196509087169063f140a35a90604401602060405180830381865afa158015613033573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130579190614665565b9350505050600080856001600160a01b0316886001600160a01b03161461308057826000613084565b6000835b91509150600060018c516130989190614581565b8a106130a4578a613107565b6131078c6130b38c6001614803565b815181106130c3576130c3614555565b6020026020010151600001518d8c60016130dd9190614803565b815181106130ed576130ed614555565b6020026020010151602001518e8d6001612d0a9190614803565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f90613149908690869086906024810161488c565b600060405180830381600087803b15801561316357600080fd5b505af1158015613177573d6000803e3d6000fd5b50505050505050505050505050808061318f9061481b565b915050612e17565b505050565b604080516000808252602082019092526001600160a01b0384169083906040516131c69190614915565b60006040518083038185875af1925050503d8060008114613203576040519150601f19603f3d011682016040523d82523d6000602084013e613208565b606091505b50509050806131975760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a204554485f5452414e534645525f4641494c454400604482015260640161022d565b60008060006132688686613323565b509050600080613279888888612a4c565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156132b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132da91906148d0565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b031614613311578082613314565b81815b90999098509650505050505050565b600080826001600160a01b0316846001600160a01b0316036133875760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a204944454e544943414c5f41444452455353455300604482015260640161022d565b826001600160a01b0316846001600160a01b0316106133a75782846133aa565b83835b90925090506001600160a01b0382166111595760405162461bcd60e51b815260206004820152601860248201527f44797374526f757465723a205a45524f5f414444524553530000000000000000604482015260640161022d565b600080838610156134585760405162461bcd60e51b815260206004820152601c60248201527f44797374526f757465723a20444553495245445f415f414d4f554e5400000000604482015260640161022d565b828510156134a85760405162461bcd60e51b815260206004820152601c60248201527f44797374526f757465723a20444553495245445f425f414d4f554e5400000000604482015260640161022d565b6040516306801cc360e41b81526000906001600160a01b037f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec91690636801cc30906134fb908d908d908d9060040161469a565b602060405180830381865afa158015613518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353c91906146be565b90506001600160a01b0381166135e2576040516320b7f73960e21b81526001600160a01b037f0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec916906382dfdce49061359c908d908d908d9060040161469a565b6020604051808303816000875af11580156135bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135df91906146be565b90505b6000806135f08c8c8c613259565b91509150816000148015613602575080155b156136125788945087935061369a565b600061361f8a8484613882565b905088811161365357868110156136485760405162461bcd60e51b815260040161022d906147c2565b899550935083613698565b60006136608a8486613882565b90508a8111156136725761367261464f565b888110156136925760405162461bcd60e51b815260040161022d90614781565b95508894505b505b50505097509795505050505050565b60008082428110156136cd5760405162461bcd60e51b815260040161022d90614528565b6136fd8a7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708b8b8b8b308b612685565b6040516370a0823160e01b815230600482015291945092506137819086906001600160a01b038d16906370a0823190602401602060405180830381865afa15801561374c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137709190614665565b6001600160a01b038d169190613aa4565b604051632e1a7d4d60e01b8152600481018390527f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12706001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156137e357600080fd5b505af11580156137f7573d6000803e3d6000fd5b50505050613805858361319c565b5097509795505050505050565b60006003821115613873575080600061382c6002836146fa565b613837906001614803565b90505b8181101561386d5790508060028161385281866146fa565b61385c9190614803565b61386691906146fa565b905061383a565b50919050565b811561387d575060015b919050565b60008084116138d35760405162461bcd60e51b815260206004820152601f60248201527f44797374526f757465723a20494e53554646494349454e545f414d4f554e5400604482015260640161022d565b6000831180156138e35750600082115b61393a5760405162461bcd60e51b815260206004820152602260248201527f44797374526f757465723a20494e53554646494349454e545f4c495155494449604482015261545960f01b606482015260840161022d565b8261394583866146db565b61113d91906146fa565b600081831061395e5781611140565b5090919050565b60008082428110156139895760405162461bcd60e51b815260040161022d90614528565b6139b98a7f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12708b8b8b8b308b612685565b90935091506137816001600160a01b038b168685613aa4565b6000613a27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613ad49092919063ffffffff16565b8051909150156131975780806020019051810190613a459190614632565b6131975760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161022d565b6040516001600160a01b03831660248201526044810182905261319790849063a9059cbb60e01b90606401612b88565b60606001600160a01b0384163b613b2d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161022d565b600080856001600160a01b031685604051613b489190614915565b6000604051808303816000865af19150503d8060008114613b85576040519150601f19603f3d011682016040523d82523d6000602084013e613b8a565b606091505b5091509150613b9a828286613ba4565b9695505050505050565b60608315613bb3575081611140565b825115613bc35782518084602001fd5b8160405162461bcd60e51b815260040161022d9190614931565b6001600160a01b0381168114613bf257600080fd5b50565b803561387d81613bdd565b8015158114613bf257600080fd5b600080600080600080600080610100898b031215613c2b57600080fd5b8835613c3681613bdd565b97506020890135613c4681613bdd565b96506040890135613c5681613c00565b9550606089013594506080890135935060a0890135925060c0890135613c7b81613bdd565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a031215613cae57600080fd5b87359650602088013595506040880135613cc781613bdd565b94506060880135613cd781613bdd565b93506080880135613ce781613c00565b925060a0880135613cf781613bdd565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613d4657835183529284019291840191600101613d2a565b50909695505050505050565b60008083601f840112613d6457600080fd5b50813567ffffffffffffffff811115613d7c57600080fd5b60208301915083602060608302850101111561115957600080fd5b600080600080600060808688031215613daf57600080fd5b85359450602086013567ffffffffffffffff811115613dcd57600080fd5b613dd988828901613d52565b9095509350506040860135613ded81613bdd565b949793965091946060013592915050565b60008060008060008060a08789031215613e1757600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613e3c57600080fd5b613e4889828a01613d52565b9095509350506060870135613e5c81613bdd565b80925050608087013590509295509295509295565b60008060008060808587031215613e8757600080fd5b8435613e9281613bdd565b93506020850135613ea281613bdd565b92506040850135613eb281613c00565b9396929550929360600135925050565b600080600060608486031215613ed757600080fd5b8335613ee281613bdd565b92506020840135613ef281613bdd565b91506040840135613f0281613c00565b809150509250925092565b60008060408385031215613f2057600080fd5b8235613f2b81613bdd565b91506020830135613f3b81613bdd565b809150509250929050565b60008060008060008060008060006101208a8c031215613f6557600080fd5b8935613f7081613bdd565b985060208a0135613f8081613bdd565b975060408a0135613f9081613c00565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613fbc81613bdd565b809250506101008a013590509295985092959850929598565b600080600060608486031215613fea57600080fd5b833592506020840135613ffc81613bdd565b91506040840135613f0281613bdd565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561404b5761404b61400c565b604052919050565b600067ffffffffffffffff82111561406d5761406d61400c565b5060051b60200190565b60008060008060006080868803121561408f57600080fd5b853567ffffffffffffffff808211156140a757600080fd5b818801915088601f8301126140bb57600080fd5b813560206140d06140cb83614053565b614022565b82815260059290921b8401810191818101908c8411156140ef57600080fd5b948201945b8386101561410d578535825294820194908201906140f4565b9950508901359250508082111561412357600080fd5b5061413088828901613d52565b9095509350613ded905060408701613bf5565b600080600080600080600060e0888a03121561415e57600080fd5b873561416981613bdd565b9650602088013561417981613c00565b955060408801359450606088013593506080880135925060a0880135613cf781613bdd565b6000606082840312156141b057600080fd5b6040516060810181811067ffffffffffffffff821117156141d3576141d361400c565b60405290508082356141e481613bdd565b815260208301356141f481613bdd565b6020820152604083013561420781613c00565b6040919091015292915050565b6000806040838503121561422757600080fd5b8235915060208084013567ffffffffffffffff81111561424657600080fd5b8401601f8101861361425757600080fd5b80356142656140cb82614053565b8181526060918202830184019184820191908984111561428457600080fd5b938501935b838510156142aa5761429b8a8661419e565b83529384019391850191614289565b5080955050505050509250929050565b600080600080600060a086880312156142d257600080fd5b85356142dd81613bdd565b945060208601356142ed81613bdd565b935060408601356142fd81613c00565b94979396509394606081013594506080013592915050565b803560ff8116811461387d57600080fd5b6000806000806000806000806000806000806101808d8f03121561434957600080fd5b8c3561435481613bdd565b9b5060208d013561436481613bdd565b9a5060408d013561437481613c00565b995060608d0135985060808d0135975060a08d0135965060c08d013561439981613bdd565b955060e08d013594506101008d01356143b181613c00565b93506143c06101208e01614315565b92506101408d013591506101608d013590509295989b509295989b509295989b565b6000806000606084860312156143f757600080fd5b505081359360208301359350604090920135919050565b6000806000806080858703121561442457600080fd5b84359350602085013561443681613bdd565b9250604085013561444681613bdd565b9150606085013561445681613c00565b939692955090935050565b60008060008060008060008060008060006101608c8e03121561448357600080fd5b8b3561448e81613bdd565b9a5060208c013561449e81613c00565b995060408c0135985060608c0135975060808c0135965060a08c01356144c381613bdd565b955060c08c0135945060e08c01356144da81613c00565b93506144e96101008d01614315565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60006020828403121561451d57600080fd5b813561114081613bdd565b602080825260139082015272111e5cdd149bdd5d195c8e8811561412549151606a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156145935761459361456b565b500390565b60208082526026908201527f44797374526f757465723a20494e53554646494349454e545f4f55545055545f604082015265105353d5539560d21b606082015260800190565b60208082526018908201527f44797374526f757465723a20494e56414c49445f504154480000000000000000604082015260600190565b60006020828403121561462757600080fd5b813561114081613c00565b60006020828403121561464457600080fd5b815161114081613c00565b634e487b7160e01b600052600160045260246000fd5b60006020828403121561467757600080fd5b5051919050565b60006060828403121561469057600080fd5b611140838361419e565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156146d057600080fd5b815161114081613bdd565b60008160001904831182151516156146f5576146f561456b565b500290565b60008261471757634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6000806040838503121561477057600080fd5b505080516020909101519092909150565b60208082526021908201527f44797374526f757465723a20494e53554646494349454e545f415f414d4f554e6040820152601560fa1b606082015260800190565b60208082526021908201527f44797374526f757465723a20494e53554646494349454e545f425f414d4f554e6040820152601560fa1b606082015260800190565b600082198211156148165761481661456b565b500190565b60006001820161482d5761482d61456b565b5060010190565b60005b8381101561484f578181015183820152602001614837565b83811115612bbf5750506000910152565b60008151808452614878816020860160208601614834565b601f01601f19169290920160200192915050565b84815283602082015260018060a01b0383166040820152608060608201526000613b9a6080830184614860565b80516001600160701b038116811461387d57600080fd5b6000806000606084860312156148e557600080fd5b6148ee846148b9565b92506148fc602085016148b9565b9150604084015163ffffffff81168114613f0257600080fd5b60008251614927818460208701614834565b9190910192915050565b602081526000611140602083018461486056fea2646970667358221220b8778e24ce11299fa15b6e6e6848c3232e6eaec9bba1df8244d538430bb1f09a64736f6c634300080d0033

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

0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec90000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270

-----Decoded View---------------
Arg [0] : _factory (address): 0x1d21Db6cde1b18c7E47B0F7F42f4b3F68b9beeC9
Arg [1] : _wmatic (address): 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d21db6cde1b18c7e47b0f7f42f4b3f68b9beec9
Arg [1] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270


Block Transaction 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
[ 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.