Contract 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x132f2d163205e2ef77ef913d3b2124676e3188f8b0e5d45138b49a08592f8476Swap Exact ETH F...112854142021-09-27 17:37:0710 mins ago0x14284bd3035ef81c8feb5441456322b6f46114d9 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.024 BNB0.00066943
0x9c9f7911e40ed7c987cfc41b06d52f4662456a4ce99892363f8289ebe146cceeSwap Exact Token...112854042021-09-27 17:36:3711 mins ago0x43f3f7b044b8e246fd95ac791aeb515d4011e89b IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000613775
0xa6da4c2898ce939783dcc4bcdc69ac0ee9f7935b91f19f80c7fc14650344c2daAdd Liquidity112852662021-09-27 17:29:4218 mins ago0x7994a41d3574b018c76c246b75dddfa897a62705 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000930475
0xedb0a98a69c45c72f8c42612c2097386aa06874cca52e3abcf8d9069b5e15e92Swap Exact Token...112851652021-09-27 17:24:3923 mins ago0x59909cde7855a427d5b4827ade1520b99c55cede IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.00130771
0x4cb514147d62003788fe51d7b72c32cb6c74be8b9b08b894bcfb9077e1e825c3Swap Exact Token...112848132021-09-27 17:07:0340 mins ago0x49a641b5c132da1b73fb46ec04f89db78f82cde6 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000613655
0x00902fc68ae31c97e97d71944897f49aa550e0d258c5d8d495469e179ec502d6Swap Exact Token...112846982021-09-27 17:01:1346 mins ago0x3b6b53d48c2bce12b065cb4d09ca468110660b71 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.00060264
0x996e8e4e0a6f1a2adbe870a1d4a044b4cc4c3ab59794af69879bca2fbbf7eaafSwap Exact Token...112846912021-09-27 17:00:5247 mins ago0x3b6b53d48c2bce12b065cb4d09ca468110660b71 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000613775
0xe9357991f414367fcc85ef991dc8ffc65540e00265103b88ba0803f3d9869f4eRemove Liquidity112846512021-09-27 16:58:5249 mins ago0x3b6b53d48c2bce12b065cb4d09ca468110660b71 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000773605
0xe298f3fa4d695c739770807fdc42c4ced859554029951134e3b8aba112c9972fAdd Liquidity112846352021-09-27 16:58:0449 mins ago0x266f8dae09c00473b22be8673d9f9bc6fd175514 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.00089011
0x142602ccc862e104a0886b02f7281edb2bd35c0c694e48a3d6f47f088f2045a2Add Liquidity112846022021-09-27 16:56:2551 mins ago0x2f8a48be44e83c231d7db06930eebdb1390a7259 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.00094437
0x8878c1c5842ce4e26af6e15041846b9691a17c18d262b0a727b7fb12b06d76bcSwap Exact ETH F...112845662021-09-27 16:54:3753 mins ago0x2f8a48be44e83c231d7db06930eebdb1390a7259 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.1 BNB0.000660605
0x10398cd96c36bfea2e523d0d22ff09deb1c83609270fea828ca5db28f9e7c382Swap Exact Token...112845572021-09-27 16:54:1053 mins ago0x3b6b53d48c2bce12b065cb4d09ca468110660b71 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000688655
0x1a1e333de7085d208efd49f792019c216547cfb6ab8028c4f4e8b2922e83569dSwap Exact ETH F...112845562021-09-27 16:54:0753 mins ago0x2f8a48be44e83c231d7db06930eebdb1390a7259 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.1 BNB0.00059437
0x8c7301ef455ff1d3c8749d583b97d650b6eaefd25a05aaaedef94fdb287f222aSwap Exact Token...112843232021-09-27 16:42:281 hr 5 mins ago0xe62dceba4db4fa26a8e4d06e52f56b51dadb77c4 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000688535
0x62fc0836b30b0be28ec1f4bf5ffcebaf8d1be3ccc5dcc2a718e066ffaa5596d6Swap Exact Token...112842662021-09-27 16:39:341 hr 8 mins ago0x194ade54638861878f199a47169d0fe5ff6b8ab4 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.00052364
0x95c2b1f95f71bd77273855955843606a14aa364e53273774df283e2cb81cb51aSwap Exact Token...112840902021-09-27 16:30:421 hr 17 mins ago0xc6c6f95fe3109287d6202f94657916f1a773d9c2 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000613775
0x147d6e34f60e75121d135fcefa1d0d7959e2c04902962d5e71ac300cd508d73bSwap Exact Token...112840672021-09-27 16:29:331 hr 18 mins ago0xdc6f2e4ef04184effb20927930ee48d9a5c88b48 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.0005987
0x05494f7a310953fa1506d7de2da982be8da69e2edfdc577356a10c1af38f34a8Swap Exact Token...112839302021-09-27 16:22:411 hr 25 mins ago0x266f8dae09c00473b22be8673d9f9bc6fd175514 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.0009829
0x4e2ebd31a86f7c573dfc29def318c5b367e9180e050f8eabe65d44cbf6a1da86Swap Exact Token...112839212021-09-27 16:22:141 hr 25 mins ago0x8f3872c3824d44036d510acc02a200fb3a0bb7e3 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.0005237
0xd1613680494f0a7337fe1b3f089c1a5665d50e0f5be6b05986566adb9a778cd1Swap Exact Token...112839012021-09-27 16:21:141 hr 26 mins ago0x737237d10080639e4ae44ed69b28f6b442f4321b IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000688655
0xa0c7dfec2b04b27486f558feb9511d25d41813bbbc5edc861a7dcfbcf5cc876dSwap Exact Token...112838652021-09-27 16:19:261 hr 28 mins ago0xc4cdb321c5507bc2b3ec40ed410959e52fc1d750 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000662895
0xb6d0475d2fd910b9f2e8464bbf1deae94e6336d7b054e9a0bff9406ebacc7a91Swap Exact Token...112837502021-09-27 16:13:411 hr 34 mins ago0x8f3872c3824d44036d510acc02a200fb3a0bb7e3 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000522125
0x0429d4e9d38c91057c4fe585325c9860ddeb697edb77b198eecd242ee4a05843Remove Liquidity112836672021-09-27 16:09:321 hr 38 mins ago0x8f3872c3824d44036d510acc02a200fb3a0bb7e3 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.00082817
0x3d676d8e78cdd142976fbf13b0c4b7a7f5344bb7ec32a25cde1b10c32f3a7124Remove Liquidity112836202021-09-27 16:07:111 hr 40 mins ago0x8f3872c3824d44036d510acc02a200fb3a0bb7e3 IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.00082456
0xa01825a56834657269ad3219c89c45084d93be792efe6a930b2fb317b89ecbfbSwap Exact Token...112835592021-09-27 16:04:081 hr 43 mins ago0xf3bcd2e7cc95ac1c5824da5e372b9d6259dcf75c IN  0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0 BNB0.000942565
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x132f2d163205e2ef77ef913d3b2124676e3188f8b0e5d45138b49a08592f8476112854142021-09-27 17:37:0710 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf Binance: WBNB Token0.024 BNB
0x9c9f7911e40ed7c987cfc41b06d52f4662456a4ce99892363f8289ebe146ccee112854042021-09-27 17:36:3711 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0x43f3f7b044b8e246fd95ac791aeb515d4011e89b1.364101632242319689 BNB
0x9c9f7911e40ed7c987cfc41b06d52f4662456a4ce99892363f8289ebe146ccee112854042021-09-27 17:36:3711 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf1.364101632242319689 BNB
0x4cb514147d62003788fe51d7b72c32cb6c74be8b9b08b894bcfb9077e1e825c3112848132021-09-27 17:07:0340 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0x49a641b5c132da1b73fb46ec04f89db78f82cde60.044702749073283042 BNB
0x4cb514147d62003788fe51d7b72c32cb6c74be8b9b08b894bcfb9077e1e825c3112848132021-09-27 17:07:0340 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.044702749073283042 BNB
0x00902fc68ae31c97e97d71944897f49aa550e0d258c5d8d495469e179ec502d6112846982021-09-27 17:01:1346 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0x3b6b53d48c2bce12b065cb4d09ca468110660b710.715124606949937393 BNB
0x00902fc68ae31c97e97d71944897f49aa550e0d258c5d8d495469e179ec502d6112846982021-09-27 17:01:1346 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.715124606949937393 BNB
0x996e8e4e0a6f1a2adbe870a1d4a044b4cc4c3ab59794af69879bca2fbbf7eaaf112846912021-09-27 17:00:5247 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0x3b6b53d48c2bce12b065cb4d09ca468110660b710.555538422912379418 BNB
0x996e8e4e0a6f1a2adbe870a1d4a044b4cc4c3ab59794af69879bca2fbbf7eaaf112846912021-09-27 17:00:5247 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.555538422912379418 BNB
0x8878c1c5842ce4e26af6e15041846b9691a17c18d262b0a727b7fb12b06d76bc112845662021-09-27 16:54:3753 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf Binance: WBNB Token0.1 BNB
0x10398cd96c36bfea2e523d0d22ff09deb1c83609270fea828ca5db28f9e7c382112845572021-09-27 16:54:1053 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0x3b6b53d48c2bce12b065cb4d09ca468110660b710.062775138639758007 BNB
0x10398cd96c36bfea2e523d0d22ff09deb1c83609270fea828ca5db28f9e7c382112845572021-09-27 16:54:1053 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.062775138639758007 BNB
0x1a1e333de7085d208efd49f792019c216547cfb6ab8028c4f4e8b2922e83569d112845562021-09-27 16:54:0753 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf Binance: WBNB Token0.1 BNB
0x8c7301ef455ff1d3c8749d583b97d650b6eaefd25a05aaaedef94fdb287f222a112843232021-09-27 16:42:281 hr 5 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0xe62dceba4db4fa26a8e4d06e52f56b51dadb77c40.053306615596920939 BNB
0x8c7301ef455ff1d3c8749d583b97d650b6eaefd25a05aaaedef94fdb287f222a112843232021-09-27 16:42:281 hr 5 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.053306615596920939 BNB
0x95c2b1f95f71bd77273855955843606a14aa364e53273774df283e2cb81cb51a112840902021-09-27 16:30:421 hr 17 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0xc6c6f95fe3109287d6202f94657916f1a773d9c20.518869764138776542 BNB
0x95c2b1f95f71bd77273855955843606a14aa364e53273774df283e2cb81cb51a112840902021-09-27 16:30:421 hr 17 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.518869764138776542 BNB
0xd1613680494f0a7337fe1b3f089c1a5665d50e0f5be6b05986566adb9a778cd1112839012021-09-27 16:21:141 hr 26 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0x737237d10080639e4ae44ed69b28f6b442f4321b0.217825154709644339 BNB
0xd1613680494f0a7337fe1b3f089c1a5665d50e0f5be6b05986566adb9a778cd1112839012021-09-27 16:21:141 hr 26 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.217825154709644339 BNB
0xa01825a56834657269ad3219c89c45084d93be792efe6a930b2fb317b89ecbfb112835592021-09-27 16:04:081 hr 43 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0xf3bcd2e7cc95ac1c5824da5e372b9d6259dcf75c0.032464732859167972 BNB
0xa01825a56834657269ad3219c89c45084d93be792efe6a930b2fb317b89ecbfb112835592021-09-27 16:04:081 hr 43 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.032464732859167972 BNB
0x933c83a99df2521e3d8da76fc0a5e0c74053bd6c0e7988a8514707a64f02d20e112830032021-09-27 15:36:202 hrs 11 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0x540046065a9c7084b4d1edb8fb1eff1f6acd78710.110270312976883023 BNB
0x933c83a99df2521e3d8da76fc0a5e0c74053bd6c0e7988a8514707a64f02d20e112830032021-09-27 15:36:202 hrs 11 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0.110270312976883023 BNB
0xde6b3e753d0cc48c69236320623257e3d23b71b6ec15ea6c070d96e27afe40ff112830022021-09-27 15:36:172 hrs 11 mins ago 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf0x3cf05991baea45f5a8358f5d35dabcdc043fe5131.862413617127536285 BNB
0xde6b3e753d0cc48c69236320623257e3d23b71b6ec15ea6c070d96e27afe40ff112830022021-09-27 15:36:172 hrs 11 mins ago Binance: WBNB Token 0xdb07ed70aa18ffc8b422bf3d8af947e937511fdf1.862413617127536285 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ViralataRouter02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : ViralataRouter02.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

