Contract 0xa58f22e0766b3764376c92915ba545d583c19dbc

 

Contract Overview

Alchemist Coin: MistX Router
Balance:
0 Ether

EtherValue:
$0.00

Token:
Txn Hash Method
Block
From
To
Value
0xc35294ce24df042592501399c7afc5849945e6cb38fb134487ad82231463bb4b0x54d51de4126453242021-06-16 11:48:485 mins ago0x30f4a02719cc8dcd7e383a0c79ced4ab05195a35 IN  Alchemist Coin: MistX Router0.00375960576 Ether00
0xeb1ae95dfc8435a72c8df90b968825b0883b0d198bba3a25f66420092b87815e0xa9483edc126453202021-06-16 11:47:526 mins ago0x9fc151d8f2220b467558dd2f149cf6429f3311a1 IN  Alchemist Coin: MistX Router0.005581634081816 Ether00
0x56db6827c95e535277c205b038334b53ff53552774206402b80bdebe9f8b99930x54d51de4126452932021-06-16 11:43:1111 mins ago0xdeeb758e147ea422e6bad89bcfafabfac0527949 IN  Alchemist Coin: MistX Router0.00882690048 Ether00
0x4956d359533405fe4a17328c18bdc1b0149b584e731118e1e8188ef9db016fc00x54d51de4126452822021-06-16 11:40:4913 mins ago0xdeeb758e147ea422e6bad89bcfafabfac0527949 IN  Alchemist Coin: MistX Router0.00772353792 Ether00
0x741913199a642019ee3ab8d2acd95710a425a43e7a0106186a75c4b4f86eb9520x54d51de4126452552021-06-16 11:33:5620 mins ago0x732be24f7ec08d12b7cea42a8036841634ffa382 IN  Alchemist Coin: MistX Router0.005823302966324 Ether00
0x66d8b10ef7c32b20e30d88074cbc06e100986bb5ea43ab5c0d0da0ba15c8cfb00x54d51de4126452402021-06-16 11:31:5722 mins ago0x44c3ad1c739ec839c3e1c441570b29d18cc0fe9b IN  Alchemist Coin: MistX Router0.00717185664 Ether00
0x74f6f54bbccd8ed29de06a945cbbec36db2e4a3fda76d9ca49219889c7ee20840x982ea020126452302021-06-16 11:29:0025 mins ago0x13f7d4c6b2e378e41ab6b28c7aaa8242a9f1c622 IN  Alchemist Coin: MistX Router10 Ether00
0x5578305738be13ba3626151c42406bcc2b690a29f69300a14d95d97c4c326d7d0x54d51de4126452132021-06-16 11:23:3331 mins ago0x5ad8c3326bff48e5d495ac5eb9dd67790b281210 IN  Alchemist Coin: MistX Router0.004699507885515 Ether00
0xc264461fe0f78f2533d7dc4e69232cf5ab3fa9ad355ed90d0cacff8071134c660x982ea020126451682021-06-16 11:12:5141 mins ago0xdebe86daf458cd7fd077a47b5b12cf31bd51d91e IN  Alchemist Coin: MistX Router0.00675801 Ether00
0x27e5cca73e7b3ec2dc2965cee6e20ced91504270d945bcacdd0d4ed3184468970x465406a7126451502021-06-16 11:09:1745 mins ago0xf6c239eba307cb2e054fa696664f2170b9219d98 IN  Alchemist Coin: MistX Router0 Ether00
0x3161bca1230221f45b8f7c909e3d2d15598563037bc5dd008769ec62807c72c60x982ea020126451412021-06-16 11:06:4947 mins ago0x3690cc4e1a98a1b07a8efc38f4f3afc8f503615b IN  Alchemist Coin: MistX Router0.05 Ether00
0x8317abcf0af712df7e59877f9df82bb394ec33d963356cd53e5d4832c3887ece0x54d51de4126451282021-06-16 11:04:5549 mins ago0xdeeb758e147ea422e6bad89bcfafabfac0527949 IN  Alchemist Coin: MistX Router0.00772353792 Ether00
0x913d2fb003550a4aa3912a0f6b3764f3263dc190a7eb6ed08466d620483c78830x54d51de4126451202021-06-16 11:02:5151 mins ago0xdeeb758e147ea422e6bad89bcfafabfac0527949 IN  Alchemist Coin: MistX Router0.003310088423067 Ether00
0xf6d909d1be1a883013f2c8e9fac3b067300cf72c1836fab2b1064714830372840x465406a7126450802021-06-16 10:55:2559 mins ago0xf02b4e3e47f1d2b6b41e5908a1dd069974cbcc52 IN  Alchemist Coin: MistX Router0 Ether00
0x1aa258ad0ae6005eb48282ca29baae8d6288dca511db30ee800dcf9548770fd60x982ea020126450802021-06-16 10:55:2559 mins ago0x351729a14e0c88f1bdd954177ef2911c342f5f35 IN  Alchemist Coin: MistX Router0.333157742131785 Ether00
0xf8fd605165a7ca9a5435f45245e3d1ce3e7dc418f21392c0325e82d1fdc09c740x54d51de4126450762021-06-16 10:54:371 hr ago0x8d5a9bbdf1ee8e974000dec395c73d3ce8a205b2 IN  Alchemist Coin: MistX Router0.00504686208 Ether00
0xe53393b356fc0876067c3002d3d2b9cb159048cbe42bc57efacf432ea4d4dd8f0x54d51de4126450412021-06-16 10:46:221 hr 8 mins ago0xdeeb758e147ea422e6bad89bcfafabfac0527949 IN  Alchemist Coin: MistX Router0.0055168128 Ether00
0x236e558bbcfe45d941e7a62852e456a49fb106d9f424fcf6ca86e0772283b1920xa9483edc126450332021-06-16 10:45:021 hr 9 mins ago0x351729a14e0c88f1bdd954177ef2911c342f5f35 IN  Alchemist Coin: MistX Router0.14418336835655 Ether00
0xde6b97e8bc5dd23905e0e9ec42cf31b66fff2a4831302a4b8347816dab32c4f80x54d51de4126450312021-06-16 10:44:361 hr 10 mins ago0x8d5a9bbdf1ee8e974000dec395c73d3ce8a205b2 IN  Alchemist Coin: MistX Router0.003108255955504 Ether00
0x0e3309c3665e233116875de4d080e480733fa0d79a71683de69543a322076d530x54d51de4126450292021-06-16 10:44:121 hr 10 mins ago0xdeeb758e147ea422e6bad89bcfafabfac0527949 IN  Alchemist Coin: MistX Router0.00331063936128 Ether00
0xb0856b276c5ebec3680e9ee544d3ee20152867c4331f99641ad8007632900f180x465406a7126450292021-06-16 10:44:121 hr 10 mins ago0x181a81e54da038370a88b95f5b6e352c27c5bdac IN  Alchemist Coin: MistX Router0 Ether00
0x4a333b27126fcd797ce09606cb17f714cb69bfb478c7a72f92169a5e2bb5f9450x982ea020126450002021-06-16 10:38:251 hr 16 mins ago0xaf95a5876bd0e40792cf23e94c2552851ae48de5 IN  Alchemist Coin: MistX Router1 Ether00
0x6cae4da9664669dafe10c747566ec470791448f9294b8279d7c8a8bf44608e930x54d51de4126449542021-06-16 10:28:261 hr 26 mins ago0x9a862a3cada5d8845b6a21839320cfa2b629a2c5 IN  Alchemist Coin: MistX Router0.002534271640322 Ether00
0x2fea180e19335077197856be7fcb7d6dbaf6fe39dcc765680b69b70b9431f6160x54d51de4126449542021-06-16 10:28:261 hr 26 mins ago0x914db5da79f3c123d97587e819aeb9d6a8ba30aa IN  Alchemist Coin: MistX Router0.002368142976 Ether00
0x82d8f8c3982af645cf2ce7c464e6d466dc62807b5b80892c1455d8912c0b68ea0x465406a7126449102021-06-16 10:17:511 hr 36 mins ago0x850e277d20f4b014959505237a3fdef12b7cdd07 IN  Alchemist Coin: MistX Router0 Ether00
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc35294ce24df042592501399c7afc5849945e6cb38fb134487ad82231463bb4b126453242021-06-16 11:48:485 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.000187980288 Ether
0xc35294ce24df042592501399c7afc5849945e6cb38fb134487ad82231463bb4b126453242021-06-16 11:48:485 mins ago Alchemist Coin: MistX RouterEthermine0.003571625472 Ether
0xeb1ae95dfc8435a72c8df90b968825b0883b0d198bba3a25f66420092b87815e126453202021-06-16 11:47:526 mins ago Alchemist Coin: MistX Router0x9fc151d8f2220b467558dd2f149cf6429f3311a10.000027769323790133 Ether
0xeb1ae95dfc8435a72c8df90b968825b0883b0d198bba3a25f66420092b87815e126453202021-06-16 11:47:526 mins ago Alchemist Coin: MistX Router Wrapped Ether0.003314880758026625 Ether
0xeb1ae95dfc8435a72c8df90b968825b0883b0d198bba3a25f66420092b87815e126453202021-06-16 11:47:526 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.0001119492 Ether
0xeb1ae95dfc8435a72c8df90b968825b0883b0d198bba3a25f66420092b87815e126453202021-06-16 11:47:526 mins ago Alchemist Coin: MistX RouterMiningPoolHub0.0021270348 Ether
0x56db6827c95e535277c205b038334b53ff53552774206402b80bdebe9f8b9993126452932021-06-16 11:43:1111 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.000441345024 Ether
0x56db6827c95e535277c205b038334b53ff53552774206402b80bdebe9f8b9993126452932021-06-16 11:43:1111 mins ago Alchemist Coin: MistX RouterUUPool0.008385555456 Ether
0x4956d359533405fe4a17328c18bdc1b0149b584e731118e1e8188ef9db016fc0126452822021-06-16 11:40:4913 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.000386176896 Ether
0x4956d359533405fe4a17328c18bdc1b0149b584e731118e1e8188ef9db016fc0126452822021-06-16 11:40:4913 mins ago Alchemist Coin: MistX RouterF2Pool Old0.007337361024 Ether
0x741913199a642019ee3ab8d2acd95710a425a43e7a0106186a75c4b4f86eb952126452552021-06-16 11:33:5620 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.000291165148316234 Ether
0x741913199a642019ee3ab8d2acd95710a425a43e7a0106186a75c4b4f86eb952126452552021-06-16 11:33:5620 mins ago Alchemist Coin: MistX RouterSpark Pool0.005532137818008438 Ether
0x66d8b10ef7c32b20e30d88074cbc06e100986bb5ea43ab5c0d0da0ba15c8cfb0126452402021-06-16 11:31:5722 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.000358592832 Ether
0x66d8b10ef7c32b20e30d88074cbc06e100986bb5ea43ab5c0d0da0ba15c8cfb0126452402021-06-16 11:31:5722 mins ago Alchemist Coin: MistX RouterSpark Pool0.006813263808 Ether
0x74f6f54bbccd8ed29de06a945cbbec36db2e4a3fda76d9ca49219889c7ee2084126452302021-06-16 11:29:0025 mins ago Alchemist Coin: MistX Router Wrapped Ether9.99551271148 Ether
0x74f6f54bbccd8ed29de06a945cbbec36db2e4a3fda76d9ca49219889c7ee2084126452302021-06-16 11:29:0025 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.000224364426 Ether
0x74f6f54bbccd8ed29de06a945cbbec36db2e4a3fda76d9ca49219889c7ee2084126452302021-06-16 11:29:0025 mins ago Alchemist Coin: MistX Router0xf541c3cd1d2df407fb9bb52b3489fc2aaeedd97e0.004262924094 Ether
0x5578305738be13ba3626151c42406bcc2b690a29f69300a14d95d97c4c326d7d126452132021-06-16 11:23:3331 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.000234975394275754 Ether
0x5578305738be13ba3626151c42406bcc2b690a29f69300a14d95d97c4c326d7d126452132021-06-16 11:23:3331 mins ago Alchemist Coin: MistX RouterMiningPoolHub0.004464532491239318 Ether
0xc264461fe0f78f2533d7dc4e69232cf5ab3fa9ad355ed90d0cacff8071134c66126451682021-06-16 11:12:5141 mins ago Alchemist Coin: MistX Router Wrapped Ether0.004032936 Ether
0xc264461fe0f78f2533d7dc4e69232cf5ab3fa9ad355ed90d0cacff8071134c66126451682021-06-16 11:12:5141 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.0001362537 Ether
0xc264461fe0f78f2533d7dc4e69232cf5ab3fa9ad355ed90d0cacff8071134c66126451682021-06-16 11:12:5141 mins ago Alchemist Coin: MistX RouterSpark Pool0.0025888203 Ether
0x27e5cca73e7b3ec2dc2965cee6e20ced91504270d945bcacdd0d4ed318446897126451502021-06-16 11:09:1745 mins ago Alchemist Coin: MistX Router0xf6c239eba307cb2e054fa696664f2170b9219d983.076484765286845609 Ether
0x27e5cca73e7b3ec2dc2965cee6e20ced91504270d945bcacdd0d4ed318446897126451502021-06-16 11:09:1745 mins ago Alchemist Coin: MistX RouterENS Name mistx.eth0.0002276134146 Ether
0x27e5cca73e7b3ec2dc2965cee6e20ced91504270d945bcacdd0d4ed318446897126451502021-06-16 11:09:1745 mins ago Alchemist Coin: MistX RouterEthermine0.0043246548774 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MistXRouter

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 8 : MistXRouter.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

