Contract 0xf4c587a0972ac2039bff67bc44574bb403ef5235 3

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xba19e67e352a460a624922dadf5223f3d4567cea09d263b8ee015e0b10478baeSwap Exact Token...579956372023-03-20 17:12:5917 hrs 35 mins ago0x1add553bdbaa7492885bae47a869fcfa90e6758e IN  ProtoFi: Router0 FTM0.005714761585
0x47c7f7c7f5076fdfd79bee4ccd8b7e30a542d01866e97abc0c388b22b3fb4032Remove Liquidity...579954852023-03-20 17:10:0417 hrs 38 mins ago0x1add553bdbaa7492885bae47a869fcfa90e6758e IN  ProtoFi: Router0 FTM0.011640366747
0x4f09d4bd5b1fb4e638460064b545a9a08666ae86b06a5b092b379de74c4162aaRemove Liquidity...579707412023-03-20 8:13:011 day 2 hrs ago0xf0754756e71aac7ad2b6497e7006f5e44d68d592 IN  ProtoFi: Router0 FTM0.010759313845
0x9e02c5bb9d553d836a9389807d1b01ef8e5b96aea06bf8f6947104db0b17b82bSwap Exact Token...579432062023-03-19 22:09:071 day 12 hrs ago0x4f86e6a54881083028e38cc1cf48e08a47e576d7 IN  ProtoFi: Router0 FTM0.010561574238
0x86e8b7bb5f2a2df6ace349ca1d29457283a2820b42dc514c9da4403923a1eea4Remove Liquidity...579431782023-03-19 22:08:331 day 12 hrs ago0x4f86e6a54881083028e38cc1cf48e08a47e576d7 IN  ProtoFi: Router0 FTM0.013396969766
0x68463a8a7f622482e3a2b4af2282f2618127cd4a53bad5b6a6c36a7d1579e06aSwap Exact Token...579430562023-03-19 22:06:211 day 12 hrs ago0x4f86e6a54881083028e38cc1cf48e08a47e576d7 IN  ProtoFi: Router0 FTM0.010563272189
0x854323c586ad012518ccc1311e0d3255432ebd9a174e6e35db3e38f012f0ec99Remove Liquidity...579429982023-03-19 22:05:161 day 12 hrs ago0x4f86e6a54881083028e38cc1cf48e08a47e576d7 IN  ProtoFi: Router0 FTM0.01074132346
0xf69b3420ab48a2675d882b5833dce16c675623039c50d9e165d7ac2e4109378cSwap Exact Token...579417882023-03-19 21:41:161 day 13 hrs ago0xb5c2bc605cfe15d31554c6ad0b6e0844132be3cb IN  ProtoFi: Router0 FTM0.007752054202
0x047c3cdb9b64d27312c30c2672d77ab6d3a2657754fb71749e61434beb82c1daSwap Exact Token...579391192023-03-19 20:47:141 day 14 hrs ago0xa0ebc93cd2e1f10994f7a7439b3c8d6b4786879f IN  ProtoFi: Router0 FTM0.049026576643
0x4914ee2f89367a7ba89aefd6a47082b8ed48a4b01cc2d2f2e6ee5abcf41e77ebAdd Liquidity ET...579373282023-03-19 20:13:551 day 14 hrs ago0xd199a62273c42899290474d61496d74b1adaf260 IN  ProtoFi: Router0.133854621092154 FTM0.009501681911
0xe72d3f6c9fffcb02765b6b5c028cd0a86534cdc771367e6c25c002a133da0807Swap Exact Token...579372842023-03-19 20:13:101 day 14 hrs ago0xd199a62273c42899290474d61496d74b1adaf260 IN  ProtoFi: Router0 FTM0.012073752473
0x619a18b4eebf1749b91c52c309bb1a868bb4a27874cffd48c59ad9fde6f2c73aRemove Liquidity...579312842023-03-19 18:25:291 day 16 hrs ago0xf1048b7e1e861153edd122cc10e27bde2b88817d IN  ProtoFi: Router0 FTM0.01235222019
0x5daea41aa46bfe9ccad9273d70849e80639b46cf26771c25399cfdb81fd7a350Swap Exact Token...579302892023-03-19 18:04:581 day 16 hrs ago0x684622d1932b7aa48b5a402e3872b32284b6fd95 IN  ProtoFi: Router0 FTM0.008322678459
0x44f1a79223f10d80babf1005e41301449d2c3b0074988b775452d320761ce044Swap Exact Token...579259452023-03-19 16:41:161 day 18 hrs ago0xe439fb925a1307f54159f84b4f0bbf7c1414ffa8 IN  ProtoFi: Router0 FTM0.012382669188
0x123da7dc1c45107e60a64999c67bf2ffd079cd73bfff1c2c5a3e27b31171e15aSwap Exact Token...579216812023-03-19 14:55:111 day 19 hrs ago0x9c56d6e6c4200f8f51867975fbf54f137ab97e6f IN  ProtoFi: Router0 FTM0.00501849793
0x7815dbd727cb53a1b8a1d44834e4d63d9b0415f40fb1756f9e3f395580436ca2Remove Liquidity...579215482023-03-19 14:51:471 day 19 hrs ago0x9c56d6e6c4200f8f51867975fbf54f137ab97e6f IN  ProtoFi: Router0 FTM0.009305228688
0x15a481d66d29a0adc531041e276ba3d754c6f479d80d5c4ddfc9f3760188513aSwap Exact Token...579184642023-03-19 13:52:171 day 20 hrs ago0xbf0ceb852001ba5fd599dc031951086ad247b127 IN  ProtoFi: Router0 FTM0.004509955034
0x5d017c3c30086982962cfa7c248efe7423f56cc836ec9a5292bb2d01ce0db6c9Swap Exact Token...579181342023-03-19 13:46:091 day 21 hrs ago0x14c07a5f107a9d15a6c2d0c131dcb3933386503e IN  ProtoFi: Router0 FTM0.005051757906
0xc01668d8e15a1f1657c819719968f282ce90a5acac05d4e450d8468d6a7b0a1aSwap Exact Token...579048382023-03-19 9:22:232 days 1 hr ago0x7c1097b7606900ccb4b3f91f12e1e67c2d2fc0c1 IN  ProtoFi: Router0 FTM0.003645660664
0x9cbd7363724b8d393772f9a091f88c6427d9cfbe38d60fb2b8ec50c99dc584ebSwap Exact Token...578700782023-03-18 19:30:202 days 15 hrs ago0xdfb0348f0d8200ee2eb50aa4755f690dc3165b52 IN  ProtoFi: Router0 FTM0.024788064746
0x8037e2261fd8443397fcdac792010bef311fbc8d22fb9b72121cc11328a475aaRemove Liquidity578700012023-03-18 19:29:052 days 15 hrs ago0xdfb0348f0d8200ee2eb50aa4755f690dc3165b52 IN  ProtoFi: Router0 FTM0.029433136042
0x2e9ab44649f51b91254fda023560a248e6db007452ac8058cd555ce1e89c4128Swap Exact Token...578568342023-03-18 15:11:042 days 19 hrs ago0xe7fea41a0321bfdbf28c13697f0f3bb3fa6c330c IN  ProtoFi: Router0 FTM0.05797952137
0x1538f6a68dba5de19f1092226a1d70d56a216c537f0758292b5f39378cadd00fSwap Exact Token...578568152023-03-18 15:10:452 days 19 hrs ago0xe7fea41a0321bfdbf28c13697f0f3bb3fa6c330c IN  ProtoFi: Router0 FTM0.011712488101
0xad3bc9b8a1fed1a3f6ef5c3b06ed62b1b95301dd58f7a38d5fd51f492dac8d48Swap Exact Token...578458142023-03-18 11:44:312 days 23 hrs ago0x4922e313254b80b830f21239b97e5c1f7c8e59b5 IN  ProtoFi: Router0 FTM0.015929176151
0xfd542bf8c59b082858865759c3c24a1d2b024b8c9a5fcad162eb84e8019d0d1cRemove Liquidity...578457792023-03-18 11:43:432 days 23 hrs ago0x4922e313254b80b830f21239b97e5c1f7c8e59b5 IN  ProtoFi: Router0 FTM0.021521261559
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xba19e67e352a460a624922dadf5223f3d4567cea09d263b8ee015e0b10478bae579956372023-03-20 17:12:5917 hrs 35 mins ago ProtoFi: Router0x1add553bdbaa7492885bae47a869fcfa90e6758e14.640846823357443765 FTM
0xba19e67e352a460a624922dadf5223f3d4567cea09d263b8ee015e0b10478bae579956372023-03-20 17:12:5917 hrs 35 mins ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router14.640846823357443765 FTM
0x47c7f7c7f5076fdfd79bee4ccd8b7e30a542d01866e97abc0c388b22b3fb4032579954852023-03-20 17:10:0417 hrs 38 mins ago ProtoFi: Router0x1add553bdbaa7492885bae47a869fcfa90e6758e14.675656894466474164 FTM
0x47c7f7c7f5076fdfd79bee4ccd8b7e30a542d01866e97abc0c388b22b3fb4032579954852023-03-20 17:10:0417 hrs 38 mins ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router14.675656894466474164 FTM
0x4f09d4bd5b1fb4e638460064b545a9a08666ae86b06a5b092b379de74c4162aa579707412023-03-20 8:13:011 day 2 hrs ago ProtoFi: Router0xf0754756e71aac7ad2b6497e7006f5e44d68d59214.078877919646792917 FTM
0x4f09d4bd5b1fb4e638460064b545a9a08666ae86b06a5b092b379de74c4162aa579707412023-03-20 8:13:011 day 2 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router14.078877919646792917 FTM
0x9e02c5bb9d553d836a9389807d1b01ef8e5b96aea06bf8f6947104db0b17b82b579432062023-03-19 22:09:071 day 12 hrs ago ProtoFi: Router0x4f86e6a54881083028e38cc1cf48e08a47e576d71.709929605604151557 FTM
0x9e02c5bb9d553d836a9389807d1b01ef8e5b96aea06bf8f6947104db0b17b82b579432062023-03-19 22:09:071 day 12 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router1.709929605604151557 FTM
0x86e8b7bb5f2a2df6ace349ca1d29457283a2820b42dc514c9da4403923a1eea4579431782023-03-19 22:08:331 day 12 hrs ago ProtoFi: Router0x4f86e6a54881083028e38cc1cf48e08a47e576d773.477077552714369801 FTM
0x86e8b7bb5f2a2df6ace349ca1d29457283a2820b42dc514c9da4403923a1eea4579431782023-03-19 22:08:331 day 12 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router73.477077552714369801 FTM
0x68463a8a7f622482e3a2b4af2282f2618127cd4a53bad5b6a6c36a7d1579e06a579430562023-03-19 22:06:211 day 12 hrs ago ProtoFi: Router0x4f86e6a54881083028e38cc1cf48e08a47e576d70.919275895895021518 FTM
0x68463a8a7f622482e3a2b4af2282f2618127cd4a53bad5b6a6c36a7d1579e06a579430562023-03-19 22:06:211 day 12 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router0.919275895895021518 FTM
0x047c3cdb9b64d27312c30c2672d77ab6d3a2657754fb71749e61434beb82c1da579391192023-03-19 20:47:141 day 14 hrs ago ProtoFi: Router0xa0ebc93cd2e1f10994f7a7439b3c8d6b4786879f2.293555681232112193 FTM
0x047c3cdb9b64d27312c30c2672d77ab6d3a2657754fb71749e61434beb82c1da579391192023-03-19 20:47:141 day 14 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router2.293555681232112193 FTM
0x4914ee2f89367a7ba89aefd6a47082b8ed48a4b01cc2d2f2e6ee5abcf41e77eb579373282023-03-19 20:13:551 day 14 hrs ago ProtoFi: Router Fantom Finance: Wrapped Fantom Token0.133854621092154227 FTM
0xe72d3f6c9fffcb02765b6b5c028cd0a86534cdc771367e6c25c002a133da0807579372842023-03-19 20:13:101 day 14 hrs ago ProtoFi: Router0xd199a62273c42899290474d61496d74b1adaf2600.135379092712965627 FTM
0xe72d3f6c9fffcb02765b6b5c028cd0a86534cdc771367e6c25c002a133da0807579372842023-03-19 20:13:101 day 14 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router0.135379092712965627 FTM
0x619a18b4eebf1749b91c52c309bb1a868bb4a27874cffd48c59ad9fde6f2c73a579312842023-03-19 18:25:291 day 16 hrs ago ProtoFi: Router0xf1048b7e1e861153edd122cc10e27bde2b88817d30.071619580621802056 FTM
0x619a18b4eebf1749b91c52c309bb1a868bb4a27874cffd48c59ad9fde6f2c73a579312842023-03-19 18:25:291 day 16 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router30.071619580621802056 FTM
0x5daea41aa46bfe9ccad9273d70849e80639b46cf26771c25399cfdb81fd7a350579302892023-03-19 18:04:581 day 16 hrs ago ProtoFi: Router0x684622d1932b7aa48b5a402e3872b32284b6fd9524.387183147848848343 FTM
0x5daea41aa46bfe9ccad9273d70849e80639b46cf26771c25399cfdb81fd7a350579302892023-03-19 18:04:581 day 16 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router24.387183147848848343 FTM
0x44f1a79223f10d80babf1005e41301449d2c3b0074988b775452d320761ce044579259452023-03-19 16:41:161 day 18 hrs ago ProtoFi: Router0xe439fb925a1307f54159f84b4f0bbf7c1414ffa80.623408901084050458 FTM
0x44f1a79223f10d80babf1005e41301449d2c3b0074988b775452d320761ce044579259452023-03-19 16:41:161 day 18 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router0.623408901084050458 FTM
0x123da7dc1c45107e60a64999c67bf2ffd079cd73bfff1c2c5a3e27b31171e15a579216812023-03-19 14:55:111 day 19 hrs ago ProtoFi: Router0x9c56d6e6c4200f8f51867975fbf54f137ab97e6f5.314777888069843285 FTM
0x123da7dc1c45107e60a64999c67bf2ffd079cd73bfff1c2c5a3e27b31171e15a579216812023-03-19 14:55:111 day 19 hrs ago Fantom Finance: Wrapped Fantom Token ProtoFi: Router5.314777888069843285 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ProtofiRouter

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0-or-later

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,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeApprove: approve failed'
        );
    }

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

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

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