import './libraries/ViralataLibrary.sol';
import './libraries/SafeMath.sol';
import './libraries/TransferHelper.sol';
import './interfaces/IViralataRouter02.sol';
import './interfaces/IViralataFactory.sol';
import './interfaces/IERC20.sol';
import './interfaces/IWETH.sol';

contract ViralataRouter02 is IViralataRouter02 {
    using SafeMathViralata for uint;

    address public immutable override factory;
    address public immutable override WETH;

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

    constructor(address _factory, address _WETH) public {
        factory = _factory;
        WETH = _WETH;
    }

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IViralataFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IViralataFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = ViralataLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = ViralataLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'ViralataRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = ViralataLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'ViralataRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = ViralataLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IViralataPair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = ViralataLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IViralataPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = ViralataLibrary.pairFor(factory, tokenA, tokenB);
        IViralataPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IViralataPair(pair).burn(to);
        (address token0,) = ViralataLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'ViralataRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'ViralataRouter: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = ViralataLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IViralataPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = ViralataLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IViralataPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20Viralata(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = ViralataLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IViralataPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(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,) = ViralataLibrary.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 ? ViralataLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IViralataPair(ViralataLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        address auro = IViralataFactory(factory).auro();
        uint fee = 25;
        if (path[0] == auro || path[1] == auro) fee = 50; // increase fee for AURO

        amounts = ViralataLibrary.getAmountsOut(factory, amountIn, path, fee);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ViralataRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ViralataLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        address auro = IViralataFactory(factory).auro();
        uint fee = 25;
        if (path[0] == auro || path[1] == auro) fee = 50; // increase fee for AURO

        amounts = ViralataLibrary.getAmountsIn(factory, amountOut, path, fee);
        require(amounts[0] <= amountInMax, 'ViralataRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ViralataLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'ViralataRouter: INVALID_PATH');
        address auro = IViralataFactory(factory).auro();
        uint fee = 25;
        if (path[0] == auro || path[1] == auro) fee = 50; // increase fee for AURO

        amounts = ViralataLibrary.getAmountsOut(factory, msg.value, path, fee);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ViralataRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(ViralataLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'ViralataRouter: INVALID_PATH');
        address auro = IViralataFactory(factory).auro();
        uint fee = 25;
        if (path[0] == auro || path[1] == auro) fee = 50; // increase fee for AURO

        amounts = ViralataLibrary.getAmountsIn(factory, amountOut, path, fee);
        require(amounts[0] <= amountInMax, 'ViralataRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ViralataLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'ViralataRouter: INVALID_PATH');
        address auro = IViralataFactory(factory).auro();
        uint fee = 25;
        if (path[0] == auro || path[1] == auro) fee = 50; // increase fee for AURO

        amounts = ViralataLibrary.getAmountsOut(factory, amountIn, path, fee);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ViralataRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ViralataLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'ViralataRouter: INVALID_PATH');
        address auro = IViralataFactory(factory).auro();
        uint fee = 25;
        if (path[0] == auro || path[1] == auro) fee = 50; // increase fee for AURO

        amounts = ViralataLibrary.getAmountsIn(factory, amountOut, path, fee);
        require(amounts[0] <= msg.value, 'ViralataRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(ViralataLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    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,) = ViralataLibrary.sortTokens(input, output);
            IViralataPair pair = IViralataPair(ViralataLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;


            { // scope to avoid stack too deep errors
                (uint reserve0, uint reserve1,) = pair.getReserves();
                (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);

                address auro = IViralataFactory(factory).auro();
                uint fee = 25;
                if (input == auro || output == auro) fee = 50; // increase fee for AURO

                amountInput = IERC20Viralata(input).balanceOf(address(pair)).sub(reserveInput);
                amountOutput = ViralataLibrary.getAmountOut(amountInput, reserveInput, reserveOutput, fee);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? ViralataLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ViralataLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Viralata(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Viralata(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'ViralataRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'ViralataRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(ViralataLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20Viralata(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Viralata(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'ViralataRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(path[path.length - 1] == WETH, 'ViralataRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ViralataLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Viralata(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'ViralataRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return ViralataLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut, uint fee)
        public
        pure
        virtual
        override
        returns (uint amountOut)
    {
        return ViralataLibrary.getAmountOut(amountIn, reserveIn, reserveOut, fee);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint fee)
        public
        pure
        virtual
        override
        returns (uint amountIn)
    {
        return ViralataLibrary.getAmountIn(amountOut, reserveIn, reserveOut, fee);
    }

    function getAmountsOut(uint amountIn, address[] memory path, uint fee)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return ViralataLibrary.getAmountsOut(factory, amountIn, path, fee);
    }

    function getAmountsIn(uint amountOut, address[] memory path, uint fee)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return ViralataLibrary.getAmountsIn(factory, amountOut, path, fee);
    }
}

File 2 of 10 : IERC20.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface IERC20Viralata {
    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 10 : IViralataFactory.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface IViralataFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function migrator() external view returns (address);
    function auro() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function setMigrator(address) external;
    function setAuroAddress(address) external;
}

File 4 of 10 : IViralataPair.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

interface IViralataPair {
    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 5 of 10 : IViralataRouter01.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.2;

interface IViralataRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut, uint fee) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut, uint fee) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path, uint fee) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path, uint fee) external view returns (uint[] memory amounts);
}

File 6 of 10 : IViralataRouter02.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.2;

import './IViralataRouter01.sol';

interface IViralataRouter02 is IViralataRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

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

File 7 of 10 : IWETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

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

File 8 of 10 : SafeMath.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity =0.6.12;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMathViralata {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}

File 9 of 10 : TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.6.0;

// 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, uint 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: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint 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: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint 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: TRANSFER_FROM_FAILED');
    }

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

File 10 of 10 : ViralataLibrary.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

import '../interfaces/IViralataPair.sol';
import "./SafeMath.sol";

library ViralataLibrary {
    using SafeMathViralata for uint;

    // 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, 'ViralataLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'ViralataLibrary: 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);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'1f8a283ca49e2be3a4c310bfa79ed27628edc584d5f528a02daafe1762f41fa2' // init code hash
            ))));
    }

    // 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,) = IViralataPair(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, 'ViralataLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'ViralataLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(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, uint fee) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'ViralataLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'ViralataLibrary: INSUFFICIENT_LIQUIDITY');
        uint feeMul = uint(10000).sub(fee);
        uint amountInWithFee = amountIn.mul(feeMul);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(10000).add(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, uint fee) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'ViralataLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'ViralataLibrary: INSUFFICIENT_LIQUIDITY');
        uint feeMul = uint(10000).sub(fee);
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(feeMul);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path, uint fee) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'ViralataLibrary: 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, fee);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path, uint fee) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'ViralataLibrary: 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, fee);
        }
    }
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","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":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","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":"quote","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":"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":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","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":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","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":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","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":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"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":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b5060405162005fae38038062005fae833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c615e04620001aa600039806101ac5280610e6d5280610ea85280610fd052806113eb528061199f5280611d00528061221652806123555280612463528061256a5280612875528061290a5280612d1d5280612dc45280612e925280612fa2528061308a528061310b528061372b5280613a795280613acf5280613b035280613b845280613d72528061407a528061410f5250806110c15280611218528061131852806114c3528061166d52806117c452806118e75280611a905280611be75280611cde5280611ecb528061264f52806127a652806129495280612afa5280612c51528061314a528061344b52806136dd5280613709528061385e52806139145280613aad5280613e575280613fae528061414e5280614a955280614ad8528061505b528061514e528061531c5280615739528061582652806159005250615e046000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c81578063f305d71914610d0e578063fb3bdb4114610d61576101d5565b8063c45a015514610b33578063ded9382a14610b48578063e815c46614610bc8576101d5565b8063af2979eb116100b0578063af2979eb146109d6578063b6f9de9514610a36578063baa2abde14610ac9576101d5565b80638803dbee146108bd578063ad5c464814610962578063ad615dec146109a0576101d5565b806352707d8c116101385780635c11d795116101125780635c11d795146106e0578063791ac947146107855780637ff36ab51461082a576101d5565b806352707d8c146105d6578063571fd012146106245780635b0d598414610660576101d5565b806338ed17391161016957806338ed1739146103d35780634955796c146104785780634a25d94a14610531576101d5565b806302751cec146101da57806318cbafe5146102535780632195995c14610348576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610df4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102f8600480360360a081101561027657600080fd5b81359160208101359181019060608101604082013564010000000081111561029d57600080fd5b8201836020820111156102af57600080fd5b803590602001918460208302840111640100000000831117156102d157600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f47565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561033457818101518382015260200161031c565b505050509050019250505060405180910390f35b34801561035457600080fd5b5061023a600480360361016081101561036c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356114b9565b3480156103df57600080fd5b506102f8600480360360a08110156103f657600080fd5b81359160208101359181019060608101604082013564010000000081111561041d57600080fd5b82018360208201111561042f57600080fd5b8035906020019184602083028401116401000000008311171561045157600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356115f7565b34801561048457600080fd5b506102f86004803603606081101561049b57600080fd5b813591908101906040810160208201356401000000008111156104bd57600080fd5b8201836020820111156104cf57600080fd5b803590602001918460208302840111640100000000831117156104f157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506118e0915050565b34801561053d57600080fd5b506102f8600480360360a081101561055457600080fd5b81359160208101359181019060608101604082013564010000000081111561057b57600080fd5b82018360208201111561058d57600080fd5b803590602001918460208302840111640100000000831117156105af57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611916565b3480156105e257600080fd5b50610612600480360360808110156105f957600080fd5b5080359060208101359060408101359060600135611cb1565b60408051918252519081900360200190f35b34801561063057600080fd5b506106126004803603608081101561064757600080fd5b5080359060208101359060408101359060600135611cc8565b34801561066c57600080fd5b50610612600480360361014081101561068457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611cd6565b3480156106ec57600080fd5b506101d3600480360360a081101561070357600080fd5b81359160208101359181019060608101604082013564010000000081111561072a57600080fd5b82018360208201111561073c57600080fd5b8035906020019184602083028401116401000000008311171561075e57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e28565b34801561079157600080fd5b506101d3600480360360a08110156107a857600080fd5b8135916020810135918101906060810160408201356401000000008111156107cf57600080fd5b8201836020820111156107e157600080fd5b8035906020019184602083028401116401000000008311171561080357600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561218f565b6102f86004803603608081101561084057600080fd5b8135919081019060408101602082013564010000000081111561086257600080fd5b82018360208201111561087457600080fd5b8035906020019184602083028401116401000000008311171561089657600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124f6565b3480156108c957600080fd5b506102f8600480360360a08110156108e057600080fd5b81359160208101359181019060608101604082013564010000000081111561090757600080fd5b82018360208201111561091957600080fd5b8035906020019184602083028401116401000000008311171561093b57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612a84565b34801561096e57600080fd5b50610977612d1b565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156109ac57600080fd5b50610612600480360360608110156109c357600080fd5b5080359060208101359060400135612d3f565b3480156109e257600080fd5b50610612600480360360c08110156109f957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612d4c565b6101d360048036036080811015610a4c57600080fd5b81359190810190604081016020820135640100000000811115610a6e57600080fd5b820183602082011115610a8057600080fd5b80359060200191846020830284011164010000000083111715610aa257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612f30565b348015610ad557600080fd5b5061023a600480360360e0811015610aec57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356133d1565b348015610b3f57600080fd5b506109776136db565b348015610b5457600080fd5b5061023a6004803603610140811015610b6c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356136ff565b348015610bd457600080fd5b506102f860048036036060811015610beb57600080fd5b81359190810190604081016020820135640100000000811115610c0d57600080fd5b820183602082011115610c1f57600080fd5b80359060200191846020830284011164010000000083111715610c4157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295505091359250613857915050565b348015610c8d57600080fd5b50610cf06004803603610100811015610ca557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613885565b60408051938452602084019290925282820152519081900360600190f35b610cf0600480360360c0811015610d2457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356139fe565b6102f860048036036080811015610d7757600080fd5b81359190810190604081016020820135640100000000811115610d9957600080fd5b820183602082011115610dab57600080fd5b80359060200191846020830284011164010000000083111715610dcd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135613cfe565b6000808242811015610e6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b610e96897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6133d1565b9093509150610ea689868561428f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f1957600080fd5b505af1158015610f2d573d6000803e3d6000fd5b50505050610f3b858361446c565b50965096945050505050565b60608142811015610fb957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061101e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f566972616c617461526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166321dd70e66040518163ffffffff1660e01b815260040160206040518083038186803b15801561112557600080fd5b505afa158015611139573d6000803e3d6000fd5b505050506040513d602081101561114f57600080fd5b50519050601973ffffffffffffffffffffffffffffffffffffffff8216888860008161117757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061120a57508173ffffffffffffffffffffffffffffffffffffffff16888860018181106111d557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15611213575060325b6112737f00000000000000000000000000000000000000000000000000000000000000008b8a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792506145a9915050565b9350888460018651038151811061128657fe5b602002602001015110156112e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d3a602a913960400191505060405180910390fd5b6113aa888860008181106112f557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16336113907f00000000000000000000000000000000000000000000000000000000000000008c8c600081811061134457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168d8d600181811061136e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16614711565b8760008151811061139d57fe5b60200260200101516147fc565b6113e9848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506149cc915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8560018751038151811061143557fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561147357600080fd5b505af1158015611487573d6000803e3d6000fd5b505050506114ac868560018751038151811061149f57fe5b602002602001015161446c565b5050509695505050505050565b60008060006114e97f00000000000000000000000000000000000000000000000000000000000000008f8f614711565b90506000876114f8578c61151a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156115b657600080fd5b505af11580156115ca573d6000803e3d6000fd5b505050506115dd8f8f8f8f8f8f8f6133d1565b809450819550505050509b509b9950505050505050505050565b6060814281101561166957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166321dd70e66040518163ffffffff1660e01b815260040160206040518083038186803b1580156116d157600080fd5b505afa1580156116e5573d6000803e3d6000fd5b505050506040513d60208110156116fb57600080fd5b50519050601973ffffffffffffffffffffffffffffffffffffffff8216888860008161172357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806117b657508173ffffffffffffffffffffffffffffffffffffffff168888600181811061178157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156117bf575060325b61181f7f00000000000000000000000000000000000000000000000000000000000000008b8a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792506145a9915050565b9350888460018651038151811061183257fe5b60200260200101511015611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d3a602a913960400191505060405180910390fd5b6118a1888860008181106112f557fe5b6114ac848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b92506149cc915050565b606061190e7f00000000000000000000000000000000000000000000000000000000000000008585856145a9565b949350505050565b6060814281101561198857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106119ed57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a8c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f566972616c617461526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166321dd70e66040518163ffffffff1660e01b815260040160206040518083038186803b158015611af457600080fd5b505afa158015611b08573d6000803e3d6000fd5b505050506040513d6020811015611b1e57600080fd5b50519050601973ffffffffffffffffffffffffffffffffffffffff82168888600081611b4657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611bd957508173ffffffffffffffffffffffffffffffffffffffff1688886001818110611ba457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15611be2575060325b611c427f00000000000000000000000000000000000000000000000000000000000000008b8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250614c3d915050565b93508884600081518110611c5257fe5b602002602001015111156112e5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c4f6026913960400191505060405180910390fd5b6000611cbf85858585614dcc565b95945050505050565b6000611cbf85858585614ee8565b600080611d247f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000614711565b9050600086611d33578b611d55565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b158015611df157600080fd5b505af1158015611e05573d6000803e3d6000fd5b50505050611e178d8d8d8d8d8d612d4c565b9d9c50505050505050505050505050565b8042811015611e9857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b611f2785856000818110611ea857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611f217f000000000000000000000000000000000000000000000000000000000000000089896000818110611ef757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061136e57fe5b8a6147fc565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611f5757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fda57600080fd5b505afa158015611fee573d6000803e3d6000fd5b505050506040513d602081101561200457600080fd5b50516040805160208881028281018201909352888252929350612046929091899189918291850190849080828437600092019190915250889250615004915050565b8661212e8288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061207957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156120fc57600080fd5b505afa158015612110573d6000803e3d6000fd5b505050506040513d602081101561212657600080fd5b505190615477565b1015612185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d3a602a913960400191505060405180910390fd5b5050505050505050565b80428110156121ff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061226457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461230357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f566972616c617461526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61231385856000818110611ea857fe5b612351858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250615004915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156123da57600080fd5b505afa1580156123ee573d6000803e3d6000fd5b505050506040513d602081101561240457600080fd5b5051905086811015612461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d3a602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156124d457600080fd5b505af11580156124e8573d6000803e3d6000fd5b50505050612185848261446c565b6060814281101561256857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106125ac57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461264b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f566972616c617461526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166321dd70e66040518163ffffffff1660e01b815260040160206040518083038186803b1580156126b357600080fd5b505afa1580156126c7573d6000803e3d6000fd5b505050506040513d60208110156126dd57600080fd5b50519050601973ffffffffffffffffffffffffffffffffffffffff8216888860008161270557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061279857508173ffffffffffffffffffffffffffffffffffffffff168888600181811061276357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156127a1575060325b6128017f0000000000000000000000000000000000000000000000000000000000000000348a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508792506145a9915050565b9350888460018651038151811061281457fe5b60200260200101511015612873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d3a602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856000815181106128bc57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156128ef57600080fd5b505af1158015612903573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61299f7f00000000000000000000000000000000000000000000000000000000000000008b8b600081811061297557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168c8c600181811061136e57fe5b866000815181106129ac57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a0757600080fd5b505af1158015612a1b573d6000803e3d6000fd5b505050506040513d6020811015612a3157600080fd5b5051612a3957fe5b612a78848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b92506149cc915050565b50505095945050505050565b60608142811015612af657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166321dd70e66040518163ffffffff1660e01b815260040160206040518083038186803b158015612b5e57600080fd5b505afa158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b50519050601973ffffffffffffffffffffffffffffffffffffffff82168888600081612bb057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612c4357508173ffffffffffffffffffffffffffffffffffffffff1688886001818110612c0e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15612c4c575060325b612cac7f00000000000000000000000000000000000000000000000000000000000000008b8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250614c3d915050565b93508884600081518110612cbc57fe5b60200260200101511115611891576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c4f6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b600061190e8484846154ef565b60008142811015612dbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b612ded887f000000000000000000000000000000000000000000000000000000000000000089898930896133d1565b905080925050612e9088858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612e5f57600080fd5b505afa158015612e73573d6000803e3d6000fd5b505050506040513d6020811015612e8957600080fd5b505161428f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612f0357600080fd5b505af1158015612f17573d6000803e3d6000fd5b50505050612f25848361446c565b509695505050505050565b8042811015612fa057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1685856000818110612fe457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461308357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f566972616c617461526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156130f057600080fd5b505af1158015613104573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6131767f000000000000000000000000000000000000000000000000000000000000000089896000818110611ef757fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156131ca57600080fd5b505af11580156131de573d6000803e3d6000fd5b505050506040513d60208110156131f457600080fd5b50516131fc57fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061322c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156132af57600080fd5b505afa1580156132c3573d6000803e3d6000fd5b505050506040513d60208110156132d957600080fd5b5051604080516020898102828101820190935289825292935061331b9290918a918a918291850190849080828437600092019190915250899250615004915050565b8761212e8289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061334e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156120fc57600080fd5b600080824281101561344457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b60006134717f00000000000000000000000000000000000000000000000000000000000000008c8c614711565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156134f257600080fd5b505af1158015613506573d6000803e3d6000fd5b505050506040513d602081101561351c57600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561358f57600080fd5b505af11580156135a3573d6000803e3d6000fd5b505050506040513d60408110156135b957600080fd5b508051602090910151909250905060006135d38e8e6155c9565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614613610578183613613565b82825b90975095508a871015613671576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615c756025913960400191505060405180910390fd5b898610156136ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615c2a6025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600061374f7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000614711565b905060008761375e578c613780565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561381c57600080fd5b505af1158015613830573d6000803e3d6000fd5b505050506138428e8e8e8e8e8e610df4565b909f909e509c50505050505050505050505050565b606061190e7f0000000000000000000000000000000000000000000000000000000000000000858585614c3d565b600080600083428110156138fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6139088c8c8c8c8c8c61571c565b9094509250600061393a7f00000000000000000000000000000000000000000000000000000000000000008e8e614711565b90506139488d3383886147fc565b6139548c3383876147fc565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156139bd57600080fd5b505af11580156139d1573d6000803e3d6000fd5b505050506040513d60208110156139e757600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015613a7357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b613aa18a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c61571c565b90945092506000613af37f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000614711565b9050613b018b3383886147fc565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015613b6957600080fd5b505af1158015613b7d573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613c1357600080fd5b505af1158015613c27573d6000803e3d6000fd5b505050506040513d6020811015613c3d57600080fd5b5051613c4557fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015613cae57600080fd5b505af1158015613cc2573d6000803e3d6000fd5b505050506040513d6020811015613cd857600080fd5b5051925034841015613cf057613cf03385340361446c565b505096509650969350505050565b60608142811015613d7057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f566972616c617461526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110613db457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e5357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f566972616c617461526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166321dd70e66040518163ffffffff1660e01b815260040160206040518083038186803b158015613ebb57600080fd5b505afa158015613ecf573d6000803e3d6000fd5b505050506040513d6020811015613ee557600080fd5b50519050601973ffffffffffffffffffffffffffffffffffffffff82168888600081613f0d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613fa057508173ffffffffffffffffffffffffffffffffffffffff1688886001818110613f6b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15613fa9575060325b6140097f00000000000000000000000000000000000000000000000000000000000000008a8a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250879250614c3d915050565b9350348460008151811061401957fe5b60200260200101511115614078576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615c4f6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856000815181106140c157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156140f457600080fd5b505af1158015614108573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61417a7f00000000000000000000000000000000000000000000000000000000000000008b8b600081811061297557fe5b8660008151811061418757fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156141e257600080fd5b505af11580156141f6573d6000803e3d6000fd5b505050506040513d602081101561420c57600080fd5b505161421457fe5b614253848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b92506149cc915050565b8360008151811061426057fe5b6020026020010151341115612a7857612a78338560008151811061428057fe5b6020026020010151340361446c565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061436557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614328565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146143c7576040519150601f19603f3d011682016040523d82523d6000602084013e6143cc565b606091505b50915091508180156143fa5750805115806143fa57508080602001905160208110156143f757600080fd5b50515b61446557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b602083106144e357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016144a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614545576040519150601f19603f3d011682016040523d82523d6000602084013e61454a565b606091505b50509050806145a4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615d886023913960400191505060405180910390fd5b505050565b606060028351101561461c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f566972616c6174614c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b825167ffffffffffffffff8111801561463457600080fd5b5060405190808252806020026020018201604052801561465e578160200160208202803683370190505b509050838160008151811061466f57fe5b60200260200101818152505060005b6001845103811015614708576000806146c18887858151811061469d57fe5b60200260200101518886600101815181106146b457fe5b6020026020010151615a49565b915091506146e48484815181106146d457fe5b6020026020010151838388614dcc565b8484600101815181106146f357fe5b6020908102919091010152505060010161467e565b50949350505050565b600080600061472085856155c9565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f1f8a283ca49e2be3a4c310bfa79ed27628edc584d5f528a02daafe1762f41fa2609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b602083106148da57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161489d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461493c576040519150601f19603f3d011682016040523d82523d6000602084013e614941565b606091505b509150915081801561496f57508051158061496f575080806020019051602081101561496c57600080fd5b50515b6149c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615dab6024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015614c37576000808483815181106149ea57fe5b6020026020010151858460010181518110614a0157fe5b6020026020010151915091506000614a1983836155c9565b5090506000878560010181518110614a2d57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614614a7557826000614a79565b6000835b91509150600060028a51038810614a905788614ad1565b614ad17f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110614ac457fe5b6020026020010151614711565b9050614afe7f00000000000000000000000000000000000000000000000000000000000000008888614711565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015614b48576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614bbd578181015183820152602001614ba5565b50505050905090810190601f168015614bea5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614c0c57600080fd5b505af1158015614c20573d6000803e3d6000fd5b5050600190990198506149cf975050505050505050565b50505050565b6060600283511015614cb057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f566972616c6174614c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b825167ffffffffffffffff81118015614cc857600080fd5b50604051908082528060200260200182016040528015614cf2578160200160208202803683370190505b5090508381600183510381518110614d0657fe5b602090810291909101015282517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b801561470857600080614d6688876001860381518110614d5257fe5b60200260200101518886815181106146b457fe5b91509150614d89848481518110614d7957fe5b6020026020010151838388614ee8565b846001850381518110614d9857fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614d36565b6000808511614e26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615d10602a913960400191505060405180910390fd5b600084118015614e365750600083115b614e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615cbe6027913960400191505060405180910390fd5b6000614e9961271084615477565b90506000614ea78783615b31565b90506000614eb58287615b31565b90506000614ecf83614ec98a612710615b31565b90615bb7565b9050808281614eda57fe5b049998505050505050505050565b6000808511614f42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615ce5602b913960400191505060405180910390fd5b600084118015614f525750600083115b614fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615cbe6027913960400191505060405180910390fd5b6000614fb561271084615477565b90506000614fcf612710614fc9888a615b31565b90615b31565b90506000614fe183614fc9888b615477565b9050614ff86001828481614ff157fe5b0490615bb7565b98975050505050505050565b60005b60018351038110156145a45760008084838151811061502257fe5b602002602001015185846001018151811061503957fe5b602002602001015191509150600061505183836155c9565b50905060006150817f00000000000000000000000000000000000000000000000000000000000000008585614711565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156150cf57600080fd5b505afa1580156150e3573d6000803e3d6000fd5b505050506040513d60608110156150f957600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a811690891614615143578284615146565b83835b9150915060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166321dd70e66040518163ffffffff1660e01b815260040160206040518083038186803b1580156151b257600080fd5b505afa1580156151c6573d6000803e3d6000fd5b505050506040513d60208110156151dc57600080fd5b50519050601973ffffffffffffffffffffffffffffffffffffffff8c8116908316148061523457508173ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff16145b1561523d575060325b6152a8848d73ffffffffffffffffffffffffffffffffffffffff166370a082318c6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156120fc57600080fd5b97506152b688858584614dcc565b96505050505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146152fc57826000615300565b6000835b91509150600060028c51038a10615317578a61534b565b61534b7f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110614ac457fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156153fb5781810151838201526020016153e3565b50505050905090810190601f1680156154285780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561544a57600080fd5b505af115801561545e573d6000803e3d6000fd5b50506001909b019a506150079950505050505050505050565b808203828111156154e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b92915050565b6000808411615549576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615c9a6024913960400191505060405180910390fd5b6000831180156155595750600082115b6155ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180615cbe6027913960400191505060405180910390fd5b826155b98584615b31565b816155c057fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615651576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615d646024913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161061568b57828461568e565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff821661571557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f566972616c6174614c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b1580156157dc57600080fd5b505afa1580156157f0573d6000803e3d6000fd5b505050506040513d602081101561580657600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614156158f8577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1580156158cb57600080fd5b505af11580156158df573d6000803e3d6000fd5b505050506040513d60208110156158f557600080fd5b50505b6000806159267f00000000000000000000000000000000000000000000000000000000000000008b8b615a49565b91509150816000148015615938575080155b1561594857879350869250615a3c565b60006159558984846154ef565b90508781116159c257858110156159b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615c2a6025913960400191505060405180910390fd5b889450925082615a3a565b60006159cf8984866154ef565b9050898111156159db57fe5b87811015615a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615c756025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000806000615a5885856155c9565b509050600080615a69888888614711565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015615aae57600080fd5b505afa158015615ac2573d6000803e3d6000fd5b505050506040513d6060811015615ad857600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614615b1f578082615b22565b81815b90999098509650505050505050565b6000811580615b4c57505080820282828281615b4957fe5b04145b6154e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b808201828110156154e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe566972616c617461526f757465723a20494e53554646494349454e545f425f414d4f554e54566972616c617461526f757465723a204558434553534956455f494e5055545f414d4f554e54566972616c617461526f757465723a20494e53554646494349454e545f415f414d4f554e54566972616c6174614c6962726172793a20494e53554646494349454e545f414d4f554e54566972616c6174614c6962726172793a20494e53554646494349454e545f4c4951554944495459566972616c6174614c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54566972616c6174614c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54566972616c617461526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54566972616c6174614c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a264697066735822122026634c76150367cdb75bd7c91f61a87f51d26f43888e95871c55811aa6daa11e64736f6c634300060c003300000000000000000000000012c2b0a1c9c786bf7ad0e92ce3f2d1805874e185000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

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

00000000000000000000000012c2b0a1c9c786bf7ad0e92ce3f2d1805874e185000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Decoded View---------------
Arg [0] : _factory (address): 0x12c2b0a1c9c786bf7ad0e92ce3f2d1805874e185
Arg [1] : _WETH (address): 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000012c2b0a1c9c786bf7ad0e92ce3f2d1805874e185
Arg [1] : 000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.