import './interfaces/IERC20.sol';
import './interfaces/IUniswap.sol';
import './interfaces/IWETH.sol';
import './libraries/MistXLibrary.sol';
import './libraries/SafeERC20.sol';
import './libraries/TransferHelper.sol';


/// @author Nathan Worsley (https://github.com/CodeForcer)
/// @title MistX Gasless Router
contract MistXRouter {
  /***********************
  + Global Settings      +
  ***********************/

  using SafeERC20 for IERC20;

  // The percentage we tip to the miners
  uint256 public bribePercent;

  // Owner of the contract and reciever of tips
  address public owner;

  // Managers are permissioned for critical functionality
  mapping (address => bool) public managers;

  address public immutable WETH;
  address public immutable factory;

  receive() external payable {}
  fallback() external payable {}

  constructor(
    address _WETH,
    address _factory
  ) {
    WETH = _WETH;
    factory = _factory;
    bribePercent = 99;

    owner = msg.sender;
    managers[msg.sender] = true;
  }

  /***********************
  + Structures           +
  ***********************/

  struct Swap {
    uint256 amount0;
    uint256 amount1;
    address[] path;
    address to;
    uint256 deadline;
  }

  /***********************
  + Swap wrappers        +
  ***********************/

  function swapExactETHForTokens(
    Swap calldata _swap,
    uint256 _bribe
  ) external payable {
    deposit(_bribe);

    require(_swap.path[0] == WETH, 'MistXRouter: INVALID_PATH');
    uint amountIn = msg.value - _bribe;
    IWETH(WETH).deposit{value: amountIn}();
    assert(IWETH(WETH).transfer(MistXLibrary.pairFor(factory, _swap.path[0], _swap.path[1]), amountIn));
    uint balanceBefore = IERC20(_swap.path[_swap.path.length - 1]).balanceOf(_swap.to);
    _swapSupportingFeeOnTransferTokens(_swap.path, _swap.to);
    require(
      IERC20(_swap.path[_swap.path.length - 1]).balanceOf(_swap.to) - balanceBefore >= _swap.amount1,
      'MistXRouter: INSUFFICIENT_OUTPUT_AMOUNT'
    );
  }

  function swapETHForExactTokens(
    Swap calldata _swap,
    uint256 _bribe
  ) external payable {
    deposit(_bribe);

    require(_swap.path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
    uint[] memory amounts = MistXLibrary.getAmountsIn(factory, _swap.amount1, _swap.path);
    require(amounts[0] <= msg.value - _bribe, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
    IWETH(WETH).deposit{value: amounts[0]}();
    assert(IWETH(WETH).transfer(MistXLibrary.pairFor(factory, _swap.path[0], _swap.path[1]), amounts[0]));
    _swapPath(amounts, _swap.path, _swap.to);

    // refund dust eth, if any
    if (msg.value - _bribe > amounts[0]) {
      (bool success, ) = msg.sender.call{value: msg.value - _bribe - amounts[0]}(new bytes(0));
      require(success, 'safeTransferETH: ETH transfer failed');
    }
  }

  function swapExactTokensForTokens(
    Swap calldata _swap,
    uint256 _bribe
  ) external payable {
    deposit(_bribe);

    TransferHelper.safeTransferFrom(
      _swap.path[0], msg.sender, MistXLibrary.pairFor(factory, _swap.path[0], _swap.path[1]), _swap.amount0
    );
    uint balanceBefore = IERC20(_swap.path[_swap.path.length - 1]).balanceOf(_swap.to);
    _swapSupportingFeeOnTransferTokens(_swap.path, _swap.to);
    require(
      IERC20(_swap.path[_swap.path.length - 1]).balanceOf(_swap.to) - balanceBefore >= _swap.amount1,
      'MistXRouter: INSUFFICIENT_OUTPUT_AMOUNT'
    );
  }

  function swapTokensForExactTokens(
    Swap calldata _swap,
    uint256 _bribe
  ) external payable {
    deposit(_bribe);

    uint[] memory amounts = MistXLibrary.getAmountsIn(factory, _swap.amount0, _swap.path);
    require(amounts[0] <= _swap.amount1, 'MistXRouter: EXCESSIVE_INPUT_AMOUNT');
    TransferHelper.safeTransferFrom(
      _swap.path[0], msg.sender, MistXLibrary.pairFor(factory, _swap.path[0], _swap.path[1]), amounts[0]
    );
    _swapPath(amounts, _swap.path, _swap.to);
  }

  function swapTokensForExactETH(
    Swap calldata _swap,
    uint256 _bribe
  ) external payable {
    require(_swap.path[_swap.path.length - 1] == WETH, 'MistXRouter: INVALID_PATH');
    uint[] memory amounts = MistXLibrary.getAmountsIn(factory, _swap.amount0, _swap.path);
    require(amounts[0] <= _swap.amount1, 'MistXRouter: EXCESSIVE_INPUT_AMOUNT');
    TransferHelper.safeTransferFrom(
        _swap.path[0], msg.sender, MistXLibrary.pairFor(factory, _swap.path[0], _swap.path[1]), amounts[0]
    );
    _swapPath(amounts, _swap.path, address(this));
    IWETH(WETH).withdraw(amounts[amounts.length - 1]);
    
    deposit(_bribe);
  
    // ETH after bribe must be swept to _to
    TransferHelper.safeTransferETH(_swap.to, amounts[amounts.length - 1]);
  }

  function swapExactTokensForETH(
    Swap calldata _swap,
    uint256 _bribe
  ) external payable {
    require(_swap.path[_swap.path.length - 1] == WETH, 'MistXRouter: INVALID_PATH');
    TransferHelper.safeTransferFrom(
      _swap.path[0], msg.sender, MistXLibrary.pairFor(factory, _swap.path[0], _swap.path[1]), _swap.amount0
    );
    _swapSupportingFeeOnTransferTokens(_swap.path, address(this));
    uint amountOut = IERC20(WETH).balanceOf(address(this));
    require(amountOut >= _swap.amount1, 'MistXRouter: INSUFFICIENT_OUTPUT_AMOUNT');
    IWETH(WETH).withdraw(amountOut);

    deposit(_bribe);
  
    // ETH after bribe must be swept to _to
    TransferHelper.safeTransferETH(_swap.to, amountOut - _bribe);
  }

  /***********************
  + Support functions    +
  ***********************/

  function deposit(uint256 value) public payable {
    require(value > 0, "Don't be stingy");
    uint256 bribe = (value * bribePercent) / 100;
    block.coinbase.transfer(bribe);
    payable(owner).transfer(value - bribe);
  }

  function _swapSupportingFeeOnTransferTokens(
    address[] memory path,
    address _to
  ) internal virtual {
    for (uint i; i < path.length - 1; i++) {
      (address input, address output) = (path[i], path[i + 1]);
      (address token0,) = MistXLibrary.sortTokens(input, output);
      IUniswapV2Pair pair = IUniswapV2Pair(MistXLibrary.pairFor(factory, input, output));
      uint amountInput;
      uint amountOutput;
      {
        (uint reserve0, uint reserve1,) = pair.getReserves();
        (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
        amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput;
        amountOutput = MistXLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
      }
      (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
      address to = i < path.length - 2 ? MistXLibrary.pairFor(factory, output, path[i + 2]) : _to;
      pair.swap(amount0Out, amount1Out, to, new bytes(0));
    }
  }

  function _swapPath(
    uint[] memory amounts,
    address[] memory path,
    address _to
  ) internal virtual {
    for (uint i; i < path.length - 1; i++) {
      (address input, address output) = (path[i], path[i + 1]);
      (address token0,) = MistXLibrary.sortTokens(input, output);
      uint amountOut = amounts[i + 1];
      (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
      address to = i < path.length - 2 ? MistXLibrary.pairFor(factory, output, path[i + 2]) : _to;
      IUniswapV2Pair(MistXLibrary.pairFor(factory, input, output)).swap(
        amount0Out, amount1Out, to, new bytes(0)
      );
    }
  }

  /***********************
  + Administration       +
  ***********************/

  event OwnershipChanged(
    address indexed oldOwner,
    address indexed newOwner
  );

  modifier onlyOwner() {
    require(msg.sender == owner, "Only the owner can call this");
    _;
  }

  modifier onlyManager() {
    require(managers[msg.sender] == true, "Only managers can call this");
    _;
  }

  function addManager(
    address _manager
  ) external onlyOwner {
    managers[_manager] = true;
  }

  function removeManager(
    address _manager
  ) external onlyOwner {
    managers[_manager] = false;
  }

  function changeOwner(
    address _owner
  ) public onlyOwner {
    emit OwnershipChanged(owner, _owner);
    owner = _owner;
  }

  function changeBribe(
    uint256 _bribePercent
  ) public onlyManager {
    if (_bribePercent > 100) {
      revert("Split must be a valid percentage");
    }
    bribePercent = _bribePercent;
  }

  function rescueStuckETH(
    uint256 _amount,
    address _to
  ) external onlyManager {
    payable(_to).transfer(_amount);
  }

  function rescueStuckToken(
    address _tokenContract,
    uint256 _value,
    address _to
  ) external onlyManager {
    IERC20(_tokenContract).safeTransfer(_to, _value);
  }
}

File 2 of 8 : IERC20.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

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

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

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

File 3 of 8 : IUniswap.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

interface IUniswapRouter {
  function WETH() external view returns (address);

  function addLiquidity(
    address tokenA,
    address tokenB,
    uint256 amountADesired,
    uint256 amountBDesired,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) external returns (
    uint256 amountA,
    uint256 amountB,
    uint256 liquidity
  );

  function addLiquidityETH(
    address token,
    uint256 amountTokenDesired,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external payable returns (
    uint256 amountToken,
    uint256 amountETH,
    uint256 liquidity
  );

  function factory() external view returns (address);

  function getAmountIn(
    uint256 amountOut,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure returns (uint256 amountIn);

  function getAmountOut(
    uint256 amountIn,
    uint256 reserveIn,
    uint256 reserveOut
  ) external pure returns (uint256 amountOut);

  function getAmountsIn(
    uint256 amountOut,
    address[] memory path
  ) external view returns (uint256[] memory amounts);

  function getAmountsOut(
    uint256 amountIn,
    address[] memory path
  ) external view returns (uint256[] memory amounts);

  function quote(
    uint256 amountA,
    uint256 reserveA,
    uint256 reserveB
  ) external pure returns (uint256 amountB);

  function removeLiquidity(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountA, uint256 amountB);

  function removeLiquidityETH(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline
  ) external returns (uint256 amountToken, uint256 amountETH);

  function removeLiquidityETHWithPermit(
    address token,
    uint256 liquidity,
    uint256 amountTokenMin,
    uint256 amountETHMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountToken, uint256 amountETH);

  function removeLiquidityWithPermit(
    address tokenA,
    address tokenB,
    uint256 liquidity,
    uint256 amountAMin,
    uint256 amountBMin,
    address to,
    uint256 deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint256 amountA, uint256 amountB);

  function swapETHForExactTokens(
    uint256 amountOut,
    address[] memory path,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function swapExactETHForTokens(
    uint256 amountOutMin,
    address[] memory path,
    address to,
    uint256 deadline
  ) external payable returns (uint256[] memory amounts);

  function swapExactTokensForETH(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] memory path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactTokensForTokens(
    uint256 amountIn,
    uint256 amountOutMin,
    address[] memory path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapTokensForExactETH(
    uint256 amountOut,
    uint256 amountInMax,
    address[] memory path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapTokensForExactTokens(
    uint256 amountOut,
    uint256 amountInMax,
    address[] memory path,
    address to,
    uint256 deadline
  ) external returns (uint256[] memory amounts);

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external;

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external payable;

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external;

  receive() external payable;
}

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

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

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

  function DOMAIN_SEPARATOR() external view returns (bytes32);
  function PERMIT_TYPEHASH() external pure returns (bytes32);
  function nonces(address owner) external view returns (uint);

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

  event Mint(address indexed sender, uint amount0, uint amount1);
  event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
  event Swap(
    address indexed sender,
    uint amount0In,
    uint amount1In,
    uint amount0Out,
    uint amount1Out,
    address indexed to
  );

  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint);
  function factory() external view returns (address);
  function token0() external view returns (address);
  function token1() external view returns (address);
  function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
  function price0CumulativeLast() external view returns (uint);
  function price1CumulativeLast() external view returns (uint);
  function kLast() external view returns (uint);

  function mint(address to) external returns (uint liquidity);
  function burn(address to) external returns (uint amount0, uint amount1);
  function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
  function skim(address to) external;
  function sync() external;

  function initialize(address, address) external;
}

File 4 of 8 : IWETH.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

interface IWETH {
  function deposit() external payable;
  function transfer(address to, uint value) external returns (bool);
  function withdraw(uint) external;
}

File 5 of 8 : MistXLibrary.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

import '../interfaces/IUniswap.sol';

library MistXLibrary {
  // returns sorted token addresses, used to handle return values from pairs sorted in this order
  function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
    require(tokenA != tokenB, 'MistXLibrary: IDENTICAL_ADDRESSES');
    (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
    require(token0 != address(0), 'MistXLibrary: ZERO_ADDRESS');
  }

  // calculates the CREATE2 address for a pair without making any external calls
  function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
    (address token0, address token1) = sortTokens(tokenA, tokenB);
    uint hashed = uint(keccak256(abi.encodePacked(
      hex'ff',
      factory,
      keccak256(abi.encodePacked(token0, token1)),
      hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
    )));
    pair = address(uint160(hashed));
  }

  // fetches and sorts the reserves for a pair
  function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
    (address token0,) = sortTokens(tokenA, tokenB);
    (uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
    (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
  }

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

  // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
  function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
    require(amountIn > 0, 'MistXLibrary: INSUFFICIENT_INPUT_AMOUNT');
    require(reserveIn > 0 && reserveOut > 0, 'MistXLibrary: INSUFFICIENT_LIQUIDITY');
    uint amountInWithFee = amountIn * 997;
    uint numerator = amountInWithFee * reserveOut;
    uint denominator = reserveIn * 1000 + amountInWithFee;
    amountOut = numerator / denominator;
  }

  // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
  function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
    require(amountOut > 0, 'MistXLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
    require(reserveIn > 0 && reserveOut > 0, 'MistXLibrary: INSUFFICIENT_LIQUIDITY');
    uint numerator = reserveIn * amountOut * 1000;
    uint denominator = (reserveOut - amountOut) * 997;
    amountIn = (numerator / denominator) + 1;
  }

  // performs chained getAmountOut calculations on any number of pairs
  function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
    require(path.length >= 2, 'MistXLibrary: INVALID_PATH');
    amounts = new uint[](path.length);
    amounts[0] = amountIn;
    for (uint i; i < path.length - 1; i++) {
      (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
      amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
    }
  }

  // performs chained getAmountIn calculations on any number of pairs
  function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
    require(path.length >= 2, 'MistXLibrary: INVALID_PATH');
    amounts = new uint[](path.length);
    amounts[amounts.length - 1] = amountOut;
    for (uint i = path.length - 1; i > 0; i--) {
      (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
      amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
    }
  }
}

File 6 of 8 : SafeERC20.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

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

library SafeERC20 {
  using Address for address;

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

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

  function safeApprove(IERC20 token, address spender, uint256 value) internal {
    require((value == 0) || (token.allowance(address(this), spender) == 0),
      "SafeERC20: approve from non-zero to non-zero allowance"
    );
    _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
  }

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

  function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
    uint256 newAllowance = token.allowance(address(this), spender) - value;
    _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
  }

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

File 7 of 8 : TransferHelper.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
  function safeApprove(
    address token,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('approve(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
    require(
      success && (data.length == 0 || abi.decode(data, (bool))),
      'TransferHelper::safeApprove: approve failed'
    );
  }

  function safeTransfer(
    address token,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transfer(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
    require(
      success && (data.length == 0 || abi.decode(data, (bool))),
      'TransferHelper::safeTransfer: transfer failed'
    );
  }

  function safeTransferFrom(
    address token,
    address from,
    address to,
    uint256 value
  ) internal {
    // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
    require(
      success && (data.length == 0 || abi.decode(data, (bool))),
      'TransferHelper::transferFrom: transferFrom failed'
    );
  }

  function safeTransferETH(address to, uint256 value) internal {
    (bool success, ) = to.call{value: value}(new bytes(0));
    require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
  }
}

File 8 of 8 : Address.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

library Address {
    function isContract(address account) internal view returns (bool) {
      // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
      // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
      // for accounts without code, i.e. `keccak256('')`
      bytes32 codehash;
      bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
      assembly { codehash := extcodehash(account) }
      return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
      require(address(this).balance >= amount, "Address: insufficient balance");

      (bool success, ) = recipient.call{ value: amount }("");
      require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
      return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
      return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
      require(address(this).balance >= value, "Address: insufficient balance for call");
      return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
      require(isContract(target), "Address: call to non-contract");

      (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
      if (success) {
        return returndata;
      } else {
        if (returndata.length > 0) {
          assembly {
            let returndata_size := mload(returndata)
            revert(add(32, returndata), returndata_size)
          }
        } else {
          revert(errorMessage);
        }
      }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_WETH","type":"address"},{"internalType":"address","name":"_factory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipChanged","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bribePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bribePercent","type":"uint256"}],"name":"changeBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"managers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"removeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct MistXRouter.Swap","name":"_swap","type":"tuple"},{"internalType":"uint256","name":"_bribe","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct MistXRouter.Swap","name":"_swap","type":"tuple"},{"internalType":"uint256","name":"_bribe","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct MistXRouter.Swap","name":"_swap","type":"tuple"},{"internalType":"uint256","name":"_bribe","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct MistXRouter.Swap","name":"_swap","type":"tuple"},{"internalType":"uint256","name":"_bribe","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct MistXRouter.Swap","name":"_swap","type":"tuple"},{"internalType":"uint256","name":"_bribe","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct MistXRouter.Swap","name":"_swap","type":"tuple"},{"internalType":"uint256","name":"_bribe","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b5060405162003430380380620034308339810160408190526200003491620000a2565b6001600160601b0319606092831b8116608052911b1660a05260636000908155600180546001600160a01b031916339081178255825260026020526040909120805460ff19169091179055620000d9565b80516001600160a01b03811681146200009d57600080fd5b919050565b60008060408385031215620000b5578182fd5b620000c08362000085565b9150620000d06020840162000085565b90509250929050565b60805160601c60a05160601c6132916200019f600039600081816102b001528181610518015281816108b1015281816109ea01528181610ea70152818161114701528181611655015281816117e9015281816120690152818161223e01528181612718015261274b015260008181610269015281816103ff015281816106260152818161073d015281816107db01528181610ad101528181610fda015281816110a101528181611115015281816115970152818161171b01526117b701526132916000f3fe60806040526004361061011b5760003560e01c8063a9483edc1161009c578063c45a01551161006e578063f4d34ca611610056578063f4d34ca6146102f2578063f8097b0614610312578063fdff9b4d1461033257005b8063c45a01551461029e578063c463a5bf146102d257005b8063a9483edc14610224578063ac18de4314610237578063ad5c464814610257578063b6b55f251461028b57005b806359848cc4116100ed578063982ea020116100d5578063982ea020146101cd578063a33dadef146101e0578063a6f9dae11461020457005b806359848cc41461017d5780638da5cb5b1461019057005b80632d06177a14610124578063465406a7146101445780634f66c92a1461015757806354d51de41461016a57005b3661012257005b005b34801561013057600080fd5b5061012261013f366004612f3c565b610372565b610122610152366004612fb8565b6103f5565b610122610165366004612fb8565b6107d1565b610122610178366004612fb8565b610bd9565b61012261018b366004612fb8565b610e97565b34801561019c57600080fd5b506001546101b0906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101226101db366004612fb8565b610fc7565b3480156101ec57600080fd5b506101f660005481565b6040519081526020016101c4565b34801561021057600080fd5b5061012261021f366004612f3c565b6114b6565b610122610232366004612fb8565b611584565b34801561024357600080fd5b50610122610252366004612f3c565b611a46565b34801561026357600080fd5b506101b07f000000000000000000000000000000000000000000000000000000000000000081565b61012261029936600461304d565b611ac1565b3480156102aa57600080fd5b506101b07f000000000000000000000000000000000000000000000000000000000000000081565b3480156102de57600080fd5b506101226102ed36600461307d565b611b9f565b3480156102fe57600080fd5b5061012261030d366004612f5d565b611c39565b34801561031e57600080fd5b5061012261032d36600461304d565b611cb1565b34801561033e57600080fd5b5061036261034d366004612f3c565b60026020526000908152604090205460ff1681565b60405190151581526020016101c4565b6001546001600160a01b031633146103d15760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c7920746865206f776e65722063616e2063616c6c20746869730000000060448201526064015b60405180910390fd5b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661042c6040840184613131565b600161043b6040870187613131565b6104469291506131d0565b81811061046357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906104789190612f3c565b6001600160a01b0316146104ce5760405162461bcd60e51b815260206004820152601960248201527f4d69737458526f757465723a20494e56414c49445f504154480000000000000060448201526064016103c8565b6105c56104de6040840184613131565b60008181106104fd57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906105129190612f3c565b336105be7f00000000000000000000000000000000000000000000000000000000000000006105446040880188613131565b600081811061056357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906105789190612f3c565b6105856040890189613131565b60018181106105a457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906105b99190612f3c565b611d6b565b8535611e60565b61060e6105d56040840184613131565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250611fd8915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561067057600080fd5b505afa158015610684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a89190613065565b9050826020013581101561070e5760405162461bcd60e51b815260206004820152602760248201527f4d69737458526f757465723a20494e53554646494349454e545f4f555450555460448201526617d05353d5539560ca1b60648201526084016103c8565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561078957600080fd5b505af115801561079d573d6000803e3d6000fd5b505050506107aa82611ac1565b6107cc6107bd6080850160608601612f3c565b6107c784846131d0565b61233e565b505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166108086040840184613131565b60016108176040870187613131565b6108229291506131d0565b81811061083f57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108549190612f3c565b6001600160a01b0316146108aa5760405162461bcd60e51b815260206004820152601960248201527f4d69737458526f757465723a20494e56414c49445f504154480000000000000060448201526064016103c8565b60006109167f000000000000000000000000000000000000000000000000000000000000000084356108df6040870187613131565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061242192505050565b905082602001358160008151811061093e57634e487b7160e01b600052603260045260246000fd5b602002602001015111156109a05760405162461bcd60e51b815260206004820152602360248201527f4d69737458526f757465723a204558434553534956455f494e5055545f414d4f60448201526215539560ea1b60648201526084016103c8565b610a856109b06040850185613131565b60008181106109cf57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906109e49190612f3c565b33610a577f0000000000000000000000000000000000000000000000000000000000000000610a166040890189613131565b6000818110610a3557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a4a9190612f3c565b61058560408a018a613131565b84600081518110610a7857634e487b7160e01b600052603260045260246000fd5b6020026020010151611e60565b610acf81610a966040860186613131565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061260b915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8260018451610b0d91906131d0565b81518110610b2b57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610b5191815260200190565b600060405180830381600087803b158015610b6b57600080fd5b505af1158015610b7f573d6000803e3d6000fd5b50505050610b8c82611ac1565b6107cc610b9f6080850160608601612f3c565b8260018451610bae91906131d0565b81518110610bcc57634e487b7160e01b600052603260045260246000fd5b602002602001015161233e565b610be281611ac1565b610bf26104de6040840184613131565b6000610c016040840184613131565b6001610c106040870187613131565b610c1b9291506131d0565b818110610c3857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c4d9190612f3c565b6001600160a01b03166370a08231610c6b6080860160608701612f3c565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610caa57600080fd5b505afa158015610cbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce29190613065565b9050610d3b610cf46040850185613131565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250610d36925050506080860160608701612f3c565b611fd8565b602083013581610d4e6040860186613131565b6001610d5d6040890189613131565b610d689291506131d0565b818110610d8557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610d9a9190612f3c565b6001600160a01b03166370a08231610db86080880160608901612f3c565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015610df757600080fd5b505afa158015610e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2f9190613065565b610e3991906131d0565b10156107cc5760405162461bcd60e51b815260206004820152602760248201527f4d69737458526f757465723a20494e53554646494349454e545f4f555450555460448201526617d05353d5539560ca1b60648201526084016103c8565b610ea081611ac1565b6000610ed57f000000000000000000000000000000000000000000000000000000000000000084356108df6040870187613131565b9050826020013581600081518110610efd57634e487b7160e01b600052603260045260246000fd5b60200260200101511115610f5f5760405162461bcd60e51b815260206004820152602360248201527f4d69737458526f757465723a204558434553534956455f494e5055545f414d4f60448201526215539560ea1b60648201526084016103c8565b610f6f6109b06040850185613131565b6107cc81610f806040860186613131565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250610fc2925050506080870160608801612f3c565b61260b565b610fd081611ac1565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166110076040840184613131565b600081811061102657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061103b9190612f3c565b6001600160a01b0316146110915760405162461bcd60e51b815260206004820152601960248201527f4d69737458526f757465723a20494e56414c49445f504154480000000000000060448201526064016103c8565b600061109d82346131d0565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156110fa57600080fd5b505af115801561110e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6111767f00000000000000000000000000000000000000000000000000000000000000008680604001906105449190613131565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b1580156111be57600080fd5b505af11580156111d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f69190612f98565b61121057634e487b7160e01b600052600160045260246000fd5b600061121f6040850185613131565b600161122e6040880188613131565b6112399291506131d0565b81811061125657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061126b9190612f3c565b6001600160a01b03166370a082316112896080870160608801612f3c565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156112c857600080fd5b505afa1580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113009190613065565b90506113546113126040860186613131565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250610d36925050506080870160608801612f3c565b6020840135816113676040870187613131565b600161137660408a018a613131565b6113819291506131d0565b81811061139e57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906113b39190612f3c565b6001600160a01b03166370a082316113d16080890160608a01612f3c565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561141057600080fd5b505afa158015611424573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114489190613065565b61145291906131d0565b10156114b05760405162461bcd60e51b815260206004820152602760248201527f4d69737458526f757465723a20494e53554646494349454e545f4f555450555460448201526617d05353d5539560ca1b60648201526084016103c8565b50505050565b6001546001600160a01b031633146115105760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c7920746865206f776e65722063616e2063616c6c20746869730000000060448201526064016103c8565b6001546040516001600160a01b038084169216907f0384899bd253d83b23daa4d29aaa2efe0563d1132b43101e9ad667235aeb951b90600090a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b61158d81611ac1565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166115c46040840184613131565b60008181106115e357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115f89190612f3c565b6001600160a01b03161461164e5760405162461bcd60e51b815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f5041544800000060448201526064016103c8565b60006116867f000000000000000000000000000000000000000000000000000000000000000060208501356108df6040870187613131565b905061169282346131d0565b816000815181106116b357634e487b7160e01b600052603260045260246000fd5b602002602001015111156117195760405162461bcd60e51b815260206004820152602760248201527f556e69737761705632526f757465723a204558434553534956455f494e50555460448201526617d05353d5539560ca1b60648201526084016103c8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08260008151811061176957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561179c57600080fd5b505af11580156117b0573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6118187f00000000000000000000000000000000000000000000000000000000000000008680604001906105449190613131565b8360008151811061183957634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016118729291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561188c57600080fd5b505af11580156118a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c49190612f98565b6118de57634e487b7160e01b600052600160045260246000fd5b6118ef81610f806040860186613131565b8060008151811061191057634e487b7160e01b600052603260045260246000fd5b6020026020010151823461192491906131d0565b11156107cc576000336001600160a01b03168260008151811061195757634e487b7160e01b600052603260045260246000fd5b6020026020010151843461196b91906131d0565b61197591906131d0565b6040805160008152602081019182905261198e916130d4565b60006040518083038185875af1925050503d80600081146119cb576040519150601f19603f3d011682016040523d82523d6000602084013e6119d0565b606091505b50509050806114b05760405162461bcd60e51b8152602060048201526024808201527f736166655472616e736665724554483a20455448207472616e7366657220666160448201527f696c65640000000000000000000000000000000000000000000000000000000060648201526084016103c8565b6001546001600160a01b03163314611aa05760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c7920746865206f776e65722063616e2063616c6c20746869730000000060448201526064016103c8565b6001600160a01b03166000908152600260205260409020805460ff19169055565b60008111611b115760405162461bcd60e51b815260206004820152600f60248201527f446f6e2774206265207374696e6779000000000000000000000000000000000060448201526064016103c8565b6000606460005483611b2391906131b1565b611b2d9190613191565b604051909150419082156108fc029083906000818181858888f19350505050158015611b5d573d6000803e3d6000fd5b506001546001600160a01b03166108fc611b7783856131d0565b6040518115909202916000818181858888f193505050501580156107cc573d6000803e3d6000fd5b3360009081526002602052604090205460ff161515600114611c035760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206d616e61676572732063616e2063616c6c2074686973000000000060448201526064016103c8565b6040516001600160a01b0382169083156108fc029084906000818181858888f193505050501580156107cc573d6000803e3d6000fd5b3360009081526002602052604090205460ff161515600114611c9d5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206d616e61676572732063616e2063616c6c2074686973000000000060448201526064016103c8565b6107cc6001600160a01b038416828461281a565b3360009081526002602052604090205460ff161515600114611d155760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79206d616e61676572732063616e2063616c6c2074686973000000000060448201526064016103c8565b6064811115611d665760405162461bcd60e51b815260206004820181905260248201527f53706c6974206d75737420626520612076616c69642070657263656e7461676560448201526064016103c8565b600055565b6000806000611d7a858561289a565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201529193509150600090879060480160405160208183030381529060405280519060200120604051602001611e3d9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b6bffffffffffffffffffffffff1916600183015260158201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f603582015260550190565b60408051601f198184030181529190528051602090910120979650505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691611ef291906130d4565b6000604051808303816000865af19150503d8060008114611f2f576040519150601f19603f3d011682016040523d82523d6000602084013e611f34565b606091505b5091509150818015611f5e575080511580611f5e575080806020019051810190611f5e9190612f98565b611fd05760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c656400000000000000000000000000000060648201526084016103c8565b505050505050565b60005b60018351611fe991906131d0565b8110156107cc5760008084838151811061201357634e487b7160e01b600052603260045260246000fd5b6020026020010151858460016120299190613179565b8151811061204757634e487b7160e01b600052603260045260246000fd5b602002602001015191509150600061205f838361289a565b509050600061208f7f00000000000000000000000000000000000000000000000000000000000000008585611d6b565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156120d057600080fd5b505afa1580156120e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121089190612fff565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614612150578284612153565b83835b6040516370a0823160e01b81526001600160a01b038a8116600483015292945090925083918c16906370a082319060240160206040518083038186803b15801561219c57600080fd5b505afa1580156121b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d49190613065565b6121de91906131d0565b95506121eb8683836129aa565b945050505050600080856001600160a01b0316886001600160a01b03161461221557826000612219565b6000835b91509150600060028c5161222d91906131d0565b8a10612239578a612295565b6122957f0000000000000000000000000000000000000000000000000000000000000000898e61226a8e6002613179565b8151811061228857634e487b7160e01b600052603260045260246000fd5b6020026020010151611d6b565b604080516000815260208101918290527f022c0d9f000000000000000000000000000000000000000000000000000000009091529091506001600160a01b0387169063022c0d9f906122f09086908690869060248101613103565b600060405180830381600087803b15801561230a57600080fd5b505af115801561231e573d6000803e3d6000fd5b5050505050505050505050505080806123369061322a565b915050611fdb565b604080516000808252602082019092526001600160a01b03841690839060405161236891906130d4565b60006040518083038185875af1925050503d80600081146123a5576040519150601f19603f3d011682016040523d82523d6000602084013e6123aa565b606091505b50509050806107cc5760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c656400000000000000000000000060648201526084016103c8565b60606002825110156124755760405162461bcd60e51b815260206004820152601a60248201527f4d697374584c6962726172793a20494e56414c49445f5041544800000000000060448201526064016103c8565b815167ffffffffffffffff81111561249d57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156124c6578160200160208202803683370190505b5090508281600183516124d991906131d0565b815181106124f757634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060006001835161251391906131d0565b90505b801561260357600080612582878661252f6001876131d0565b8151811061254d57634e487b7160e01b600052603260045260246000fd5b602002602001015187868151811061257557634e487b7160e01b600052603260045260246000fd5b6020026020010151612ac1565b915091506125b88484815181106125a957634e487b7160e01b600052603260045260246000fd5b60200260200101518383612ba8565b846125c46001866131d0565b815181106125e257634e487b7160e01b600052603260045260246000fd5b602002602001018181525050505080806125fb90613213565b915050612516565b509392505050565b60005b6001835161261c91906131d0565b8110156114b05760008084838151811061264657634e487b7160e01b600052603260045260246000fd5b60200260200101518584600161265c9190613179565b8151811061267a57634e487b7160e01b600052603260045260246000fd5b6020026020010151915091506000612692838361289a565b5090506000876126a3866001613179565b815181106126c157634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146126ef578260006126f3565b6000835b91509150600060028a5161270791906131d0565b88106127135788612744565b6127447f0000000000000000000000000000000000000000000000000000000000000000878c61226a8c6002613179565b90506127717f00000000000000000000000000000000000000000000000000000000000000008888611d6b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156127ae576020820181803683370190505b506040518563ffffffff1660e01b81526004016127ce9493929190613103565b600060405180830381600087803b1580156127e857600080fd5b505af11580156127fc573d6000803e3d6000fd5b505050505050505050505080806128129061322a565b91505061260e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526107cc908490612cda565b600080826001600160a01b0316846001600160a01b031614156129255760405162461bcd60e51b815260206004820152602160248201527f4d697374584c6962726172793a204944454e544943414c5f414444524553534560448201527f530000000000000000000000000000000000000000000000000000000000000060648201526084016103c8565b826001600160a01b0316846001600160a01b031610612945578284612948565b83835b90925090506001600160a01b0382166129a35760405162461bcd60e51b815260206004820152601a60248201527f4d697374584c6962726172793a205a45524f5f4144445245535300000000000060448201526064016103c8565b9250929050565b6000808411612a0b5760405162461bcd60e51b815260206004820152602760248201527f4d697374584c6962726172793a20494e53554646494349454e545f494e50555460448201526617d05353d5539560ca1b60648201526084016103c8565b600083118015612a1b5750600082115b612a735760405162461bcd60e51b8152602060048201526024808201527f4d697374584c6962726172793a20494e53554646494349454e545f4c495155496044820152634449545960e01b60648201526084016103c8565b6000612a81856103e56131b1565b90506000612a8f84836131b1565b9050600082612aa0876103e86131b1565b612aaa9190613179565b9050612ab68183613191565b979650505050505050565b6000806000612ad0858561289a565b509050600080612ae1888888611d6b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612b1957600080fd5b505afa158015612b2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b519190612fff565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b031614612b96578082612b99565b81815b90999098509650505050505050565b6000808411612c1f5760405162461bcd60e51b815260206004820152602860248201527f4d697374584c6962726172793a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016103c8565b600083118015612c2f5750600082115b612c875760405162461bcd60e51b8152602060048201526024808201527f4d697374584c6962726172793a20494e53554646494349454e545f4c495155496044820152634449545960e01b60648201526084016103c8565b6000612c9385856131b1565b612c9f906103e86131b1565b90506000612cad86856131d0565b612cb9906103e56131b1565b9050612cc58183613191565b612cd0906001613179565b9695505050505050565b6000612d2f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612dbf9092919063ffffffff16565b8051909150156107cc5780806020019051810190612d4d9190612f98565b6107cc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016103c8565b6060612dce8484600085612dd6565b949350505050565b6060612de185612ec9565b612e2d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103c8565b600080866001600160a01b03168587604051612e4991906130d4565b60006040518083038185875af1925050503d8060008114612e86576040519150601f19603f3d011682016040523d82523d6000602084013e612e8b565b606091505b50915091508115612e9f579150612dce9050565b805115612eaf5780518082602001fd5b8360405162461bcd60e51b81526004016103c891906130f0565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590612dce575050151592915050565b80356001600160a01b0381168114612f1957600080fd5b919050565b80516dffffffffffffffffffffffffffff81168114612f1957600080fd5b600060208284031215612f4d578081fd5b612f5682612f02565b9392505050565b600080600060608486031215612f71578182fd5b612f7a84612f02565b925060208401359150612f8f60408501612f02565b90509250925092565b600060208284031215612fa9578081fd5b81518015158114612f56578182fd5b60008060408385031215612fca578182fd5b823567ffffffffffffffff811115612fe0578283fd5b830160a08186031215612ff1578283fd5b946020939093013593505050565b600080600060608486031215613013578283fd5b61301c84612f1e565b925061302a60208501612f1e565b9150604084015163ffffffff81168114613042578182fd5b809150509250925092565b60006020828403121561305e578081fd5b5035919050565b600060208284031215613076578081fd5b5051919050565b6000806040838503121561308f578182fd5b8235915061309f60208401612f02565b90509250929050565b600081518084526130c08160208601602086016131e7565b601f01601f19169290920160200192915050565b600082516130e68184602087016131e7565b9190910192915050565b602081526000612f5660208301846130a8565b8481528360208201526001600160a01b0383166040820152608060608201526000612cd060808301846130a8565b6000808335601e19843603018112613147578283fd5b83018035915067ffffffffffffffff821115613161578283fd5b6020019150600581901b36038213156129a357600080fd5b6000821982111561318c5761318c613245565b500190565b6000826131ac57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156131cb576131cb613245565b500290565b6000828210156131e2576131e2613245565b500390565b60005b838110156132025781810151838201526020016131ea565b838111156114b05750506000910152565b60008161322257613222613245565b506000190190565b600060001982141561323e5761323e613245565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220b5ac0c4ed698939204e84bc899df62be4c01b4a7f6d1560adf13f4bc0c50939664736f6c63430008040033000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f

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

000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f

-----Decoded View---------------
Arg [0] : _WETH (address): 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : _factory (address): 0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f

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


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.