File 2 of 10 : ProtofiRouter.sol
// SPDX-License-Identifier: MIT
/**
Exactly equal to PolyZap (and other UniswapV2 forks)
 */
pragma solidity >= 0.6.6;

import '@uniswap/lib/contracts/libraries/TransferHelper.sol';
import "./libraries/SafeMath.sol";
import './libraries/ProtofiLibrary.sol';
import './interfaces/IProtofiFactory.sol';
import './interfaces/IProtofiRouter02.sol';
import './interfaces/IERC20.sol';
import './interfaces/IWETH.sol';

pragma solidity >= 0.6.6;

contract ProtofiRouter is IProtofiRouter02 {
    using SafeMath for uint;

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

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'ProtofiRouter: 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 (IProtofiFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IProtofiFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = ProtofiLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = ProtofiLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'ProtofiRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = ProtofiLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'ProtofiRouter: 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 = ProtofiLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IProtofiPair(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 = ProtofiLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IProtofiPair(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 = ProtofiLibrary.pairFor(factory, tokenA, tokenB);
        IProtofiPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IProtofiPair(pair).burn(to);
        (address token0,) = ProtofiLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'ProtofiRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'ProtofiRouter: 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 = ProtofiLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IProtofiPair(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 = ProtofiLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IProtofiPair(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, IERC20(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 = ProtofiLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IProtofiPair(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,) = ProtofiLibrary.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 ? ProtofiLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IProtofiPair(ProtofiLibrary.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) {
        amounts = ProtofiLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ProtofiRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ProtofiLibrary.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) {
        amounts = ProtofiLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'ProtofiRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ProtofiLibrary.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, 'ProtofiRouter: INVALID_PATH');
        amounts = ProtofiLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ProtofiRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(ProtofiLibrary.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, 'ProtofiRouter: INVALID_PATH');
        amounts = ProtofiLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'ProtofiRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ProtofiLibrary.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, 'ProtofiRouter: INVALID_PATH');
        amounts = ProtofiLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'ProtofiRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ProtofiLibrary.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, 'ProtofiRouter: INVALID_PATH');
        amounts = ProtofiLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'ProtofiRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(ProtofiLibrary.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,) = ProtofiLibrary.sortTokens(input, output);
            IProtofiPair pair = IProtofiPair(ProtofiLibrary.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);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = ProtofiLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? ProtofiLibrary.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, ProtofiLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'ProtofiRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'ProtofiRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(ProtofiLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'ProtofiRouter: 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, 'ProtofiRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, ProtofiLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'ProtofiRouter: 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 ProtofiLibrary.quote(amountA, reserveA, reserveB);
    }

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

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

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

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

File 3 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

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

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

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

File 4 of 10 : IProtofiFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.6;


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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function feeAmount() external view returns (uint16);

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

File 5 of 10 : IProtofiPair.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

interface IProtofiPair {
    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 6 of 10 : IProtofiRouter01.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;

interface IProtofiRouter01 {
    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) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 7 of 10 : IProtofiRouter02.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.2;

import './IProtofiRouter01.sol';

interface IProtofiRouter02 is IProtofiRouter01 {
    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 8 of 10 : IWETH.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;

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

File 9 of 10 : ProtofiLibrary.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.0;

import "./SafeMath.sol";
import "../interfaces/IProtofiPair.sol";

library ProtofiLibrary {
    using SafeMath 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, 'ProtofiLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'ProtofiLibrary: 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'5e47480f25da6d84d0437a474359e885cdb7dc9eb9f8fd61f3cb41d85a64a420' // 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);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = IProtofiPair(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, 'ProtofiLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'ProtofiLibrary: 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) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'ProtofiLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'ProtofiLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(9985);  //Mod for fees
        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) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'ProtofiLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'ProtofiLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(10000);
        uint denominator = reserveOut.sub(amountOut).mul(9985);  //Mod for fees
        amountIn = (numerator / denominator).add(1);
    }

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

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

File 10 of 10 : SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.6.6;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
    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');
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "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"}],"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"}],"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[]"}],"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[]"}],"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"}]

60c060405234801561001057600080fd5b5060405162005645380380620056458339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6154c062000185600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611dec5280611f2b5280612039528061214052806122f35280612388528061262452806126cb5280612799528061289e52806129865280612a075280613054528061337452806133ca52806133fe528061347f528061366d528061381d52806138b25250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061222652806123c7528061255a5280612a465280612d475280612fd952806130025280613032528061320f52806133a8528061375352806138f1528061432c528061436f52806146b952806148845280614da75280614e945280614f6e52506154c06000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d65565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120cc565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124d6565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124e3565b34801561096057600080fd5b50610969612622565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612646565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612653565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282c565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612ccd565b348015610b3157600080fd5b50610969612fd7565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ffb945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613028565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613180565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356132f9565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356135f9565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612ccd565b9093509150610e96898685613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613bf9565b50965096945050505050565b6000610f44848484613d36565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f746f6669526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e4292505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153ec6029913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613fa8565b8560008151811061124a57fe5b6020026020010151614093565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614263915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613bf9565b509695505050505050565b60606113917f000000000000000000000000000000000000000000000000000000000000000084846144d4565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f613fa8565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612ccd565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e4292505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153ec6029913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614263915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f746f6669526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b61183d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144d492505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061539d6025913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613fa8565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d612653565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a614093565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b50516040805160208881028281018201909352888252929350611c1c929091899189918291850190849080828437600092019190915250889250614662915050565b86611d048288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c4f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b5051906149df565b1015611d5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153ec6029913960400191505060405180910390fd5b5050505050505050565b8042811015611dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e3a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f746f6669526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b611ee985856000818110611a7e57fe5b611f27858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614662915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b5051905086811015612037576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153ec6029913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b50505050611d5b8482613bf9565b6060814281101561213e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061218257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f746f6669526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b61227f7f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e4292505050565b9150868260018451038151811061229257fe5b602002602001015110156122f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806153ec6029913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061233a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f37f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061240057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505161248d57fe5b6124cc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614263915050565b5095945050505050565b6000610f44848484614a51565b6060814281101561255557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b6125b37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144d492505050565b915086826000815181106125c357fe5b6020026020010151111561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061539d6025913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614b5d565b600081428110156126c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b6126f4887f00000000000000000000000000000000000000000000000000000000000000008989893089612ccd565b90508092505061279788858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276657600080fd5b505afa15801561277a573d6000803e3d6000fd5b505050506040513d602081101561279057600080fd5b5051613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280a57600080fd5b505af115801561281e573d6000803e3d6000fd5b505050506113598483613bf9565b804281101561289c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106128e057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461297f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f746f6669526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a727f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac657600080fd5b505af1158015612ada573d6000803e3d6000fd5b505050506040513d6020811015612af057600080fd5b5051612af857fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bab57600080fd5b505afa158015612bbf573d6000803e3d6000fd5b505050506040513d6020811015612bd557600080fd5b50516040805160208981028281018201909352898252929350612c179290918a918a918291850190849080828437600092019190915250899250614662915050565b87611d048289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c4a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b6000612d6d7f00000000000000000000000000000000000000000000000000000000000000008c8c613fa8565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612dee57600080fd5b505af1158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612e8b57600080fd5b505af1158015612e9f573d6000803e3d6000fd5b505050506040513d6040811015612eb557600080fd5b50805160209091015190925090506000612ecf8e8e614c37565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f0c578183612f0f565b82825b90975095508a871015612f6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153796024913960400191505060405180910390fd5b89861015612fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806152f06024913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613e42565b60008060006130787f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613fa8565b9050600087613087578c6130a9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561314557600080fd5b505af1158015613159573d6000803e3d6000fd5b5050505061316b8e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b600080600083428110156131f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b6132038c8c8c8c8c8c614d8a565b909450925060006132357f00000000000000000000000000000000000000000000000000000000000000008e8e613fa8565b90506132438d338388614093565b61324f8c338387614093565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d60208110156132e257600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561336e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b61339c8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614d8a565b909450925060006133ee7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613fa8565b90506133fc8b338388614093565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561346457600080fd5b505af1158015613478573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505161354057fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b505050506040513d60208110156135d357600080fd5b50519250348410156135eb576135eb33853403613bf9565b505096509650969350505050565b6060814281101561366b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f50726f746f6669526f757465723a204558504952454400000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106136af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461374e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f50726f746f6669526f757465723a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b6137ac7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144d492505050565b915034826000815181106137bc57fe5b6020026020010151111561381b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061539d6025913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061386457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561389757600080fd5b505af11580156138ab573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61391d7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061392a57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50516139b757fe5b6139f682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614263915050565b81600081518110613a0357fe5b60200260200101513411156124cc576124cc3383600081518110613a2357fe5b60200260200101513403613bf9565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b0857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613acb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613b6a576040519150601f19603f3d011682016040523d82523d6000602084013e613b6f565b606091505b5091509150818015613b9d575080511580613b9d5750808060200190516020811015613b9a57600080fd5b50515b613bf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061543b602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613c7057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c33565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613cd2576040519150601f19603f3d011682016040523d82523d6000602084013e613cd7565b606091505b5050905080613d31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806153456034913960400191505060405180910390fd5b505050565b6000808411613d90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806152c76029913960400191505060405180910390fd5b600083118015613da05750600082115b613df5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154156026913960400191505060405180910390fd5b6000613e03856127016150b7565b90506000613e1182856150b7565b90506000613e2b83613e25886127106150b7565b9061513d565b9050808281613e3657fe5b04979650505050505050565b6060600282511015613eb557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50726f746f66694c6962726172793a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ecd57600080fd5b50604051908082528060200260200182016040528015613ef7578160200160208202803683370190505b5090508281600081518110613f0857fe5b60200260200101818152505060005b6001835103811015613fa057600080613f5a87868581518110613f3657fe5b6020026020010151878660010181518110613f4d57fe5b60200260200101516151af565b91509150613f7c848481518110613f6d57fe5b60200260200101518383613d36565b848460010181518110613f8b57fe5b60209081029190910101525050600101613f17565b509392505050565b6000806000613fb78585614c37565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f5e47480f25da6d84d0437a474359e885cdb7dc9eb9f8fd61f3cb41d85a64a420609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061417157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101614134565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141d3576040519150601f19603f3d011682016040523d82523d6000602084013e6141d8565b606091505b5091509150818015614206575080511580614206575080806020019051602081101561420357600080fd5b50515b61425b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806153146031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156144ce5760008084838151811061428157fe5b602002602001015185846001018151811061429857fe5b60200260200101519150915060006142b08383614c37565b50905060008785600101815181106142c457fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461430c57826000614310565b6000835b91509150600060028a510388106143275788614368565b6143687f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061435b57fe5b6020026020010151613fa8565b90506143957f00000000000000000000000000000000000000000000000000000000000000008888613fa8565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156143df576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561445457818101518382015260200161443c565b50505050905090810190601f1680156144815780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156144a357600080fd5b505af11580156144b7573d6000803e3d6000fd5b505060019099019850614266975050505050505050565b50505050565b606060028251101561454757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50726f746f66694c6962726172793a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561455f57600080fd5b50604051908082528060200260200182016040528015614589578160200160208202803683370190505b509050828160018351038151811061459d57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613fa0576000806145fd878660018603815181106145e957fe5b6020026020010151878681518110613f4d57fe5b9150915061461f84848151811061461057fe5b60200260200101518383614a51565b84600185038151811061462e57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016145cd565b60005b6001835103811015613d315760008084838151811061468057fe5b602002602001015185846001018151811061469757fe5b60200260200101519150915060006146af8383614c37565b50905060006146df7f00000000000000000000000000000000000000000000000000000000000000008585613fa8565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561472d57600080fd5b505afa158015614741573d6000803e3d6000fd5b505050506040513d606081101561475757600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146147a15782846147a4565b83835b91509150614813828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b9550614820868383613d36565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461486457826000614868565b6000835b91509150600060028c51038a1061487f578a6148b3565b6148b37f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061435b57fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b8381101561496357818101518382015260200161494b565b50505050905090810190601f1680156149905780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156149b257600080fd5b505af11580156149c6573d6000803e3d6000fd5b50506001909b019a506146659950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614aab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806153c2602a913960400191505060405180910390fd5b600083118015614abb5750600082115b614b10576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154156026913960400191505060405180910390fd5b6000614b28612710614b2286886150b7565b906150b7565b90506000614b3c612701614b2286896149df565b9050614b536001828481614b4c57fe5b049061513d565b9695505050505050565b6000808411614bb7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806154686023913960400191505060405180910390fd5b600083118015614bc75750600082115b614c1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154156026913960400191505060405180910390fd5b82614c2785846150b7565b81614c2e57fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cbf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806152a46023913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614cf9578284614cfc565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614d8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f50726f746f66694c6962726172793a205a45524f5f4144445245535300000000604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614e4a57600080fd5b505afa158015614e5e573d6000803e3d6000fd5b505050506040513d6020811015614e7457600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f66577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614f3957600080fd5b505af1158015614f4d573d6000803e3d6000fd5b505050506040513d6020811015614f6357600080fd5b50505b600080614f947f00000000000000000000000000000000000000000000000000000000000000008b8b6151af565b91509150816000148015614fa6575080155b15614fb6578793508692506150aa565b6000614fc3898484614b5d565b90508781116150305785811015615025576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806152f06024913960400191505060405180910390fd5b8894509250826150a8565b600061503d898486614b5d565b90508981111561504957fe5b878110156150a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153796024913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806150d2575050808202828282816150cf57fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006151be8585614c37565b5090506151cc868686613fa8565b506000806151db888888613fa8565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561522057600080fd5b505afa158015615234573d6000803e3d6000fd5b505050506040513d606081101561524a57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614615291578082615294565b81815b9099909850965050505050505056fe50726f746f66694c6962726172793a204944454e544943414c5f41444452455353455350726f746f66694c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e5450726f746f6669526f757465723a20494e53554646494349454e545f425f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c656450726f746f6669526f757465723a20494e53554646494349454e545f415f414d4f554e5450726f746f6669526f757465723a204558434553534956455f494e5055545f414d4f554e5450726f746f66694c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e5450726f746f6669526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e5450726f746f66694c6962726172793a20494e53554646494349454e545f4c49515549444954595472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c656450726f746f66694c6962726172793a20494e53554646494349454e545f414d4f554e54a2646970667358221220ee07c8ac653f481ce95fc38960e6a0f1fdb7ef79068aaf946b95cb422d7f9dee64736f6c634300060c003300000000000000000000000039720e5fe53beeeb9de4759cb91d8e7d42c17b7600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

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

00000000000000000000000039720e5fe53beeeb9de4759cb91d8e7d42c17b7600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0x39720e5fe53beeeb9de4759cb91d8e7d42c17b76
Arg [1] : _WETH (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000039720e5fe53beeeb9de4759cb91d8e7d42c17b76
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
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.