ETH Price: $3,334.64 (-0.43%)
 

Overview

ETH Balance

0.0018437010145184 ETH

Eth Value

$6.15 (@ $3,334.64/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x752442e3e38e02be3078efd55eae4c9cc04a51b5638963d75232a8bb935b76aa Redeem Rewards(pending)2024-12-29 1:33:303 days ago1735436010IN
0x87a56706...F844Ba99b
0 ETH(Pending)(Pending)
Redeem Rewards214830612024-12-26 0:27:476 days ago1735172867IN
0x87a56706...F844Ba99b
0 ETH0.001252265.83044254
Redeem Rewards214830432024-12-26 0:24:116 days ago1735172651IN
0x87a56706...F844Ba99b
0 ETH0.001357026.31821773
Redeem Rewards214830302024-12-26 0:21:236 days ago1735172483IN
0x87a56706...F844Ba99b
0 ETH0.001196435.57052369
Redeem Rewards214829342024-12-26 0:01:596 days ago1735171319IN
0x87a56706...F844Ba99b
0 ETH0.000986914.59501778
Transfer214818922024-12-25 20:31:476 days ago1735158707IN
0x87a56706...F844Ba99b
0 ETH0.000258225.53012109
Redeem Rewards214616672024-12-23 0:39:479 days ago1734914387IN
0x87a56706...F844Ba99b
0 ETH0.001881995.61168744
Redeem Rewards214616602024-12-23 0:38:239 days ago1734914303IN
0x87a56706...F844Ba99b
0 ETH0.001824475.44017573
Redeem Rewards214174622024-12-16 20:26:2315 days ago1734380783IN
0x87a56706...F844Ba99b
0 ETH0.0047175121.96317111
Redeem Rewards214174242024-12-16 20:18:4715 days ago1734380327IN
0x87a56706...F844Ba99b
0 ETH0.0088202441.06412846
Redeem Rewards214174032024-12-16 20:14:3515 days ago1734380075IN
0x87a56706...F844Ba99b
0 ETH0.0051590124.01866091
Transfer213999392024-12-14 9:44:3517 days ago1734169475IN
0x87a56706...F844Ba99b
0 ETH0.000241228.15107331
Redeem Rewards213784452024-12-11 9:42:5920 days ago1733910179IN
0x87a56706...F844Ba99b
0 ETH0.0046752914.68972747
Redeem Rewards213784422024-12-11 9:42:2320 days ago1733910143IN
0x87a56706...F844Ba99b
0 ETH0.004402313.83198716
Redeem Rewards212834302024-11-28 3:02:2334 days ago1732762943IN
0x87a56706...F844Ba99b
0 ETH0.0041713618.53940387
Redeem Rewards212145202024-11-18 12:11:3543 days ago1731931895IN
0x87a56706...F844Ba99b
0 ETH0.0038487314.62279303
Redeem Rewards211772732024-11-13 7:27:3548 days ago1731482855IN
0x87a56706...F844Ba99b
0 ETH0.005036718.93489273
Buy Supply211769792024-11-13 6:28:2349 days ago1731479303IN
0x87a56706...F844Ba99b
0.4 ETH0.0030764419.24027213
Redeem Rewards211458592024-11-08 22:18:1153 days ago1731104291IN
0x87a56706...F844Ba99b
0 ETH0.0025674411.8
Redeem Rewards211423412024-11-08 10:31:3553 days ago1731061895IN
0x87a56706...F844Ba99b
0 ETH0.0023873610.97176775
Redeem Rewards211423272024-11-08 10:28:4753 days ago1731061727IN
0x87a56706...F844Ba99b
0 ETH0.001915068.80119217
Redeem Rewards211422812024-11-08 10:19:3553 days ago1731061175IN
0x87a56706...F844Ba99b
0 ETH0.003205229.98295831
Redeem Rewards211422132024-11-08 10:05:5953 days ago1731060359IN
0x87a56706...F844Ba99b
0 ETH0.0041280812.20671015
Redeem Rewards211422092024-11-08 10:05:1153 days ago1731060311IN
0x87a56706...F844Ba99b
0 ETH0.0027470412.62474766
Redeem Rewards211422032024-11-08 10:03:5953 days ago1731060239IN
0x87a56706...F844Ba99b
0 ETH0.0024367911.19892794
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
212145202024-11-18 12:11:3543 days ago1731931895
0x87a56706...F844Ba99b
0.03121945 ETH
211772732024-11-13 7:27:3548 days ago1731482855
0x87a56706...F844Ba99b
0.36422701 ETH
211769792024-11-13 6:28:2349 days ago1731479303
0x87a56706...F844Ba99b
0.00385882 ETH
206093392024-08-26 0:58:59128 days ago1724633939
0x87a56706...F844Ba99b
0.000011 ETH
205495002024-08-17 16:20:47136 days ago1723911647
0x87a56706...F844Ba99b
0.00468266 ETH
205495002024-08-17 16:20:47136 days ago1723911647
0x87a56706...F844Ba99b
0.00023424 ETH
203908002024-07-26 12:43:35158 days ago1721997815
0x87a56706...F844Ba99b
0.01040591 ETH
203798282024-07-24 23:57:47160 days ago1721865467
0x87a56706...F844Ba99b
0.00014566 ETH
202787862024-07-10 21:27:59174 days ago1720646879
0x87a56706...F844Ba99b
0.00988552 ETH
202787862024-07-10 21:27:59174 days ago1720646879
0x87a56706...F844Ba99b
0.0051923 ETH
202324482024-07-04 10:06:59180 days ago1720087619
0x87a56706...F844Ba99b
2.58584467 ETH
202268332024-07-03 15:19:35181 days ago1720019975
0x87a56706...F844Ba99b
0.32067803 ETH
201881972024-06-28 5:48:59187 days ago1719553739
0x87a56706...F844Ba99b
0.20811627 ETH
201743472024-06-26 7:23:35188 days ago1719386615
0x87a56706...F844Ba99b
0.00772943 ETH
201699132024-06-25 16:32:35189 days ago1719333155
0x87a56706...F844Ba99b
0.03537976 ETH
201680122024-06-25 10:10:35189 days ago1719310235
0x87a56706...F844Ba99b
69.16294644 ETH
201620882024-06-24 14:18:11190 days ago1719238691
0x87a56706...F844Ba99b
10 ETH
201613602024-06-24 11:51:59190 days ago1719229919
0x87a56706...F844Ba99b
0.17303863 ETH
201396572024-06-21 10:59:59193 days ago1718967599
0x87a56706...F844Ba99b
0.10125839 ETH
201258392024-06-19 12:39:11195 days ago1718800751
0x87a56706...F844Ba99b
0.00308048 ETH
201211282024-06-18 20:48:35196 days ago1718743715
0x87a56706...F844Ba99b
1.05459921 ETH
201202422024-06-18 17:50:47196 days ago1718733047
0x87a56706...F844Ba99b
0.0048339 ETH
201067932024-06-16 20:38:59198 days ago1718570339
0x87a56706...F844Ba99b
0.00916075 ETH
200955602024-06-15 6:58:59200 days ago1718434739
0x87a56706...F844Ba99b
0.21090711 ETH
200735582024-06-12 5:07:47203 days ago1718168867
0x87a56706...F844Ba99b
0.05483584 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenProfit

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 7: TokenProfit.sol
// SPDX-License-Identifier: --DAO--

/**
 * @author René Hochmuth
 * @author Vitally Marinchenko
 */

pragma solidity =0.8.19;

import "./Adapter.sol";
import "./TokenBase.sol";

error Prevented();
error ExecuteFailed();
error InvalidAmount(
    uint256 provided,
    uint256 required
);

contract TokenProfit is TokenBase {

    Adapter public adapter;

    address public adapterContract;
    address public governanceContract;

    address public immutable auctionContract;
    uint256 constant PRECISION_FACTOR = 1E18;

    bool public extraMintAllowed;

    uint256 status;
    uint256 constant ENTERED = 1;
    uint256 constant NOT_ENTERED = 2;

    modifier nonReentrant() {
        nonReentrantBefore();
        _;
        nonReentrantAfter();
    }

    function nonReentrantBefore()
        private
    {
        if (status == ENTERED) {
            revert Prevented();
        }

        status = ENTERED;
    }

    function nonReentrantAfter()
        private
    {
        status = NOT_ENTERED;
    }

    modifier onlyAdapter() {
        require(
            msg.sender == adapterContract,
            "TokenProfit: NOT_ADAPTER"
        );
        _;
    }

    modifier onlyGovernance() {
        require(
            msg.sender == governanceContract,
            "TokenProfit: NOT_GOVERNANCE"
        );
        _;
    }

    modifier syncAdapter() {
        adapter.syncServices();
        _;
    }

    receive()
        external
        payable
    {
        emit Received(
            msg.sender,
            msg.value
        );
    }

    constructor(
        address _auctionContract,
        address _uniV2RouterAddress,
        address _liquidNFTsRouterAddress,
        address _liquidNFTsWETHPool,
        address _liquidNFTsUSDCPool
    ) {
        adapter = new Adapter(
            address(this),
            _uniV2RouterAddress,
            _liquidNFTsRouterAddress,
            _liquidNFTsWETHPool,
            _liquidNFTsUSDCPool
        );

        auctionContract = _auctionContract;
        adapterContract = address(adapter);
        governanceContract = msg.sender;

        status = NOT_ENTERED;
    }

    /**
    * @dev Allows to execute contract call controlled by Adapter contract
    */
    function executeAdapterRequest(
        address _contractAddress,
        bytes memory _callBytes
    )
        external
        onlyAdapter
        returns (bytes memory)
    {
        (
            bool success,
            bytes memory returnData
        ) = _contractAddress.call(
            _callBytes
        );

        if (success == false) {
            revert ExecuteFailed();
        }

        return returnData;
    }

    /**
    * @dev Allows to execute contract call defined by Adapter contract
    */
    function executeAdapterRequestWithValue(
        address _callAddress,
        bytes memory _callBytes,
        uint256 _callValue
    )
        external
        onlyAdapter
        returns (bytes memory)
    {
        (
            bool success,
            bytes memory returnData
        ) = _callAddress.call{value: _callValue}(
            _callBytes
        );

        if (success == false) {
            revert ExecuteFailed();
        }

        return returnData;
    }

    /**
    * @dev Allows to change Adapter contract
    */
    function changeAdapter(
        address _newAdapterAddress
    )
        external
        onlyGovernance
    {
        adapterContract = _newAdapterAddress;

        adapter = Adapter(
            _newAdapterAddress
        );
    }

    /**
    * @dev Returns total amount of tokens controlled by Adapter contract
    */
    function getTotalTokenAmount(
        uint8 _index
    )
        external
        view
        returns (uint256)
    {
        (
            ,
            uint256[] memory tokenAmounts,
            ,
        ) = adapter.getTokenAmounts();

        return tokenAmounts[_index];
    }

    /**
    * @dev Allows user to burn TokenProfit tokens and redeem rewards
    */
    function redeemRewards(
        uint256 _burnAmount
    )
        external
        syncAdapter
        nonReentrant
        returns (
            uint256,
            uint256[] memory
        )
    {
        (
            uint256 availableEther,
            uint256[] memory availableTokens,
            uint256 etherRedeemAmount,
            uint256[] memory tokenRedeemAmounts
        ) = getUserRedeemAmounts(
            _burnAmount
        );

        _burn(
            msg.sender,
            _burnAmount
        );

        _processTokens(
            availableTokens,
            tokenRedeemAmounts
        );

        _processEther(
            availableEther,
            etherRedeemAmount
        );

        emit RewardsRedeemed(
            _burnAmount,
            tokenRedeemAmounts,
            etherRedeemAmount
        );

        return (
            etherRedeemAmount,
            tokenRedeemAmounts
        );
    }

    /**
    * @dev Calculates the max amount users can mint
    */
    function getAvailableMint()
        public
        view
        returns (uint256 res)
    {
        if (totalSupply > INITIAL_TOTAL_SUPPLY) {
            return 0;
        }

        res = INITIAL_TOTAL_SUPPLY
            - totalSupply;
    }

    /**
    * @dev Calculates redeem rewards for the user based on burn amount
    */
    function getUserRedeemAmounts(
        uint256 _burnAmount
    )
        public
        view
        returns (
            uint256,
            uint256[] memory,
            uint256,
            uint256[] memory
        )
    {
        (
            uint256 etherAmount,
            uint256[] memory tokenAmounts,
            uint256 availableEther,
            uint256[] memory availableTokens
        ) = adapter.getTokenAmounts();

        uint256 length = tokenAmounts.length;
        uint256[] memory tokenRedeemAmounts = new uint256[](length);

        for (uint256 i = 0; i < length; i++) {
            tokenRedeemAmounts[i] = _getRedeemAmount(
                _burnAmount,
                tokenAmounts[i],
                totalSupply
            );
        }

        uint256 etherRedeemAmount = _getRedeemAmount(
            _burnAmount,
            etherAmount,
            totalSupply
        );

        return (
            availableEther,
            availableTokens,
            etherRedeemAmount,
            tokenRedeemAmounts
        );
    }

    /**
    * @dev Calculates redeem rewards based on burn amount and total supply
    */
    function _getRedeemAmount(
        uint256 _burnAmount,
        uint256 _tokenAmount,
        uint256 _totalSupply
    )
        internal
        pure
        returns (uint256)
    {
        return _burnAmount
            * PRECISION_FACTOR
            * _tokenAmount
            / PRECISION_FACTOR
            / _totalSupply;
    }

    /**
    * @dev Pays out rewards to the user in all supported tokens
    */
    function _processTokens(
        uint256[] memory _available,
        uint256[] memory _redeemAmounts
    )
        internal
    {
        for (uint256 i = 0; i < _available.length; i++) {
            if (_redeemAmounts[i] > _available[i]) {
                _redeemAmounts[i] = _available[i] + adapter.assistWithdrawTokens(
                    i,
                    _redeemAmounts[i] - _available[i]
                );
            }

            (
                IERC20 token
                ,
                ,
                ,
            ) = adapter.tokens(
                i
            );

            token.transfer(
                msg.sender,
                _redeemAmounts[i]
            );
        }
    }

    /**
    * @dev Pays out rewards to the user in ETH currency
    */
    function _processEther(
        uint256 _available,
        uint256 _redeemAmount
    )
        internal
        returns (uint256)
    {
        if (_redeemAmount > _available) {
            _redeemAmount = _available + adapter.assistWithdrawETH(
                _redeemAmount - _available
            );
        }

        payable(msg.sender).transfer(
            _redeemAmount
        );

        return _redeemAmount;
    }

    /**
    * @dev Allows to mint TokenProfit tokens by Auction Contract
    */
    function mintSupply(
        address _mintTo,
        uint256 _mintAmount
    )
        external
        returns (bool)
    {
        require(
            msg.sender == auctionContract,
            "TokenProfit: INVALID_MINTER"
        );

        _mint(
            _mintTo,
            _mintAmount
        );

        return true;
    }

    /**
    * @dev Allows to mint exact amount of TokenProfit tokens
    * by anyone who provides enough ETH - does include fees
    */
    function buySupply(
        uint256 _desiredAmount
    )
        external
        payable
        nonReentrant
        returns (uint256)
    {
        require(
            extraMintAllowed == true,
            "TokenProfit: MINT_NOT_ALLOWED"
        );

        require(
            getAvailableMint() >= _desiredAmount,
            "TokenProfit: MINT_CAPPED"
        );

        uint256 ethRequired = adapter.getEthAmountFromTokenAmount(
            _desiredAmount,
            msg.value
        );

        require(
            ethRequired > MIN_ETH_AMOUNT,
            "TokenProfit: MINT_TOO_SMALL"
        );

        if (msg.value < ethRequired) {
            revert InvalidAmount(
                msg.value,
                ethRequired
            );
        }

        _mint(
            msg.sender,
            _desiredAmount
        );

        payable(msg.sender).transfer(
            msg.value - ethRequired
        );

        emit SupplyPurchase(
            msg.sender,
            ethRequired,
            _desiredAmount,
            adapter.buyFee()
        );

        return ethRequired;
    }

    /**
    * @dev Let governance decide for extra minting
    */
    function setAllowMint(
        bool _allow
    )
        external
        onlyGovernance
    {
        extraMintAllowed = _allow;
    }

    /**
    * @dev Allows UI to fetch mintfee more easily
    */
    function getCurrentBuyFee()
        external
        view
        returns (uint256)
    {
        return adapter.buyFee();
    }
}

File 2 of 7: Adapter.sol
// SPDX-License-Identifier: --DAO--

/**
 * @author René Hochmuth
 * @author Vitally Marinchenko
 */

pragma solidity =0.8.19;

import "./AdapterHelper.sol";

contract Adapter is AdapterHelper {

    constructor(
        address _tokenProfitAddress,
        address _uniV2RouterAddress,
        address _liquidNFTsRouterAddress,
        address _liquidNFTsWETHPool,
        address _liquidNFTsUSDCPool
    )
        AdapterDeclarations(
            _tokenProfitAddress,
            _uniV2RouterAddress,
            _liquidNFTsRouterAddress,
            _liquidNFTsWETHPool,
            _liquidNFTsUSDCPool
        )
    {
        admin = tx.origin;
        multisig = tx.origin;
    }

    /**
    * @dev Overview for services and ability to syncronize them
    */
    function syncServices()
        external
    {
        liquidNFTsUSDCPool.manualSyncPool();
        liquidNFTsWETHPool.manualSyncPool();
    }

    /**
    * @dev Allows admin to swap USDC for ETH using UniswapV2
    */
    function swapUSDCForETH(
        uint256 _amount,
        uint256 _minAmountOut
    )
        external
        onlyMultiSig
        returns (
            uint256 amountIn,
            uint256 amountOut
        )
    {
        address[] memory path = new address[](2);

        path[0] = USDC_ADDRESS;
        path[1] = WETH_ADDRESS;

        uint256[] memory amounts = _executeSwap(
            path,
            _amount,
            _minAmountOut
        );

        emit AdminSwap(
            USDC_ADDRESS,
            WETH_ADDRESS,
            amounts[0],
            amounts[1]
        );

        return (
            amounts[0],
            amounts[1]
        );
    }

    function _precisionWithFee()
        internal
        view
        returns (uint256)
    {
        return FEE_PRECISION + buyFee;
    }

    /**
    * @dev Calculates tokens to mint given exact ETH amount
    * input for the TokenProfit contract during mint
    */
    function getTokenAmountFromEthAmount(
        uint256 _ethAmount
    )
        external
        view
        returns (uint256)
    {
        return tokenProfit.totalSupply()
            * _ethAmount
            * FEE_PRECISION
            / _precisionWithFee()
            / _calculateTotalEthValue(
                0
            );
    }

    /**
    * @dev Calculates ETH amount necessary to pay to
    * receive fixed token amount from the TokenProfit contract
    */
    function getEthAmountFromTokenAmount(
        uint256 _tokenAmount,
        uint256 _msgValue
    )
        external
        view
        returns (uint256)
    {
        return _calculateTotalEthValue(
            _msgValue
        )
            * _tokenAmount
            * PRECISION_FACTOR
            * _precisionWithFee()
            / FEE_PRECISION
            / tokenProfit.totalSupply()
            / PRECISION_FACTOR;
    }

    function proposeNewMultisig(
        address _proposedMultisig
    )
        external
        onlyMultiSig
    {
        address oldProposedMultisig = proposedMultisig;
        proposedMultisig = _proposedMultisig;

        emit MultisigUpdateProposed(
            oldProposedMultisig,
            _proposedMultisig
        );
    }

    function claimMultisigOwnership()
        external
        onlyProposedMultisig
    {
        address oldMultisig = multisig;
        multisig = proposedMultisig;
        proposedMultisig = ZERO_ADDRESS;

        emit MultisigUpdate(
            oldMultisig,
            multisig
        );
    }

    /**
    * @dev Starts the process to change the admin address
    */
    function proposeNewAdmin(
        address _newProposedAdmin
    )
        external
        onlyMultiSig
    {
        address oldProposedAdmin = proposedAdmin;
        proposedAdmin = _newProposedAdmin;

        emit AdminUpdateProposed(
            oldProposedAdmin,
            _newProposedAdmin
        );
    }

   /**
    * @dev Finalize the change of the admin address
    */
    function claimAdminOwnership()
        external
        onlyProposedAdmin
    {
        address oldAdmin = admin;
        admin = proposedAdmin;
        proposedAdmin = ZERO_ADDRESS;

        emit AdminUpdate(
            oldAdmin,
            admin
        );
    }

    /**
    * @dev Ability for multisig to change the buy fee
    */
    function changeBuyFee(
        uint256 _newFeeValue
    )
        external
        onlyMultiSig
    {
        require(
            FEE_THRESHOLD > _newFeeValue,
            "Adapter: FEE_TOO_HIGH"
        );

        require(
            _newFeeValue > FEE_LOWER_BOUND,
            "Adapter: FEE_TOO_LOW"
        );

        uint256 oldValue = buyFee;
        buyFee = _newFeeValue;

        emit BuyFeeChanged(
            oldValue,
            _newFeeValue
        );
    }

    /**
    * @dev Allows multisig to swap ETH for USDC using UniswapV2
    */
    function swapETHforUSDC(
        uint256 _amount,
        uint256 _minAmountOut
    )
        external
        onlyMultiSig
        returns (
            uint256 amountIn,
            uint256 amountOut
        )
    {
        address[] memory path = new address[](2);

        path[0] = WETH_ADDRESS;
        path[1] = USDC_ADDRESS;

        uint256[] memory amounts = _executeSwapWithValue(
            path,
            _amount,
            _minAmountOut
        );

        emit AdminSwap(
            WETH_ADDRESS,
            USDC_ADDRESS,
            amounts[0],
            amounts[1]
        );

        return (
            amounts[0],
            amounts[1]
        );
    }

    /**
    * @dev Allows admin to deposit ETH into LiquidNFTs pool
    */
    function depositETHLiquidNFTs(
        uint256 _amount
    )
        external
        onlyAdmin
    {
        _wrapETH(
            _amount
        );

        _depositLiquidNFTsWrapper(
            liquidNFTsWETHPool,
            _amount
        );
    }

    /**
    * @dev Allows admin to deposit USDC into LiquidNFTs pool
    */
    function depositUSDCLiquidNFTs(
        uint256 _amount
    )
        external
        onlyAdmin
    {
        _depositLiquidNFTsWrapper(
            liquidNFTsUSDCPool,
            _amount
        );
    }

    /**
    * @dev Allows admin to withdraw USDC from LiquidNFTs pool
    */
    function withdrawUSDCLiquidNFTs(
        uint256 _amount
    )
        external
        onlyAdmin
    {
        _withdrawLiquidNFTsWrapper(
            liquidNFTsUSDCPool,
            _amount
        );
    }

    /**
    * @dev Allows admin to withdraw ETH from LiquidNFTs pool
    */
    function withdrawETHLiquidNFTs(
        uint256 _amount
    )
        external
        onlyAdmin
    {
        _withdrawLiquidNFTsWrapper(
            liquidNFTsWETHPool,
            _amount
        );

        _unwrapETH(
            WETH.balanceOf(
                TOKEN_PROFIT_ADDRESS
            )
        );
    }

    /**
    * @dev Allows TokenProfit contract to withdraw tokens from services
    */
    function assistWithdrawTokens(
        uint256 _index,
        uint256 _amount
    )
        external
        onlyTokenProfit
        returns (uint256)
    {
        if (tokens[_index].tokenERC20 == USDC) {
            return _USDCRoutine(
                _amount
            );
        }

        revert InvalidToken();
    }

    /**
    * @dev Allows TokenProfit contract to withdraw ETH from services
    */
    function assistWithdrawETH(
        uint256 _amount
    )
        external
        onlyTokenProfit
        returns (uint256)
    {
        return _WETHRoutine(
            _amount
        );
    }
}

File 3 of 7: AdapterDeclarations.sol
// SPDX-License-Identifier: --DAO--

/**
 * @author René Hochmuth
 * @author Vitally Marinchenko
 */

pragma solidity =0.8.19;

import "./AdapterInterfaces.sol";

error InvalidFeed();
error InvalidToken();
error InvalidDecimals();

contract AdapterDeclarations {

    struct TokenData {
        IERC20 tokenERC20;
        IChainLink feedLink;
        uint8 feedDecimals;
        uint8 tokenDecimals;
    }

    uint256 constant TOKENS = 1;
    TokenData[TOKENS] public tokens;

    IERC20 public immutable WETH;
    IERC20 public immutable USDC;

    address public immutable WETH_ADDRESS;
    address public immutable USDC_ADDRESS;

    address public immutable TOKEN_PROFIT_ADDRESS;
    address public immutable UNIV2_ROUTER_ADDRESS;
    address public immutable LIQUID_NFT_ROUTER_ADDRESS;

    ITokenProfit public immutable tokenProfit;
    ILiquidNFTsPool public immutable liquidNFTsWETHPool;
    ILiquidNFTsPool public immutable liquidNFTsUSDCPool;

    address public admin;
    address public multisig;
    address public proposedMultisig;
    address public proposedAdmin;

    uint256 public buyFee = 1000;

    uint256 constant public FEE_PRECISION = 1E4;
    uint256 constant public FEE_THRESHOLD = 50000;
    uint256 constant public FEE_LOWER_BOUND = 10;
    uint256 constant public PRECISION_FACTOR = 1E18;

    uint80 constant MAX_ROUND_COUNT = 50;
    address constant ZERO_ADDRESS = address(0x0);
    uint256 constant UINT256_MAX = type(uint256).max;

    mapping(address => uint256) public chainLinkHeartBeat;

    modifier onlyAdmin() {
        require(
            msg.sender == admin,
            "AdapterDeclarations: NOT_ADMIN"
        );
        _;
    }

    modifier onlyTokenProfit() {
        require(
            msg.sender == TOKEN_PROFIT_ADDRESS,
            "AdapterDeclarations: NOT_TOKEN_PROFIT"
        );
        _;
    }

    modifier onlyProposedMultisig() {
        require(
            msg.sender == proposedMultisig,
            "AdapterDeclarations: NOT_PROPOSED_MULTISIG"
        );
        _;
    }

    modifier onlyProposedAdmin() {
        require(
            msg.sender == proposedAdmin,
            "AdapterDeclarations: NOT_PROPOSED_ADMIN"
        );
        _;
    }

    modifier onlyMultiSig() {
        require(
            msg.sender == multisig,
            "AdapterDeclarations: NOT_MULTISIG"
        );
        _;
    }

    event AdminSwap(
        address indexed from,
        address indexed to,
        uint256 amountIn,
        uint256 amountOut
    );

    event BuyFeeChanged(
        uint256 indexed oldFee,
        uint256 indexed newFee
    );

    event MultisigUpdate(
        address oldMultisig,
        address newMultisig
    );

    event MultisigUpdateProposed(
        address oldProposedMultisig,
        address newProposedMultisig
    );

    event AdminUpdate(
        address oldAdmin,
        address newAdmin
    );

    event AdminUpdateProposed(
        address oldProposedAdmin,
        address newProposedAdmin
    );

    constructor(
        address _tokenProfitAddress,
        address _uniV2RouterAddress,
        address _liquidNFTsRouterAddress,
        address _liquidNFTsWETHPool,
        address _liquidNFTsUSDCPool
    ) {
        // --- liquidNFTs group ---

        liquidNFTsWETHPool = ILiquidNFTsPool(
            _liquidNFTsWETHPool
        );

        liquidNFTsUSDCPool = ILiquidNFTsPool(
            _liquidNFTsUSDCPool
        );

        LIQUID_NFT_ROUTER_ADDRESS = _liquidNFTsRouterAddress;

        // --- token group ---

        USDC_ADDRESS = liquidNFTsUSDCPool.poolToken();
        WETH_ADDRESS = liquidNFTsWETHPool.poolToken();

        USDC = IERC20(
            USDC_ADDRESS
        );

        WETH = IWETH(
            WETH_ADDRESS
        );

        IChainLink chainLinkFeed = IChainLink(
            0x986b5E1e1755e3C2440e960477f25201B0a8bbD4
        );

        tokens[0] = TokenData({
            tokenERC20: USDC,
            feedLink: chainLinkFeed,
            feedDecimals: chainLinkFeed.decimals(),
            tokenDecimals: USDC.decimals()
        });

        _validateData();

        // --- tokenProfit group ---

        tokenProfit = ITokenProfit(
            _tokenProfitAddress
        );

        TOKEN_PROFIT_ADDRESS = _tokenProfitAddress;
        UNIV2_ROUTER_ADDRESS = _uniV2RouterAddress;
    }

    function _validateData()
        private
    {
        for (uint256 i = 0; i < TOKENS; i++) {

            TokenData memory token = tokens[i];

            if (token.tokenDecimals == 0) {
                revert InvalidDecimals();
            }

            if (token.feedDecimals == 0) {
                revert InvalidDecimals();
            }

            if (token.tokenERC20 == IERC20(ZERO_ADDRESS)) {
                revert InvalidToken();
            }

            if (token.feedLink == IChainLink(ZERO_ADDRESS)) {
                revert InvalidFeed();
            }

            string memory expectedFeedName = string.concat(
                token.tokenERC20.symbol(),
                " / "
                "ETH"
            );

            string memory chainLinkFeedName = token.feedLink.description();

            require(
                keccak256(abi.encodePacked(expectedFeedName)) ==
                keccak256(abi.encodePacked(chainLinkFeedName)),
                "AdapterDeclarations: INVALID_CHAINLINK_FEED"
            );

            recalibrate(
                address(token.feedLink)
            );
        }
    }

    /**
     * @dev Determines info for the heartbeat update
     *  mechanism for chainlink oracles (roundIds)
     */
    function getLatestAggregatorRoundId(
        IChainLink _feed
    )
        public
        view
        returns (uint80)
    {
        (
            uint80 roundId,
            ,
            ,
            ,
        ) = _feed.latestRoundData();

        return uint64(roundId);
    }

    /**
     * @dev Determines number of iterations necessary during recalibrating
     * heartbeat.
     */
    function _getIterationCount(
        uint80 _latestAggregatorRoundId
    )
        internal
        pure
        returns (uint80)
    {
        return _latestAggregatorRoundId > MAX_ROUND_COUNT
            ? MAX_ROUND_COUNT
            : _latestAggregatorRoundId;
    }

    /**
     * @dev fetches timestamp of a byteshifted aggregatorRound with specific
     * phaseID. For more info see chainlink historical price data documentation
     */
    function _getRoundTimestamp(
        IChainLink _feed,
        uint16 _phaseId,
        uint80 _aggregatorRoundId
    )
        internal
        view
        returns (uint256)
    {
        (
            ,
            ,
            ,
            uint256 timestamp,
        ) = _feed.getRoundData(
            getRoundIdByByteShift(
                _phaseId,
                _aggregatorRoundId
            )
        );

        return timestamp;
    }

    /**
     * @dev Determines info for the heartbeat update mechanism for chainlink
     * oracles (shifted round Ids)
     */
    function getRoundIdByByteShift(
        uint16 _phaseId,
        uint80 _aggregatorRoundId
    )
        public
        pure
        returns (uint80)
    {
        return uint80(uint256(_phaseId) << 64 | _aggregatorRoundId);
    }

    /**
     * @dev Function to recalibrate the heartbeat for a specific feed
     */
    function recalibrate(
        address _feed
    )
        public
    {
        chainLinkHeartBeat[_feed] = recalibratePreview(
            IChainLink(_feed)
        );
    }

    /**
    * @dev View function to determine the heartbeat for a specific feed
    * Looks at the maximal last 50 rounds and takes second highest value to
    * avoid counting offline time of chainlink as valid heartbeat
    */
    function recalibratePreview(
        IChainLink _feed
    )
        public
        view
        returns (uint256)
    {
        uint80 latestAggregatorRoundId = getLatestAggregatorRoundId(
            _feed
        );

        uint80 iterationCount = _getIterationCount(
            latestAggregatorRoundId
        );

        if (iterationCount < 2) {
            revert("LiquidRouter: SMALL_SAMPLE");
        }

        uint16 phaseId = _feed.phaseId();
        uint256 latestTimestamp = _getRoundTimestamp(
            _feed,
            phaseId,
            latestAggregatorRoundId
        );

        uint256 currentDiff;
        uint256 currentBiggest;
        uint256 currentSecondBiggest;

        for (uint80 i = 1; i < iterationCount; i++) {

            uint256 currentTimestamp = _getRoundTimestamp(
                _feed,
                phaseId,
                latestAggregatorRoundId - i
            );

            currentDiff = latestTimestamp - currentTimestamp;

            latestTimestamp = currentTimestamp;

            if (currentDiff >= currentBiggest) {
                currentSecondBiggest = currentBiggest;
                currentBiggest = currentDiff;
            } else if (currentDiff > currentSecondBiggest && currentDiff < currentBiggest) {
                currentSecondBiggest = currentDiff;
            }
        }

        return currentSecondBiggest;
    }

    function setApprovals()
        external
    {
        address[2] memory spenders = [
            UNIV2_ROUTER_ADDRESS,
            LIQUID_NFT_ROUTER_ADDRESS
        ];

        for (uint256 i = 0; i < spenders.length; i++) {
            for (uint256 j = 0; j < tokens.length; j++) {
                tokenProfit.executeAdapterRequest(
                    address(tokens[j].tokenERC20),
                    abi.encodeWithSelector(
                        IERC20.approve.selector,
                        spenders[i],
                        UINT256_MAX
                    )
                );
            }
            tokenProfit.executeAdapterRequest(
                WETH_ADDRESS,
                abi.encodeWithSelector(
                    IERC20.approve.selector,
                    spenders[i],
                    UINT256_MAX
                )
            );
        }
    }
}

File 4 of 7: AdapterHelper.sol
// SPDX-License-Identifier: --DAO--

/**
 * @author René Hochmuth
 * @author Vitally Marinchenko
 */

pragma solidity =0.8.19;

import "./AdapterDeclarations.sol";

error SlippageTooBig();
error ChainLinkOffline();

abstract contract AdapterHelper is AdapterDeclarations {

    /**
    * @dev Tells TokenProfit contract to perform a swap through UniswapV2 starting with ETH
    */
    function _executeSwapWithValue(
        address[] memory _path,
        uint256 _amount,
        uint256 _minAmountOut
    )
        internal
        returns (uint256[] memory)
    {
        if (_minAmountOut == 0) {
            revert SlippageTooBig();
        }

        bytes memory callbackData = tokenProfit.executeAdapterRequestWithValue(
            UNIV2_ROUTER_ADDRESS,
            abi.encodeWithSelector(
                IUniswapV2.swapExactETHForTokens.selector,
                _minAmountOut,
                _path,
                TOKEN_PROFIT_ADDRESS,
                block.timestamp
            ),
            _amount
        );

        return abi.decode(
            callbackData,
            (
                uint256[]
            )
        );
    }

    /**
    * @dev checks if chainLink price feeds are still operating
    */
    function isChainlinkOffline()
        public
        view
        returns (bool)
    {
        for (uint256 i = 0; i < TOKENS; i++) {

            IChainLink feed = tokens[i].feedLink;

            (   ,
                ,
                ,
                uint256 upd
                ,
            ) = feed.latestRoundData();

            upd = block.timestamp > upd
                ? block.timestamp - upd
                : block.timestamp;

            if (upd > chainLinkHeartBeat[address(feed)]) return true;
        }

        return false;
    }

    /**
    * @dev Calculates ETH and token balances available for services
    * --------------------------------
    * availableEther is ETH balance of the TokenProfit contract
    * availableTokens is balances of all tokens in TokenProfit contract
    * etherAmount is availableEther + ETH deposited in other services
    * tokenAmounts is availableTokens + tokens deposited in other services
    */
    function getTokenAmounts()
        public
        view
        returns (
            uint256 etherAmount,
            uint256[] memory tokensAmounts,
            uint256 availableEther,
            uint256[] memory availableAmounts
        )
    {
        uint256[] memory tokenAmounts = new uint256[](TOKENS);
        uint256[] memory availableTokens = new uint256[](TOKENS);

        (
            availableEther,
            availableTokens
        ) = _getAvailableFunds();

        for (uint256 i = 0; i < TOKENS; i++) {
            tokenAmounts[i] = _getReservesByToken(
                tokens[i].tokenERC20
            ) + availableTokens[i];
        }

        etherAmount = _calculateAmountFromShares(
            liquidNFTsWETHPool,
            TOKEN_PROFIT_ADDRESS
        ) + availableEther;

        return (
            etherAmount,
            tokenAmounts,
            availableEther,
            availableTokens
        );
    }

    function _calculateTotalEthValue(
        uint256 _msgValue
    )
        internal
        view
        returns (uint256)
    {
        if (isChainlinkOffline() == true) {
            revert ChainLinkOffline();
        }

        (
            uint256 etherAmount,
            uint256[] memory tokensAmounts,
            ,
        ) = getTokenAmounts();

        for (uint256 i = 0; i < TOKENS; i++) {

            TokenData memory token = tokens[i];
            IChainLink feed = token.feedLink;

            uint256 latestAnswer = feed.latestAnswer();

            require(
                latestAnswer > 0,
                "AdapterHelper: CHAINLINK_OFFLINE"
            );

            etherAmount += feed.latestAnswer()
                * PRECISION_FACTOR
                * tokensAmounts[i]
                / (10 ** token.tokenDecimals)
                / (10 ** token.feedDecimals);
        }

        return etherAmount
            - _msgValue;
    }

    /**
    * @dev Tells TokenProfit contract to perform
    * a swap through UniswapV2 starting with Tokens
    */
    function _executeSwap(
        address[] memory _path,
        uint256 _amount,
        uint256 _minAmountOut
    )
        internal
        returns (uint256[] memory)
    {
        if (_minAmountOut == 0) {
            revert SlippageTooBig();
        }

        bytes memory callbackData = tokenProfit.executeAdapterRequest(
            UNIV2_ROUTER_ADDRESS,
            abi.encodeWithSelector(
                IUniswapV2.swapExactTokensForETH.selector,
                _amount,
                _minAmountOut,
                _path,
                TOKEN_PROFIT_ADDRESS,
                block.timestamp
            )
        );

        return abi.decode(
            callbackData,
            (
                uint256[]
            )
        );
    }

    /**
    * @dev Tells TokenProfit contract to convert WETH to ETH
    */
    function _unwrapETH(
        uint256 _amount
    )
        internal
    {
        tokenProfit.executeAdapterRequest(
            WETH_ADDRESS,
            abi.encodeWithSelector(
                IWETH.withdraw.selector,
                _amount
            )
        );
    }

    /**
    * @dev Tells TokenProfit contract to convert ETH to WETH
    */
    function _wrapETH(
        uint256 _amount
    )
        internal
    {
        tokenProfit.executeAdapterRequestWithValue(
            WETH_ADDRESS,
            abi.encodeWithSelector(
                IWETH.deposit.selector
            ),
            _amount
        );
    }

    /**
    * @dev Tells TokenProfit contract to deposit funds into LiquidNFTs pool
    */
    function _depositLiquidNFTsWrapper(
        ILiquidNFTsPool _pool,
        uint256 _amount
    )
        internal
    {
        tokenProfit.executeAdapterRequest(
            LIQUID_NFT_ROUTER_ADDRESS,
            abi.encodeWithSelector(
                ILiquidNFTsRouter.depositFunds.selector,
                _amount,
                _pool
            )
        );
    }

    /**
    * @dev Tells TokenProfit contract to withdraw funds from LiquidNFTs pool
    */
    function _withdrawLiquidNFTsWrapper(
        ILiquidNFTsPool _pool,
        uint256 _amount
    )
        internal
    {
        tokenProfit.executeAdapterRequest(
            LIQUID_NFT_ROUTER_ADDRESS,
            abi.encodeWithSelector(
                ILiquidNFTsRouter.withdrawFunds.selector,
                _calculateSharesFromAmount(
                    _pool,
                    _amount
                ),
                _pool
            )
        );
    }

    /**
    * @dev Routine used to deal with all services withdrawing USDC
    */
    function _USDCRoutine(
        uint256 _amount
    )
        internal
        returns (uint256)
    {
        uint256 balanceBefore = USDC.balanceOf(
            TOKEN_PROFIT_ADDRESS
        );

        _withdrawLiquidNFTsWrapper(
            liquidNFTsUSDCPool,
            _amount
        );

        uint256 balanceAfter = USDC.balanceOf(
            TOKEN_PROFIT_ADDRESS
        );

        return balanceAfter - balanceBefore;
    }

    /**
    * @dev Routine used to deal with all services withdrawing ETH
    */
    function _WETHRoutine(
        uint256 _amount
    )
        internal
        returns (uint256)
    {
        _withdrawLiquidNFTsWrapper(
            liquidNFTsWETHPool,
            _amount
        );

        uint256 balance = WETH.balanceOf(
            TOKEN_PROFIT_ADDRESS
        );

        _unwrapETH(
            balance
        );

        return balance;
    }

    /**
    * @dev Returns balances of TokenProfit contract - tokens and ETH
    */
    function _getAvailableFunds()
        internal
        view
        returns (
            uint256,
            uint256[] memory
        )
    {
        uint256[] memory availableTokens = new uint256[](TOKENS);

        for (uint256 i = 0; i < TOKENS; i++) {
            IERC20 token = tokens[i].tokenERC20;
            availableTokens[i] = token.balanceOf(
                TOKEN_PROFIT_ADDRESS
            );
        }

        uint256 availableEther = TOKEN_PROFIT_ADDRESS.balance;

        return (
            availableEther,
            availableTokens
        );
    }

    /**
    * @dev Returns balances locked in servcies based on token
    */
    function _getReservesByToken(
        IERC20 _token
    )
        internal
        view
        returns (uint256)
    {
        if (_token == USDC) {
            return _calculateAmountFromShares(
                liquidNFTsUSDCPool,
                TOKEN_PROFIT_ADDRESS
            );
        }

        return 0;
    }

    /**
    * @dev Helper function to calculate shares from amount for LiquidNFTs pool
    */
    function _calculateSharesFromAmount(
        ILiquidNFTsPool _pool,
        uint256 _amount
    )
        internal
        view
        returns (uint256)
    {
        return _amountSharesCalculationWrapper(
            _pool.totalInternalShares(),
            _pool.pseudoTotalTokensHeld(),
            _amount
        );
    }

    /**
    * @dev Helper function to calculate amount from shares for LiquidNFTs pool
    */
    function _calculateAmountFromShares(
        ILiquidNFTsPool _pool,
        address _sharesHolder
    )
        internal
        view
        returns (uint256)
    {
        return _amountSharesCalculationWrapper(
            _pool.pseudoTotalTokensHeld(),
            _pool.totalInternalShares(),
            _pool.internalShares(
                _sharesHolder
            )
        );
    }

    /**
    * @dev Calculates ratios based on shares and amount
    */
    function _amountSharesCalculationWrapper(
        uint256 _totalValue,
        uint256 _correspondingTotalValue,
        uint256 _amountValue
    )
        internal
        pure
        returns (uint256)
    {
        return _totalValue
            * _amountValue
            / _correspondingTotalValue;
    }
}

File 5 of 7: AdapterInterfaces.sol
// SPDX-License-Identifier: --DAO--

/**
 * @author René Hochmuth
 * @author Vitally Marinchenko
 */

pragma solidity =0.8.19;

import "./IERC20.sol";

interface IChainLink {

    function decimals()
        external
        view
        returns (uint8);

    function latestAnswer()
        external
        view
        returns (uint256);

    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answerdInRound
        );

    function getRoundData(
        uint80 _roundId
    )
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );

    function phaseId()
        external
        view
        returns(
            uint16 phaseId
        );

    function aggregator()
        external
        view
        returns (address);

    function description()
        external
        view
        returns (string memory);
}

interface ITokenProfit {

    function getAvailableMint()
        external
        view
        returns (uint256);

    function executeAdapterRequest(
        address _contractToCall,
        bytes memory _callBytes
    )
        external
        returns (bytes memory);

    function executeAdapterRequestWithValue(
        address _contractToCall,
        bytes memory _callBytes,
        uint256 _value
    )
        external
        returns (bytes memory);

    function totalSupply()
        external
        view
        returns (uint256);
}

interface ILiquidNFTsRouter {

    function depositFunds(
        uint256 _amount,
        address _pool
    )
        external;

    function withdrawFunds(
        uint256 _amount,
        address _pool
    )
        external;
}

interface ILiquidNFTsPool {

    function pseudoTotalTokensHeld()
        external
        view
        returns (uint256);

    function totalInternalShares()
        external
        view
        returns (uint256);

    function manualSyncPool()
        external;

    function internalShares(
        address _user
    )
        external
        view
        returns (uint256);

    function poolToken()
        external
        view
        returns (address);

    function chainLinkETH()
        external
        view
        returns (address);
}

interface IUniswapV2 {

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

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

interface IWETH is IERC20 {

    function deposit()
        payable
        external;

    function withdraw(
        uint256 _amount
    )
        external;
}

File 6 of 7: IERC20.sol
// SPDX-License-Identifier: --DAO--

/**
 * @author René Hochmuth
 * @author Vitally Marinchenko
 */

pragma solidity =0.8.19;

interface IERC20 {

    function transfer(
        address _to,
        uint256 _amount
    )
        external;

    function transferFrom(
        address _from,
        address _to,
        uint256 _amount
    )
        external;

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

    function approve(
        address _spender,
        uint256 _amount
    )
        external;

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

    function decimals()
        external
        view
        returns (uint8);

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

File 7 of 7: TokenBase.sol
// SPDX-License-Identifier: --DAO--

/**
 * @author René Hochmuth
 * @author Vitally Marinchenko
 */

pragma solidity =0.8.19;

import "./IERC20.sol";

contract TokenBase {

    string public constant name = "WISEr Token";
    string public constant symbol = "WISEr";
    uint8 public constant decimals = 18;

    address constant ZERO_ADDRESS = address(0);
    uint256 constant UINT256_MAX = type(uint256).max;

    uint256 public totalSupply;

    uint256 public constant INITIAL_TOTAL_SUPPLY = 1E27;
    uint256 public constant MIN_ETH_AMOUNT = 1E5;

    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;
    mapping(address => uint256) public nonces;

    bytes32 public immutable DOMAIN_SEPARATOR;
    bytes32 public constant PERMIT_TYPEHASH = keccak256(
        "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
    );

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 value
    );

    event Received(
        address indexed from,
        uint256 indexed amount
    );

    event SupplyPurchase(
        address indexed buyer,
        uint256 ethAmount,
        uint256 tokenAmountReceived,
        uint256 indexed appliedFee
    );

    event RewardsRedeemed(
        uint256 _burnAmount,
        uint256[] tokenRedeemAmounts,
        uint256 etherRedeemAmount
    );

    constructor() {
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                block.chainid,
                address(this)
            )
        );
    }

    function _mint(
        address _to,
        uint256 _value
    )
        internal
    {
        totalSupply =
        totalSupply + _value;

        unchecked {
            balanceOf[_to] =
            balanceOf[_to] + _value;
        }

        emit Transfer(
            ZERO_ADDRESS,
            _to,
            _value
        );
    }

    function _burn(
        address _from,
        uint256 _value
    )
        internal
    {
        unchecked {
            totalSupply =
            totalSupply - _value;
        }

        balanceOf[_from] =
        balanceOf[_from] - _value;

        emit Transfer(
            _from,
            ZERO_ADDRESS,
            _value
        );
    }

    function _approve(
        address _owner,
        address _spender,
        uint256 _value
    )
        private
    {
        allowance[_owner][_spender] = _value;

        emit Approval(
            _owner,
            _spender,
            _value
        );
    }

    function _transfer(
        address _from,
        address _to,
        uint256 _value
    )
        private
    {
        balanceOf[_from] =
        balanceOf[_from] - _value;

        unchecked {
            balanceOf[_to] =
            balanceOf[_to] + _value;
        }

        emit Transfer(
            _from,
            _to,
            _value
        );
    }

    function approve(
        address _spender,
        uint256 _value
    )
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            _spender,
            _value
        );

        return true;
    }

    function increaseAllowance(
        address _spender,
        uint256 _addedValue
    )
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            _spender,
            allowance[msg.sender][_spender] + _addedValue
        );

        return true;
    }

    function decreaseAllowance(
        address _spender,
        uint256 _subtractedValue
    )
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            _spender,
            allowance[msg.sender][_spender] - _subtractedValue
        );

        return true;
    }

    function transfer(
        address _to,
        uint256 _value
    )
        external
        returns (bool)
    {
        _transfer(
            msg.sender,
            _to,
            _value
        );

        return true;
    }

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    )
        external
        returns (bool)
    {
        if (allowance[_from][msg.sender] != UINT256_MAX) {
            allowance[_from][msg.sender] -= _value;
        }

        _transfer(
            _from,
            _to,
            _value
        );

        return true;
    }

    function permit(
        address _owner,
        address _spender,
        uint256 _value,
        uint256 _deadline,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    )
        external
    {
        require(
            _deadline >= block.timestamp,
            "TokenBase: PERMIT_CALL_EXPIRED"
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                keccak256(
                    abi.encode(
                        PERMIT_TYPEHASH,
                        _owner,
                        _spender,
                        _value,
                        nonces[_owner]++,
                        _deadline
                    )
                )
            )
        );

        if (uint256(_s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            revert("TokenBase: INVALID_SIGNATURE");
        }

        address recoveredAddress = ecrecover(
            digest,
            _v,
            _r,
            _s
        );

        require(
            recoveredAddress != ZERO_ADDRESS &&
            recoveredAddress == _owner,
            "TokenBase: INVALID_SIGNATURE"
        );

        _approve(
            _owner,
            _spender,
            _value
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_auctionContract","type":"address"},{"internalType":"address","name":"_uniV2RouterAddress","type":"address"},{"internalType":"address","name":"_liquidNFTsRouterAddress","type":"address"},{"internalType":"address","name":"_liquidNFTsWETHPool","type":"address"},{"internalType":"address","name":"_liquidNFTsUSDCPool","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ExecuteFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"Prevented","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_burnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenRedeemAmounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"etherRedeemAmount","type":"uint256"}],"name":"RewardsRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountReceived","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"appliedFee","type":"uint256"}],"name":"SupplyPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_ETH_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adapter","outputs":[{"internalType":"contract Adapter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adapterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auctionContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_desiredAmount","type":"uint256"}],"name":"buySupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdapterAddress","type":"address"}],"name":"changeAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_callBytes","type":"bytes"}],"name":"executeAdapterRequest","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_callAddress","type":"address"},{"internalType":"bytes","name":"_callBytes","type":"bytes"},{"internalType":"uint256","name":"_callValue","type":"uint256"}],"name":"executeAdapterRequestWithValue","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"extraMintAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableMint","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"}],"name":"getTotalTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnAmount","type":"uint256"}],"name":"getUserRedeemAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnAmount","type":"uint256"}],"name":"redeemRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_allow","type":"bool"}],"name":"setAllowMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b5060405162006361380380620063618339810160408190526200003491620001e6565b604080518082018252600b81526a2ba4a9a2b9102a37b5b2b760a91b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f3a0c3e98fb25f9a2e60fdd32411f2afea6666615f51366d03c642b8378b8a73f918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c001604051602081830303815290604052805190602001206080818152505030848484846040516200012190620001bb565b6001600160a01b0395861681529385166020850152918416604084015283166060830152909116608082015260a001604051809103906000f0801580156200016d573d6000803e3d6000fd5b50600480546001600160a01b039283166001600160a01b031991821681179092559690911660a052600580548716909117905550506006805490931633179092555050600260075562000256565b61407b80620022e683390190565b80516001600160a01b0381168114620001e157600080fd5b919050565b600080600080600060a08688031215620001ff57600080fd5b6200020a86620001c9565b94506200021a60208701620001c9565b93506200022a60408701620001c9565b92506200023a60608701620001c9565b91506200024a60808701620001c9565b90509295509295909350565b60805160a05161205c6200028a60003960008181610312015261131c01526000818161042a0152610e22015261205c6000f3fe6080604052600436106101f25760003560e01c80635e81078d1161010d578063b172b222116100a0578063d505accf1161006f578063d505accf14610674578063d9d62b3d14610694578063dd62ed3e146106a7578063e742806a146106df578063f52ac300146106ff57600080fd5b8063b172b222146105ef578063c04fcad81461060f578063c1e183f21461062f578063d1b06a2b1461064457600080fd5b806395d89b41116100dc57806395d89b411461055e578063a457c2d71461058f578063a9059cbb146105af578063ae0bcf2b146105cf57600080fd5b80635e81078d146104c257806370a08231146104e45780637ecebe0014610511578063933ea5581461053e57600080fd5b806330adf81f116101855780633950935111610154578063395093511461044c578063580cdcd61461046c5780635d007f86146104815780635e31a864146104a157600080fd5b806330adf81f1461038f578063313ce567146103c357806335f11cc2146103ea5780633644e5151461041857600080fd5b80630ab8afac116101c15780630ab8afac1461030057806318160ddd146103345780631faee62d1461035857806323b872dd1461036f57600080fd5b8063029ab66d1461022b57806303eadcfc1461026157806306fdde0314610299578063095ea7b3146102d057600080fd5b3661022657604051349033907f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587490600090a3005b600080fd5b34801561023757600080fd5b5061024b610246366004611a9b565b61071f565b6040516102589190611b44565b60405180910390f35b34801561026d57600080fd5b50600454610281906001600160a01b031681565b6040516001600160a01b039091168152602001610258565b3480156102a557600080fd5b5061024b6040518060400160405280600b81526020016a2ba4a9a2b9102a37b5b2b760a91b81525081565b3480156102dc57600080fd5b506102f06102eb366004611b5e565b61080c565b6040519015158152602001610258565b34801561030c57600080fd5b506102817f000000000000000000000000000000000000000000000000000000000000000081565b34801561034057600080fd5b5061034a60005481565b604051908152602001610258565b34801561036457600080fd5b5061034a620186a081565b34801561037b57600080fd5b506102f061038a366004611b8a565b610823565b34801561039b57600080fd5b5061034a7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156103cf57600080fd5b506103d8601281565b60405160ff9091168152602001610258565b3480156103f657600080fd5b5061040a610405366004611bcb565b61089d565b604051610258929190611c1f565b34801561042457600080fd5b5061034a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561045857600080fd5b506102f0610467366004611b5e565b610989565b34801561047857600080fd5b5061034a6109c5565b34801561048d57600080fd5b50600554610281906001600160a01b031681565b3480156104ad57600080fd5b506006546102f090600160a01b900460ff1681565b3480156104ce57600080fd5b506104e26104dd366004611c38565b610a01565b005b3480156104f057600080fd5b5061034a6104ff366004611c5a565b60016020526000908152604090205481565b34801561051d57600080fd5b5061034a61052c366004611c5a565b60036020526000908152604090205481565b34801561054a57600080fd5b5061034a610559366004611c86565b610a79565b34801561056a57600080fd5b5061024b604051806040016040528060058152602001642ba4a9a2b960d91b81525081565b34801561059b57600080fd5b506102f06105aa366004611b5e565b610b13565b3480156105bb57600080fd5b506102f06105ca366004611b5e565b610b4a565b3480156105db57600080fd5b506104e26105ea366004611c5a565b610b57565b3480156105fb57600080fd5b50600654610281906001600160a01b031681565b34801561061b57600080fd5b5061034a6b033b2e3c9fd0803ce800000081565b34801561063b57600080fd5b5061034a610bdd565b34801561065057600080fd5b5061066461065f366004611bcb565b610c56565b6040516102589493929190611ca3565b34801561068057600080fd5b506104e261068f366004611cdf565b610db6565b61034a6106a2366004611bcb565b611064565b3480156106b357600080fd5b5061034a6106c2366004611d50565b600260209081526000928352604080842090915290825290205481565b3480156106eb57600080fd5b506102f06106fa366004611b5e565b61130f565b34801561070b57600080fd5b5061024b61071a366004611d89565b611393565b6005546060906001600160a01b0316331461077c5760405162461bcd60e51b81526020600482015260186024820152772a37b5b2b7283937b334ba1d102727aa2fa0a220a82a22a960411b60448201526064015b60405180910390fd5b600080856001600160a01b031684866040516107989190611dd9565b60006040518083038185875af1925050503d80600081146107d5576040519150601f19603f3d011682016040523d82523d6000602084013e6107da565b606091505b5090925090508115156000036108035760405163d6bed87360e01b815260040160405180910390fd5b95945050505050565b6000610819338484611479565b5060015b92915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610888576001600160a01b038416600090815260026020908152604080832033845290915281208054849290610882908490611e0b565b90915550505b6108938484846114db565b5060019392505050565b6004805460408051634e6d7d1560e11b815290516000936060936001600160a01b031692639cdafa2a9281830192879282900301818387803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b5050505061090261155e565b60008060008061091187610c56565b93509350935093506109233388611588565b61092d838261160c565b610937848361186e565b507f5a902a6d1f9125eccbff7ebd4bbb9186a06b277d701c710db28f06e3ee13f6c087828460405161096b93929190611e1e565b60405180910390a1909450925050506109846002600755565b915091565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916108199185906109c0908690611e47565b611479565b60006b033b2e3c9fd0803ce800000060005411156109e35750600090565b6000546109fc906b033b2e3c9fd0803ce8000000611e0b565b905090565b6006546001600160a01b03163314610a5b5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204e4f545f474f5645524e414e434500000000006044820152606401610773565b60068054911515600160a01b0260ff60a01b19909216919091179055565b600480546040805163d73cc4df60e01b8152905160009384936001600160a01b03169263d73cc4df928183019286928290030181865afa158015610ac1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae99190810190611ecf565b5050915050808360ff1681518110610b0357610b03611f46565b6020026020010151915050919050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916108199185906109c0908690611e0b565b60006108193384846114db565b6006546001600160a01b03163314610bb15760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204e4f545f474f5645524e414e434500000000006044820152606401610773565b600580546001600160a01b039092166001600160a01b0319928316811790915560048054909216179055565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663470624026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fc9190611f5c565b6000606060006060600080600080600460009054906101000a90046001600160a01b03166001600160a01b031663d73cc4df6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cb7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cdf9190810190611ecf565b82519397509195509350915060008167ffffffffffffffff811115610d0657610d066119e4565b604051908082528060200260200182016040528015610d2f578160200160208202803683370190505b50905060005b82811015610d9257610d638c878381518110610d5357610d53611f46565b6020026020010151600054611936565b828281518110610d7557610d75611f46565b602090810291909101015280610d8a81611f75565b915050610d35565b506000610da28c88600054611936565b949c939b5093995097509095505050505050565b42841015610e065760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e426173653a205045524d49545f43414c4c5f4558504952454400006044820152606401610773565b6001600160a01b038716600090815260036020526040812080547f0000000000000000000000000000000000000000000000000000000000000000917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9187610e7483611f75565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610eed92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115610f785760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e426173653a20494e56414c49445f5349474e4154555245000000006044820152606401610773565b6040805160008082526020820180845284905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015610fcc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906110025750886001600160a01b0316816001600160a01b0316145b61104e5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e426173653a20494e56414c49445f5349474e4154555245000000006044820152606401610773565b611059898989611479565b505050505050505050565b600061106e61155e565b600654600160a01b900460ff1615156001146110cc5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e50726f6669743a204d494e545f4e4f545f414c4c4f5745440000006044820152606401610773565b816110d56109c5565b10156111235760405162461bcd60e51b815260206004820152601860248201527f546f6b656e50726f6669743a204d494e545f43415050454400000000000000006044820152606401610773565b60048054604051630b5c70d960e01b81529182018490523460248301526000916001600160a01b0390911690630b5c70d990604401602060405180830381865afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111999190611f5c565b9050620186a081116111ed5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204d494e545f544f4f5f534d414c4c00000000006044820152606401610773565b80341015611217576040516307c83fcf60e41b815234600482015260248101829052604401610773565b611221338461196b565b336108fc61122f8334611e0b565b6040518115909202916000818181858888f19350505050158015611257573d6000803e3d6000fd5b506004805460408051632383120160e11b815290516001600160a01b039092169263470624029282820192602092908290030181865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190611f5c565b604080518381526020810186905233917f2869e578f7b8e64810d60630268382a3c1b1add426bf45318e5258b4359e58fc910160405180910390a3905061130a6002600755565b919050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113895760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a20494e56414c49445f4d494e54455200000000006044820152606401610773565b610819838361196b565b6005546060906001600160a01b031633146113eb5760405162461bcd60e51b81526020600482015260186024820152772a37b5b2b7283937b334ba1d102727aa2fa0a220a82a22a960411b6044820152606401610773565b600080846001600160a01b0316846040516114069190611dd9565b6000604051808303816000865af19150503d8060008114611443576040519150601f19603f3d011682016040523d82523d6000602084013e611448565b606091505b5090925090508115156000036114715760405163d6bed87360e01b815260040160405180910390fd5b949350505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166000908152600160205260409020546114ff908290611e0b565b6001600160a01b0384811660008181526001602090815260408083209590955592861680825290849020805486019055925184815290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016114ce565b60016007540361158157604051631cc33edd60e11b815260040160405180910390fd5b6001600755565b6000805482900381556001600160a01b0383168152600160205260409020546115b2908290611e0b565b6001600160a01b0383166000818152600160205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116009085815260200190565b60405180910390a35050565b60005b82518110156118695782818151811061162a5761162a611f46565b602002602001015182828151811061164457611644611f46565b602002602001015111156117535760045483516001600160a01b039091169063757acf3690839086908290811061167d5761167d611f46565b602002602001015185858151811061169757611697611f46565b60200260200101516116a99190611e0b565b6040516001600160e01b031960e085901b168152600481019290925260248201526044016020604051808303816000875af11580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190611f5c565b83828151811061172257611722611f46565b60200260200101516117349190611e47565b82828151811061174657611746611f46565b6020026020010181815250505b600480546040516327b2595f60e11b81529182018390526000916001600160a01b0390911690634f64b2be90602401608060405180830381865afa15801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190611f8e565b5050509050806001600160a01b031663a9059cbb338585815181106117ea576117ea611f46565b60200260200101516040518363ffffffff1660e01b81526004016118239291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b15801561183d57600080fd5b505af1158015611851573d6000803e3d6000fd5b5050505050808061186190611f75565b91505061160f565b505050565b600082821115611901576004546001600160a01b03166307a7b8896118938585611e0b565b6040518263ffffffff1660e01b81526004016118b191815260200190565b6020604051808303816000875af11580156118d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f49190611f5c565b6118fe9084611e47565b91505b604051339083156108fc029084906000818181858888f1935050505015801561192e573d6000803e3d6000fd5b509092915050565b600081670de0b6b3a76400008461194d8288611fed565b6119579190611fed565b6119619190612004565b6114719190612004565b806000546119799190611e47565b60009081556001600160a01b038316808252600160209081526040808420805486019055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611600565b6001600160a01b03811681146119e157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611a2357611a236119e4565b604052919050565b600082601f830112611a3c57600080fd5b813567ffffffffffffffff811115611a5657611a566119e4565b611a69601f8201601f19166020016119fa565b818152846020838601011115611a7e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215611ab057600080fd5b8335611abb816119cc565b9250602084013567ffffffffffffffff811115611ad757600080fd5b611ae386828701611a2b565b925050604084013590509250925092565b60005b83811015611b0f578181015183820152602001611af7565b50506000910152565b60008151808452611b30816020860160208601611af4565b601f01601f19169290920160200192915050565b602081526000611b576020830184611b18565b9392505050565b60008060408385031215611b7157600080fd5b8235611b7c816119cc565b946020939093013593505050565b600080600060608486031215611b9f57600080fd5b8335611baa816119cc565b92506020840135611bba816119cc565b929592945050506040919091013590565b600060208284031215611bdd57600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611c1457815187529582019590820190600101611bf8565b509495945050505050565b8281526040602082015260006114716040830184611be4565b600060208284031215611c4a57600080fd5b81358015158114611b5757600080fd5b600060208284031215611c6c57600080fd5b8135611b57816119cc565b60ff811681146119e157600080fd5b600060208284031215611c9857600080fd5b8135611b5781611c77565b848152608060208201526000611cbc6080830186611be4565b8460408401528281036060840152611cd48185611be4565b979650505050505050565b600080600080600080600060e0888a031215611cfa57600080fd5b8735611d05816119cc565b96506020880135611d15816119cc565b955060408801359450606088013593506080880135611d3381611c77565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d6357600080fd5b8235611d6e816119cc565b91506020830135611d7e816119cc565b809150509250929050565b60008060408385031215611d9c57600080fd5b8235611da7816119cc565b9150602083013567ffffffffffffffff811115611dc357600080fd5b611dcf85828601611a2b565b9150509250929050565b60008251611deb818460208701611af4565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081d5761081d611df5565b838152606060208201526000611e376060830185611be4565b9050826040830152949350505050565b8082018082111561081d5761081d611df5565b600082601f830112611e6b57600080fd5b8151602067ffffffffffffffff821115611e8757611e876119e4565b8160051b611e968282016119fa565b9283528481018201928281019087851115611eb057600080fd5b83870192505b84831015611cd457825182529183019190830190611eb6565b60008060008060808587031215611ee557600080fd5b84519350602085015167ffffffffffffffff80821115611f0457600080fd5b611f1088838901611e5a565b9450604087015193506060870151915080821115611f2d57600080fd5b50611f3a87828801611e5a565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611f6e57600080fd5b5051919050565b600060018201611f8757611f87611df5565b5060010190565b60008060008060808587031215611fa457600080fd5b8451611faf816119cc565b6020860151909450611fc0816119cc565b6040860151909350611fd181611c77565b6060860151909250611fe281611c77565b939692955090935050565b808202811582820484141761081d5761081d611df5565b60008261202157634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220978cc000b826d0ac67f0b11a1a0fdda757af54541f8734ae74d610aa05c784b964736f6c634300081300336101c06040526103e86006553480156200001857600080fd5b506040516200407b3803806200407b8339810160408190526200003b9162000940565b6001600160a01b03808316610180528082166101a081905290841661014052604080516332f7ce0b60e21b8152905187928792879287928792909163cbdf382c916004808201926020929091908290030181865afa158015620000a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c89190620009b0565b6001600160a01b031660e0816001600160a01b031681525050610180516001600160a01b031663cbdf382c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000123573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001499190620009b0565b6001600160a01b0390811660c081905260e05190911660a0819052608091825260408051928301815290825273986b5e1e1755e3c2440e960477f25201b0a8bbd46020838101829052825163313ce56760e01b81528351929493840192859263313ce56792600480820193918290030181865afa158015620001cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f59190620009d5565b60ff16815260200160a0516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200023e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002649190620009d5565b60ff9081169091528151600080546001600160a01b039283166001600160a01b031990911617905560208301516001805460408601516060909601518516600160a81b0260ff60a81b1996909516600160a01b026001600160a81b031990911692909316919091179190911792909216179055620002e16200032d565b505050506001600160a01b03918216610160819052610100521661012052505060028054326001600160a01b031991821681179092556003805490911690911790555062000c78915050565b60005b60018110156200062c576000808260018110620003515762000351620009fa565b604080516080810182526002929092029290920180546001600160a01b039081168352600190910154908116602083015260ff600160a01b8204811693830193909352600160a81b900490911660608201819052909150600003620003c957604051630692acc560e51b815260040160405180910390fd5b806040015160ff16600003620003f257604051630692acc560e51b815260040160405180910390fd5b80516001600160a01b03166200041b5760405163c1ab6dc160e01b815260040160405180910390fd5b60208101516001600160a01b031662000447576040516301f86e1760e41b815260040160405180910390fd5b600081600001516001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200048c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004b6919081019062000a4c565b604051602001620004c8919062000b04565b6040516020818303038152906040529050600082602001516001600160a01b0316637284e4166040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200051e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000548919081019062000a4c565b9050806040516020016200055d919062000b30565b604051602081830303815290604052805190602001208260405160200162000586919062000b30565b6040516020818303038152906040528051906020012014620006035760405162461bcd60e51b815260206004820152602b60248201527f416461707465724465636c61726174696f6e733a20494e56414c49445f43484160448201526a125393125392d7d191515160aa1b60648201526084015b60405180910390fd5b602083015162000613906200062f565b5050508080620006239062000b64565b91505062000330565b50565b6200063a8162000656565b6001600160a01b03909116600090815260076020526040902055565b6000806200066483620007e8565b90506000620006738262000866565b90506002816001600160501b03161015620006d15760405162461bcd60e51b815260206004820152601a60248201527f4c6971756964526f757465723a20534d414c4c5f53414d504c450000000000006044820152606401620005fa565b6000846001600160a01b03166358303b106040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000738919062000b80565b90506000620007498683866200088a565b90506000808060015b866001600160501b0316816001600160501b03161015620007db576000620007878b8862000781858d62000ba6565b6200088a565b905062000795818762000bd0565b9450809550838510620007ac5784939250620007c5565b8285118015620007bb57508385105b15620007c5578492505b5080620007d28162000be6565b91505062000752565b5098975050505050505050565b600080826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156200082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000850919062000c2f565b50506001600160401b0390921695945050505050565b600060326001600160501b0383161162000881578162000884565b60325b92915050565b6000806001600160a01b038516639a6fc8f569ffff0000000000000000604087901b166001600160501b038616176040516001600160e01b031960e084901b1681526001600160501b03909116600482015260240160a060405180830381865afa158015620008fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007db919062000c2f565b80516001600160a01b03811681146200093b57600080fd5b919050565b600080600080600060a086880312156200095957600080fd5b620009648662000923565b9450620009746020870162000923565b9350620009846040870162000923565b9250620009946060870162000923565b9150620009a46080870162000923565b90509295509295909350565b600060208284031215620009c357600080fd5b620009ce8262000923565b9392505050565b600060208284031215620009e857600080fd5b815160ff81168114620009ce57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101562000a4357818101518382015260200162000a29565b50506000910152565b60006020828403121562000a5f57600080fd5b81516001600160401b038082111562000a7757600080fd5b818401915084601f83011262000a8c57600080fd5b81518181111562000aa15762000aa162000a10565b604051601f8201601f19908116603f0116810190838211818310171562000acc5762000acc62000a10565b8160405282815287602084870101111562000ae657600080fd5b62000af983602083016020880162000a26565b979650505050505050565b6000825162000b1881846020870162000a26565b650405e408aa8960d31b920191825250600601919050565b6000825162000b4481846020870162000a26565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b60006001820162000b795762000b7962000b4e565b5060010190565b60006020828403121562000b9357600080fd5b815161ffff81168114620009ce57600080fd5b6001600160501b0382811682821603908082111562000bc95762000bc962000b4e565b5092915050565b8181038181111562000884576200088462000b4e565b60006001600160501b038281166002600160501b0319810162000c0d5762000c0d62000b4e565b6001019392505050565b80516001600160501b03811681146200093b57600080fd5b600080600080600060a0868803121562000c4857600080fd5b62000c538662000c17565b9450602086015193506040860151925060608601519150620009a46080870162000c17565b60805160a05160c05160e05161010051610120516101405161016051610180516101a05161320662000e756000396000818161043901528181610865015281816114b9015281816119d7015281816122b8015261272901526000818161061901528181610a4a01528181610ec80152818161152c0152818161185b0152611b92015260008181610468015281816107550152818161101a01528181611157015281816116c901528181611ef70152818161203e015281816120f60152818161239a0152818161247001526128d501526000818161066701528181610fdb01528181611f1e015261211f01526000818161057e01528181610fb60152818161249f0152612904015260008181610361015281816106f301528181610de301528181610f040152818161187c01528181611bce01528181612219015281816122f4015281816124ca0152818161260e015281816126c00152818161274a01526129300152600081816105df015281816113240152818161138701528181611a4e0152611b2f01526000818161027e0152818161117e015281816112d0015281816113b101528181611aa201528181611b050152818161206b01526123c90152600081816104ee01528181610e22015281816122460152818161231f01526126ed0152600081816105b801528181610f300152611bf901526132066000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c806388d36be911610151578063c0f9acc5116100c3578063e0655fe511610087578063e0655fe514610689578063e63a391f1461069c578063eae07118146106a5578063ef3bedb5146106b8578063f851a440146106c0578063fc02d304146106d357600080fd5b8063c0f9acc514610601578063c65528b414610614578063ccd34cd51461063b578063d73cc4df1461064a578063dac7b7ce1461066257600080fd5b8063a1b6124811610115578063a1b6124814610553578063a637674614610566578063aaead34e14610579578063ab46b347146105a0578063ad5c4648146105b3578063bb09d9b7146105da57600080fd5b806388d36be9146104c157806389a30271146104e9578063919a75001461051057806394288264146105385780639cdafa2a1461054b57600080fd5b80634783c35b116101ea57806365a01062116101ae57806365a010621461045b57806371ffd46a14610463578063757acf361461048a578063804bff751461049d578063841d7a19146104a65780638757b15b146104b957600080fd5b80634783c35b146103a75780634f64b2be146103ba5780634f7f41ee1461040157806358774385146104215780635e27714a1461043457600080fd5b8063231bd0621161023c578063231bd0621461031e578063257e0039146103495780632dbd974c1461035c57806332f751ec14610383578063427ef62914610396578063470624021461039e57600080fd5b8063040141e51461027957806307a7b889146102bd5780630b5c70d9146102de5780631919c1fd146102f15780632049895514610306575b600080fd5b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6102d06102cb366004612a8c565b6106e6565b6040519081526020016102b4565b6102d06102ec366004612aa5565b610748565b6103046102ff366004612a8c565b610836565b005b61030e61088d565b60405190151581526020016102b4565b61033161032c366004612adc565b610996565b6040516001600160501b0390911681526020016102b4565b610304610357366004612a8c565b610a12565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6005546102a0906001600160a01b031681565b610304610a6f565b6102d060065481565b6003546102a0906001600160a01b031681565b6103cd6103c8366004612a8c565b610b49565b604080516001600160a01b03958616815294909316602085015260ff918216928401929092521660608201526080016102b4565b6102d061040f366004612adc565b60076020526000908152604090205481565b6102d061042f366004612adc565b610b8d565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b610304610d06565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6102d0610498366004612aa5565b610dd6565b6102d061c35081565b6103046104b4366004612a8c565b610e99565b610304610fa2565b6103316104cf366004612b1e565b6001600160501b031660409190911b61ffff60401b161790565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b61052361051e366004612aa5565b61127e565b604080519283526020830191909152016102b4565b610304610546366004612adc565b611492565b6103046114b7565b6004546102a0906001600160a01b031681565b610304610574366004612adc565b61159f565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6103046105ae366004612adc565b61162b565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6102d061060f366004612a8c565b6116af565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6102d0670de0b6b3a764000081565b610652611771565b6040516102b49493929190612b92565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b610304610697366004612a8c565b6118b5565b6102d061271081565b6103046106b3366004612a8c565b6119a8565b6102d0600a81565b6002546102a0906001600160a01b031681565b6105236106e1366004612aa5565b6119fc565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107395760405162461bcd60e51b815260040161073090612bce565b60405180910390fd5b61074282611b8b565b92915050565b6000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d59190612c13565b6127106107e0611c71565b670de0b6b3a7640000876107f388611c88565b6107fd9190612c42565b6108079190612c42565b6108119190612c42565b61081b9190612c59565b6108259190612c59565b61082f9190612c59565b9392505050565b6002546001600160a01b031633146108605760405162461bcd60e51b815260040161073090612c7b565b61088a7f000000000000000000000000000000000000000000000000000000000000000082611eed565b50565b6000805b600181101561098e5760008082600181106108ae576108ae612cb2565b6002020160010160009054906101000a90046001600160a01b031690506000816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561090b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092f9190612cc8565b509350505050804211610942574261094c565b61094c8142612d20565b6001600160a01b038316600090815260076020526040902054909150811115610979576001935050505090565b5050808061098690612d33565b915050610891565b506000905090565b600080826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156109d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190612cc8565b505067ffffffffffffffff90921695945050505050565b6002546001600160a01b03163314610a3c5760405162461bcd60e51b815260040161073090612c7b565b610a4581611fff565b61088a7f0000000000000000000000000000000000000000000000000000000000000000826120da565b6004546001600160a01b03163314610adc5760405162461bcd60e51b815260206004820152602a60248201527f416461707465724465636c61726174696f6e733a204e4f545f50524f504f5345604482015269445f4d554c544953494760b01b6064820152608401610730565b60038054600480546001600160a01b038082166001600160a01b0319808616821790965594909116909155604080519190921680825260208201939093527f6e1b23f37b65392903dc0c75cb46db326cf736173865d9ce52cca96a993a92e891015b60405180910390a150565b60008160018110610b5957600080fd5b6002020180546001909101546001600160a01b0391821692509081169060ff600160a01b8204811691600160a81b90041684565b600080610b9983610996565b90506000610ba682612150565b90506002816001600160501b03161015610c025760405162461bcd60e51b815260206004820152601a60248201527f4c6971756964526f757465723a20534d414c4c5f53414d504c450000000000006044820152606401610730565b6000846001600160a01b03166358303b106040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c669190612d4c565b90506000610c75868386612171565b90506000808060015b866001600160501b0316816001600160501b03161015610cf9576000610cae8b88610ca9858d612d69565b612171565b9050610cba8187612d20565b9450809550838510610ccf5784939250610ce6565b8285118015610cdd57508385105b15610ce6578492505b5080610cf181612d90565b915050610c7e565b5098975050505050505050565b6005546001600160a01b03163314610d705760405162461bcd60e51b815260206004820152602760248201527f416461707465724465636c61726174696f6e733a204e4f545f50524f504f5345604482015266222fa0a226a4a760c91b6064820152608401610730565b60028054600580546001600160a01b038082166001600160a01b0319808616821790965594909116909155604080519190921680825260208201939093527f6cf401c525bbb229f303f40902b2c97709f14c4ca45aee3365be1c04466c129a9101610b3e565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e205760405162461bcd60e51b815260040161073090612bce565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660008460018110610e5d57610e5d612cb2565b60020201546001600160a01b031603610e8057610e7982612202565b9050610742565b60405163c1ab6dc160e01b815260040160405180910390fd5b6002546001600160a01b03163314610ec35760405162461bcd60e51b815260040161073090612c7b565b610eed7f000000000000000000000000000000000000000000000000000000000000000082611eed565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015261088a917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9d9190612c13565b612398565b604080518082019091526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f000000000000000000000000000000000000000000000000000000000000000016602082015260005b600281101561127a5760005b600181101561114c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52ac3006000836001811061105a5761105a612cb2565b600290810291909101546001600160a01b03169063095ea7b360e01b9087908790811061108957611089612cb2565b60200201516040516001600160a01b039091166024820152600019604482015260640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526110f29291600401612e06565b6000604051808303816000875af1158015611111573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111399190810190612e71565b508061114481612d33565b91505061100f565b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663f52ac3007f000000000000000000000000000000000000000000000000000000000000000063095ea7b360e01b8585600281106111b7576111b7612cb2565b60200201516040516001600160a01b039091166024820152600019604482015260640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526112209291600401612e06565b6000604051808303816000875af115801561123f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112679190810190612e71565b508061127281612d33565b915050611003565b5050565b60035460009081906001600160a01b031633146112ad5760405162461bcd60e51b815260040161073090612f05565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061130257611302612cb2565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061135657611356612cb2565b60200260200101906001600160a01b031690816001600160a01b0316815250506000611383828787612449565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f04e47bde7996bb3976c4b3a96e80b6bcbe3001f75c44286c5ea634f9d22638138360008151811061140d5761140d612cb2565b60200260200101518460018151811061142857611428612cb2565b6020026020010151604051611447929190918252602082015260400190565b60405180910390a38060008151811061146257611462612cb2565b60200260200101518160018151811061147d5761147d612cb2565b60200260200101519350935050509250929050565b61149b81610b8d565b6001600160a01b03909116600090815260076020526040902055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634cfb7ab96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561151257600080fd5b505af1158015611526573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634cfb7ab96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561158557600080fd5b505af1158015611599573d6000803e3d6000fd5b50505050565b6003546001600160a01b031633146115c95760405162461bcd60e51b815260040161073090612f05565b600580546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f1c6cf03398cc53293ba2b35b0f46785933143d9386795d264dc2356b6f78581791015b60405180910390a15050565b6003546001600160a01b031633146116555760405162461bcd60e51b815260040161073090612f05565b600480546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f246a0384eab2163c3ed990a1968a95226a1e168862b57b3cb6f759a024e7dfcc910161161f565b60006116bb6000611c88565b6116c3611c71565b612710847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117499190612c13565b6117539190612c42565b61175d9190612c42565b6117679190612c59565b6107429190612c59565b6040805160018082528183019092526000916060918391839183916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090506117c76125ab565b909450905060005b6001811015611854578181815181106117ea576117ea612cb2565b602002602001015161181b6000836001811061180857611808612cb2565b60020201546001600160a01b03166126e9565b6118259190612f46565b83828151811061183757611837612cb2565b60209081029190910101528061184c81612d33565b9150506117cf565b50836118a07f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612776565b6118aa9190612f46565b969195509293509050565b6003546001600160a01b031633146118df5760405162461bcd60e51b815260040161073090612f05565b8061c350116119285760405162461bcd60e51b8152602060048201526015602482015274082c8c2e0e8cae474408c8a8abea89e9ebe90928e9605b1b6044820152606401610730565b600a811161196f5760405162461bcd60e51b8152602060048201526014602482015273416461707465723a204645455f544f4f5f4c4f5760601b6044820152606401610730565b6006805490829055604051829082907f26514ee1bed536218b4838232e0c5b32f4d71470a74865380caad452458f91e390600090a35050565b6002546001600160a01b031633146119d25760405162461bcd60e51b815260040161073090612c7b565b61088a7f0000000000000000000000000000000000000000000000000000000000000000826120da565b60035460009081906001600160a01b03163314611a2b5760405162461bcd60e51b815260040161073090612f05565b6040805160028082526060820183526000926020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611a8057611a80612cb2565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611ad457611ad4612cb2565b60200260200101906001600160a01b031690816001600160a01b0316815250506000611b018287876128ae565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f04e47bde7996bb3976c4b3a96e80b6bcbe3001f75c44286c5ea634f9d22638138360008151811061140d5761140d612cb2565b6000611bb77f000000000000000000000000000000000000000000000000000000000000000083611eed565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c669190612c13565b905061074281612398565b6000600654612710611c839190612f46565b905090565b6000611c9261088d565b1515600103611cb457604051630b4eb78560e01b815260040160405180910390fd5b600080611cbf611771565b50509150915060005b6001811015611eda576000808260018110611ce557611ce5612cb2565b604080516080810182526002929092029290920180546001600160a01b039081168352600190910154908116602080840182905260ff600160a01b8404811685870152600160a81b909304909216606084015283516350d25bcd60e01b815293519294509260009284926350d25bcd92600480820193918290030181865afa158015611d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d999190612c13565b905060008111611deb5760405162461bcd60e51b815260206004820181905260248201527f4164617074657248656c7065723a20434841494e4c494e4b5f4f46464c494e456044820152606401610730565b6040830151611dfb90600a61303d565b6060840151611e0b90600a61303d565b868681518110611e1d57611e1d612cb2565b6020026020010151670de0b6b3a7640000856001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e909190612c13565b611e9a9190612c42565b611ea49190612c42565b611eae9190612c59565b611eb89190612c59565b611ec29087612f46565b95505050508080611ed290612d33565b915050611cc8565b50611ee58483612d20565b949350505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663f52ac3007f000000000000000000000000000000000000000000000000000000000000000063744bfe6160e01b611f4f86866129aa565b60405160248101919091526001600160a01b03871660448201526064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b9092168252611fb39291600401612e06565b6000604051808303816000875af1158015611fd2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ffa9190810190612e71565b505050565b6040805160048082526024820183526020820180516001600160e01b0316630d0e30db60e41b179052915163029ab66d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263029ab66d92612093927f00000000000000000000000000000000000000000000000000000000000000009287910161304c565b6000604051808303816000875af11580156120b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261127a9190810190612e71565b604051602481018290526001600160a01b0383811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063f52ac300907f00000000000000000000000000000000000000000000000000000000000000009063f785de2360e01b90606401611f6d565b600060326001600160501b038316116121695781610742565b603292915050565b6000806001600160a01b038516639a6fc8f561ffff60401b604087901b166001600160501b038616176040516001600160e01b031960e084901b1681526001600160501b03909116600482015260240160a060405180830381865afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf99190612cc8565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b19190612c13565b90506122dd7f000000000000000000000000000000000000000000000000000000000000000084611eed565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015612368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238c9190612c13565b9050611ee58282612d20565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52ac3007f0000000000000000000000000000000000000000000000000000000000000000632e1a7d4d60e01b8460405160240161240391815260200190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526120939291600401612e06565b60608160000361246c57604051633c01925b60e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663029ab66d7f0000000000000000000000000000000000000000000000000000000000000000637ff36ab560e01b86897f0000000000000000000000000000000000000000000000000000000000000000426040516024016124fd94939291906130b9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526125459291899060040161304c565b6000604051808303816000875af1158015612564573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261258c9190810190612e71565b9050808060200190518101906125a291906130ee565b95945050505050565b60408051600180825281830190925260009160609183916020808301908036833701905050905060005b60018110156126b55760008082600181106125f2576125f2612cb2565b60020201546040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152909116915081906370a0823190602401602060405180830381865afa158015612661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126859190612c13565b83838151811061269757612697612cb2565b602090810291909101015250806126ad81612d33565b9150506125d5565b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001631939092509050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361276e576107427f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612776565b506000919050565b600061082f836001600160a01b0316630ff544db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127dd9190612c13565b846001600160a01b03166379a401c36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283f9190612c13565b60405163c8aafc8360e01b81526001600160a01b03868116600483015287169063c8aafc8390602401602060405180830381865afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a99190612c13565b612a75565b6060816000036128d157604051633c01925b60e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52ac3007f00000000000000000000000000000000000000000000000000000000000000006318cbafe560e01b87878a7f000000000000000000000000000000000000000000000000000000000000000042604051602401612964959493929190613194565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526125459291600401612e06565b600061082f836001600160a01b03166379a401c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a119190612c13565b846001600160a01b0316630ff544db6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a739190612c13565b845b600082612a828386612c42565b611ee59190612c59565b600060208284031215612a9e57600080fd5b5035919050565b60008060408385031215612ab857600080fd5b50508035926020909101359150565b6001600160a01b038116811461088a57600080fd5b600060208284031215612aee57600080fd5b813561082f81612ac7565b61ffff8116811461088a57600080fd5b6001600160501b038116811461088a57600080fd5b60008060408385031215612b3157600080fd5b8235612b3c81612af9565b91506020830135612b4c81612b09565b809150509250929050565b600081518084526020808501945080840160005b83811015612b8757815187529582019590820190600101612b6b565b509495945050505050565b848152608060208201526000612bab6080830186612b57565b8460408401528281036060840152612bc38185612b57565b979650505050505050565b60208082526025908201527f416461707465724465636c61726174696f6e733a204e4f545f544f4b454e5f506040820152641493d1925560da1b606082015260800190565b600060208284031215612c2557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761074257610742612c2c565b600082612c7657634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601e908201527f416461707465724465636c61726174696f6e733a204e4f545f41444d494e0000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600080600080600060a08688031215612ce057600080fd5b8551612ceb81612b09565b809550506020860151935060408601519250606086015191506080860151612d1281612b09565b809150509295509295909350565b8181038181111561074257610742612c2c565b600060018201612d4557612d45612c2c565b5060010190565b600060208284031215612d5e57600080fd5b815161082f81612af9565b6001600160501b03828116828216039080821115612d8957612d89612c2c565b5092915050565b60006001600160501b03808316818103612dac57612dac612c2c565b6001019392505050565b60005b83811015612dd1578181015183820152602001612db9565b50506000910152565b60008151808452612df2816020860160208601612db6565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611ee590830184612dda565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612e6957612e69612e2a565b604052919050565b600060208284031215612e8357600080fd5b815167ffffffffffffffff80821115612e9b57600080fd5b818401915084601f830112612eaf57600080fd5b815181811115612ec157612ec1612e2a565b612ed4601f8201601f1916602001612e40565b9150808252856020828501011115612eeb57600080fd5b612efc816020840160208601612db6565b50949350505050565b60208082526021908201527f416461707465724465636c61726174696f6e733a204e4f545f4d554c544953496040820152604760f81b606082015260800190565b8082018082111561074257610742612c2c565b600181815b80851115612f94578160001904821115612f7a57612f7a612c2c565b80851615612f8757918102915b93841c9390800290612f5e565b509250929050565b600082612fab57506001610742565b81612fb857506000610742565b8160018114612fce5760028114612fd857612ff4565b6001915050610742565b60ff841115612fe957612fe9612c2c565b50506001821b610742565b5060208310610133831016604e8410600b8410161715613017575081810a610742565b6130218383612f59565b806000190482111561303557613035612c2c565b029392505050565b600061082f60ff841683612f9c565b6001600160a01b038416815260606020820181905260009061307090830185612dda565b9050826040830152949350505050565b600081518084526020808501945080840160005b83811015612b875781516001600160a01b031687529582019590820190600101613094565b8481526080602082015260006130d26080830186613080565b6001600160a01b03949094166040830152506060015292915050565b6000602080838503121561310157600080fd5b825167ffffffffffffffff8082111561311957600080fd5b818501915085601f83011261312d57600080fd5b81518181111561313f5761313f612e2a565b8060051b9150613150848301612e40565b818152918301840191848101908884111561316a57600080fd5b938501935b838510156131885784518252938501939085019061316f565b98975050505050505050565b85815284602082015260a0604082015260006131b360a0830186613080565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220f29b1b285138562e9f818fe7a11fbb049dd0c266fba3fef31fcba7065a99e1ae64736f6c634300081300330000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b040000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000b4d2484ef7f91c8d4cd019460ccbc384c1c242970000000000000000000000003f302d860b27fb06c794ee0916abc1d3a362bf7e00000000000000000000000085162c81d0ef84b21230eb4bf3cab073b71f3c38

Deployed Bytecode

0x6080604052600436106101f25760003560e01c80635e81078d1161010d578063b172b222116100a0578063d505accf1161006f578063d505accf14610674578063d9d62b3d14610694578063dd62ed3e146106a7578063e742806a146106df578063f52ac300146106ff57600080fd5b8063b172b222146105ef578063c04fcad81461060f578063c1e183f21461062f578063d1b06a2b1461064457600080fd5b806395d89b41116100dc57806395d89b411461055e578063a457c2d71461058f578063a9059cbb146105af578063ae0bcf2b146105cf57600080fd5b80635e81078d146104c257806370a08231146104e45780637ecebe0014610511578063933ea5581461053e57600080fd5b806330adf81f116101855780633950935111610154578063395093511461044c578063580cdcd61461046c5780635d007f86146104815780635e31a864146104a157600080fd5b806330adf81f1461038f578063313ce567146103c357806335f11cc2146103ea5780633644e5151461041857600080fd5b80630ab8afac116101c15780630ab8afac1461030057806318160ddd146103345780631faee62d1461035857806323b872dd1461036f57600080fd5b8063029ab66d1461022b57806303eadcfc1461026157806306fdde0314610299578063095ea7b3146102d057600080fd5b3661022657604051349033907f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587490600090a3005b600080fd5b34801561023757600080fd5b5061024b610246366004611a9b565b61071f565b6040516102589190611b44565b60405180910390f35b34801561026d57600080fd5b50600454610281906001600160a01b031681565b6040516001600160a01b039091168152602001610258565b3480156102a557600080fd5b5061024b6040518060400160405280600b81526020016a2ba4a9a2b9102a37b5b2b760a91b81525081565b3480156102dc57600080fd5b506102f06102eb366004611b5e565b61080c565b6040519015158152602001610258565b34801561030c57600080fd5b506102817f0000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b0481565b34801561034057600080fd5b5061034a60005481565b604051908152602001610258565b34801561036457600080fd5b5061034a620186a081565b34801561037b57600080fd5b506102f061038a366004611b8a565b610823565b34801561039b57600080fd5b5061034a7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156103cf57600080fd5b506103d8601281565b60405160ff9091168152602001610258565b3480156103f657600080fd5b5061040a610405366004611bcb565b61089d565b604051610258929190611c1f565b34801561042457600080fd5b5061034a7feb4a2d5cbae87d6bdc736b6f960e673f1885606782cf8a12231244941345dfb081565b34801561045857600080fd5b506102f0610467366004611b5e565b610989565b34801561047857600080fd5b5061034a6109c5565b34801561048d57600080fd5b50600554610281906001600160a01b031681565b3480156104ad57600080fd5b506006546102f090600160a01b900460ff1681565b3480156104ce57600080fd5b506104e26104dd366004611c38565b610a01565b005b3480156104f057600080fd5b5061034a6104ff366004611c5a565b60016020526000908152604090205481565b34801561051d57600080fd5b5061034a61052c366004611c5a565b60036020526000908152604090205481565b34801561054a57600080fd5b5061034a610559366004611c86565b610a79565b34801561056a57600080fd5b5061024b604051806040016040528060058152602001642ba4a9a2b960d91b81525081565b34801561059b57600080fd5b506102f06105aa366004611b5e565b610b13565b3480156105bb57600080fd5b506102f06105ca366004611b5e565b610b4a565b3480156105db57600080fd5b506104e26105ea366004611c5a565b610b57565b3480156105fb57600080fd5b50600654610281906001600160a01b031681565b34801561061b57600080fd5b5061034a6b033b2e3c9fd0803ce800000081565b34801561063b57600080fd5b5061034a610bdd565b34801561065057600080fd5b5061066461065f366004611bcb565b610c56565b6040516102589493929190611ca3565b34801561068057600080fd5b506104e261068f366004611cdf565b610db6565b61034a6106a2366004611bcb565b611064565b3480156106b357600080fd5b5061034a6106c2366004611d50565b600260209081526000928352604080842090915290825290205481565b3480156106eb57600080fd5b506102f06106fa366004611b5e565b61130f565b34801561070b57600080fd5b5061024b61071a366004611d89565b611393565b6005546060906001600160a01b0316331461077c5760405162461bcd60e51b81526020600482015260186024820152772a37b5b2b7283937b334ba1d102727aa2fa0a220a82a22a960411b60448201526064015b60405180910390fd5b600080856001600160a01b031684866040516107989190611dd9565b60006040518083038185875af1925050503d80600081146107d5576040519150601f19603f3d011682016040523d82523d6000602084013e6107da565b606091505b5090925090508115156000036108035760405163d6bed87360e01b815260040160405180910390fd5b95945050505050565b6000610819338484611479565b5060015b92915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610888576001600160a01b038416600090815260026020908152604080832033845290915281208054849290610882908490611e0b565b90915550505b6108938484846114db565b5060019392505050565b6004805460408051634e6d7d1560e11b815290516000936060936001600160a01b031692639cdafa2a9281830192879282900301818387803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b5050505061090261155e565b60008060008061091187610c56565b93509350935093506109233388611588565b61092d838261160c565b610937848361186e565b507f5a902a6d1f9125eccbff7ebd4bbb9186a06b277d701c710db28f06e3ee13f6c087828460405161096b93929190611e1e565b60405180910390a1909450925050506109846002600755565b915091565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916108199185906109c0908690611e47565b611479565b60006b033b2e3c9fd0803ce800000060005411156109e35750600090565b6000546109fc906b033b2e3c9fd0803ce8000000611e0b565b905090565b6006546001600160a01b03163314610a5b5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204e4f545f474f5645524e414e434500000000006044820152606401610773565b60068054911515600160a01b0260ff60a01b19909216919091179055565b600480546040805163d73cc4df60e01b8152905160009384936001600160a01b03169263d73cc4df928183019286928290030181865afa158015610ac1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae99190810190611ecf565b5050915050808360ff1681518110610b0357610b03611f46565b6020026020010151915050919050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916108199185906109c0908690611e0b565b60006108193384846114db565b6006546001600160a01b03163314610bb15760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204e4f545f474f5645524e414e434500000000006044820152606401610773565b600580546001600160a01b039092166001600160a01b0319928316811790915560048054909216179055565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663470624026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fc9190611f5c565b6000606060006060600080600080600460009054906101000a90046001600160a01b03166001600160a01b031663d73cc4df6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cb7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cdf9190810190611ecf565b82519397509195509350915060008167ffffffffffffffff811115610d0657610d066119e4565b604051908082528060200260200182016040528015610d2f578160200160208202803683370190505b50905060005b82811015610d9257610d638c878381518110610d5357610d53611f46565b6020026020010151600054611936565b828281518110610d7557610d75611f46565b602090810291909101015280610d8a81611f75565b915050610d35565b506000610da28c88600054611936565b949c939b5093995097509095505050505050565b42841015610e065760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e426173653a205045524d49545f43414c4c5f4558504952454400006044820152606401610773565b6001600160a01b038716600090815260036020526040812080547feb4a2d5cbae87d6bdc736b6f960e673f1885606782cf8a12231244941345dfb0917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9187610e7483611f75565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610eed92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115610f785760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e426173653a20494e56414c49445f5349474e4154555245000000006044820152606401610773565b6040805160008082526020820180845284905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015610fcc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906110025750886001600160a01b0316816001600160a01b0316145b61104e5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e426173653a20494e56414c49445f5349474e4154555245000000006044820152606401610773565b611059898989611479565b505050505050505050565b600061106e61155e565b600654600160a01b900460ff1615156001146110cc5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e50726f6669743a204d494e545f4e4f545f414c4c4f5745440000006044820152606401610773565b816110d56109c5565b10156111235760405162461bcd60e51b815260206004820152601860248201527f546f6b656e50726f6669743a204d494e545f43415050454400000000000000006044820152606401610773565b60048054604051630b5c70d960e01b81529182018490523460248301526000916001600160a01b0390911690630b5c70d990604401602060405180830381865afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111999190611f5c565b9050620186a081116111ed5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204d494e545f544f4f5f534d414c4c00000000006044820152606401610773565b80341015611217576040516307c83fcf60e41b815234600482015260248101829052604401610773565b611221338461196b565b336108fc61122f8334611e0b565b6040518115909202916000818181858888f19350505050158015611257573d6000803e3d6000fd5b506004805460408051632383120160e11b815290516001600160a01b039092169263470624029282820192602092908290030181865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190611f5c565b604080518381526020810186905233917f2869e578f7b8e64810d60630268382a3c1b1add426bf45318e5258b4359e58fc910160405180910390a3905061130a6002600755565b919050565b6000336001600160a01b037f0000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b0416146113895760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a20494e56414c49445f4d494e54455200000000006044820152606401610773565b610819838361196b565b6005546060906001600160a01b031633146113eb5760405162461bcd60e51b81526020600482015260186024820152772a37b5b2b7283937b334ba1d102727aa2fa0a220a82a22a960411b6044820152606401610773565b600080846001600160a01b0316846040516114069190611dd9565b6000604051808303816000865af19150503d8060008114611443576040519150601f19603f3d011682016040523d82523d6000602084013e611448565b606091505b5090925090508115156000036114715760405163d6bed87360e01b815260040160405180910390fd5b949350505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166000908152600160205260409020546114ff908290611e0b565b6001600160a01b0384811660008181526001602090815260408083209590955592861680825290849020805486019055925184815290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016114ce565b60016007540361158157604051631cc33edd60e11b815260040160405180910390fd5b6001600755565b6000805482900381556001600160a01b0383168152600160205260409020546115b2908290611e0b565b6001600160a01b0383166000818152600160205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116009085815260200190565b60405180910390a35050565b60005b82518110156118695782818151811061162a5761162a611f46565b602002602001015182828151811061164457611644611f46565b602002602001015111156117535760045483516001600160a01b039091169063757acf3690839086908290811061167d5761167d611f46565b602002602001015185858151811061169757611697611f46565b60200260200101516116a99190611e0b565b6040516001600160e01b031960e085901b168152600481019290925260248201526044016020604051808303816000875af11580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190611f5c565b83828151811061172257611722611f46565b60200260200101516117349190611e47565b82828151811061174657611746611f46565b6020026020010181815250505b600480546040516327b2595f60e11b81529182018390526000916001600160a01b0390911690634f64b2be90602401608060405180830381865afa15801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190611f8e565b5050509050806001600160a01b031663a9059cbb338585815181106117ea576117ea611f46565b60200260200101516040518363ffffffff1660e01b81526004016118239291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b15801561183d57600080fd5b505af1158015611851573d6000803e3d6000fd5b5050505050808061186190611f75565b91505061160f565b505050565b600082821115611901576004546001600160a01b03166307a7b8896118938585611e0b565b6040518263ffffffff1660e01b81526004016118b191815260200190565b6020604051808303816000875af11580156118d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f49190611f5c565b6118fe9084611e47565b91505b604051339083156108fc029084906000818181858888f1935050505015801561192e573d6000803e3d6000fd5b509092915050565b600081670de0b6b3a76400008461194d8288611fed565b6119579190611fed565b6119619190612004565b6114719190612004565b806000546119799190611e47565b60009081556001600160a01b038316808252600160209081526040808420805486019055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611600565b6001600160a01b03811681146119e157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611a2357611a236119e4565b604052919050565b600082601f830112611a3c57600080fd5b813567ffffffffffffffff811115611a5657611a566119e4565b611a69601f8201601f19166020016119fa565b818152846020838601011115611a7e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215611ab057600080fd5b8335611abb816119cc565b9250602084013567ffffffffffffffff811115611ad757600080fd5b611ae386828701611a2b565b925050604084013590509250925092565b60005b83811015611b0f578181015183820152602001611af7565b50506000910152565b60008151808452611b30816020860160208601611af4565b601f01601f19169290920160200192915050565b602081526000611b576020830184611b18565b9392505050565b60008060408385031215611b7157600080fd5b8235611b7c816119cc565b946020939093013593505050565b600080600060608486031215611b9f57600080fd5b8335611baa816119cc565b92506020840135611bba816119cc565b929592945050506040919091013590565b600060208284031215611bdd57600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611c1457815187529582019590820190600101611bf8565b509495945050505050565b8281526040602082015260006114716040830184611be4565b600060208284031215611c4a57600080fd5b81358015158114611b5757600080fd5b600060208284031215611c6c57600080fd5b8135611b57816119cc565b60ff811681146119e157600080fd5b600060208284031215611c9857600080fd5b8135611b5781611c77565b848152608060208201526000611cbc6080830186611be4565b8460408401528281036060840152611cd48185611be4565b979650505050505050565b600080600080600080600060e0888a031215611cfa57600080fd5b8735611d05816119cc565b96506020880135611d15816119cc565b955060408801359450606088013593506080880135611d3381611c77565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d6357600080fd5b8235611d6e816119cc565b91506020830135611d7e816119cc565b809150509250929050565b60008060408385031215611d9c57600080fd5b8235611da7816119cc565b9150602083013567ffffffffffffffff811115611dc357600080fd5b611dcf85828601611a2b565b9150509250929050565b60008251611deb818460208701611af4565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081d5761081d611df5565b838152606060208201526000611e376060830185611be4565b9050826040830152949350505050565b8082018082111561081d5761081d611df5565b600082601f830112611e6b57600080fd5b8151602067ffffffffffffffff821115611e8757611e876119e4565b8160051b611e968282016119fa565b9283528481018201928281019087851115611eb057600080fd5b83870192505b84831015611cd457825182529183019190830190611eb6565b60008060008060808587031215611ee557600080fd5b84519350602085015167ffffffffffffffff80821115611f0457600080fd5b611f1088838901611e5a565b9450604087015193506060870151915080821115611f2d57600080fd5b50611f3a87828801611e5a565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611f6e57600080fd5b5051919050565b600060018201611f8757611f87611df5565b5060010190565b60008060008060808587031215611fa457600080fd5b8451611faf816119cc565b6020860151909450611fc0816119cc565b6040860151909350611fd181611c77565b6060860151909250611fe281611c77565b939692955090935050565b808202811582820484141761081d5761081d611df5565b60008261202157634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220978cc000b826d0ac67f0b11a1a0fdda757af54541f8734ae74d610aa05c784b964736f6c63430008130033

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

0000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b040000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000b4d2484ef7f91c8d4cd019460ccbc384c1c242970000000000000000000000003f302d860b27fb06c794ee0916abc1d3a362bf7e00000000000000000000000085162c81d0ef84b21230eb4bf3cab073b71f3c38

-----Decoded View---------------
Arg [0] : _auctionContract (address): 0x4a24c1989E5dFF0DE40f5804b47623b6b4300b04
Arg [1] : _uniV2RouterAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _liquidNFTsRouterAddress (address): 0xB4d2484EF7f91c8D4cd019460Ccbc384C1C24297
Arg [3] : _liquidNFTsWETHPool (address): 0x3f302D860b27FB06C794eE0916abC1D3A362Bf7e
Arg [4] : _liquidNFTsUSDCPool (address): 0x85162c81D0Ef84b21230eB4bf3cAb073B71F3c38

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b04
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000b4d2484ef7f91c8d4cd019460ccbc384c1c24297
Arg [3] : 0000000000000000000000003f302d860b27fb06c794ee0916abc1d3a362bf7e
Arg [4] : 00000000000000000000000085162c81d0ef84b21230eb4bf3cab073b71f3c38


Deployed Bytecode Sourcemap

290:9937:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1485:65;;1531:9;;1507:10;;1485:65;;;;;290:9937;;;;;2759:479;;;;;;;;;;-1:-1:-1;2759:479:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;331:22;;;;;;;;;;-1:-1:-1;331:22:6;;;;-1:-1:-1;;;;;331:22:6;;;;;;-1:-1:-1;;;;;2556:32:7;;;2538:51;;2526:2;2511:18;331:22:6;2377:218:7;179:43:5;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;179:43:5;;;;;3258:240;;;;;;;;;;-1:-1:-1;3258:240:5;;;;;:::i;:::-;;:::i;:::-;;;3309:14:7;;3302:22;3284:41;;3272:2;3257:18;3258:240:5;3144:187:7;436:40:6;;;;;;;;;;;;;;;418:26:5;;;;;;;;;;;;;;;;;;;3690:25:7;;;3678:2;3663:18;418:26:5;3544:177:7;508:44:5;;;;;;;;;;;;549:3;508:44;;4352:376;;;;;;;;;;-1:-1:-1;4352:376:5;;;;;:::i;:::-;;:::i;774:151::-;;;;;;;;;;;;816:109;774:151;;273:35;;;;;;;;;;;;306:2;273:35;;;;;4541:4:7;4529:17;;;4511:36;;4499:2;4484:18;273:35:5;4369:184:7;4002:937:6;;;;;;;;;;-1:-1:-1;4002:937:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;727:41:5:-;;;;;;;;;;;;;;;3504:294;;;;;;;;;;-1:-1:-1;3504:294:5;;;;;:::i;:::-;;:::i;5012:242:6:-;;;;;;;;;;;;;:::i;360:30::-;;;;;;;;;;-1:-1:-1;360:30:6;;;;-1:-1:-1;;;;;360:30:6;;;529:28;;;;;;;;;;-1:-1:-1;529:28:6;;;;-1:-1:-1;;;529:28:6;;;;;;9891:135;;;;;;;;;;-1:-1:-1;9891:135:6;;;;;:::i;:::-;;:::i;:::-;;559:44:5;;;;;;;;;;-1:-1:-1;559:44:5;;;;;:::i;:::-;;;;;;;;;;;;;;679:41;;;;;;;;;;-1:-1:-1;679:41:5;;;;;:::i;:::-;;;;;;;;;;;;;;3630:282:6;;;;;;;;;;-1:-1:-1;3630:282:6;;;;;:::i;:::-;;:::i;228:39:5:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;228:39:5;;;;;3804:304;;;;;;;;;;-1:-1:-1;3804:304:5;;;;;:::i;:::-;;:::i;4114:232::-;;;;;;;;;;-1:-1:-1;4114:232:5;;;;;:::i;:::-;;:::i;3304::6:-;;;;;;;;;;-1:-1:-1;3304:232:6;;;;;:::i;:::-;;:::i;396:33::-;;;;;;;;;;-1:-1:-1;396:33:6;;;;-1:-1:-1;;;;;396:33:6;;;451:51:5;;;;;;;;;;;;498:4;451:51;;10097:128:6;;;;;;;;;;;;;:::i;5346:1060::-;;;;;;;;;;-1:-1:-1;5346:1060:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;4734:1327:5:-;;;;;;;;;;-1:-1:-1;4734:1327:5;;;;;:::i;:::-;;:::i;8707:1112:6:-;;;;;;:::i;:::-;;:::i;609:64:5:-;;;;;;;;;;-1:-1:-1;609:64:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8227:338:6;;;;;;;;;;-1:-1:-1;8227:338:6;;;;;:::i;:::-;;:::i;2236:431::-;;;;;;;;;;-1:-1:-1;2236:431:6;;;;;:::i;:::-;;:::i;2759:479::-;1089:15;;2950:12;;-1:-1:-1;;;;;1089:15:6;1075:10;:29;1054:100;;;;-1:-1:-1;;;1054:100:6;;8892:2:7;1054:100:6;;;8874:21:7;8931:2;8911:18;;;8904:30;-1:-1:-1;;;8950:18:7;;;8943:54;9014:18;;1054:100:6;;;;;;;;;2992:12:::1;3018:23:::0;3054:12:::1;-1:-1:-1::0;;;;;3054:17:6::1;3079:10;3104;3054:70;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;2978:146:6;;-1:-1:-1;2978:146:6;-1:-1:-1;3139:16:6;::::1;;3150:5;3139:16:::0;3135:69:::1;;3178:15;;-1:-1:-1::0;;;3178:15:6::1;;;;;;;;;;;3135:69;3221:10:::0;2759:479;-1:-1:-1;;;;;2759:479:6:o;3258:240:5:-;3365:4;3385:84;3407:10;3431:8;3453:6;3385:8;:84::i;:::-;-1:-1:-1;3487:4:5;3258:240;;;;;:::o;4352:376::-;-1:-1:-1;;;;;4506:16:5;;4482:4;4506:16;;;:9;:16;;;;;;;;4523:10;4506:28;;;;;;;;-1:-1:-1;;4506:43:5;4502:112;;-1:-1:-1;;;;;4565:16:5;;;;;;:9;:16;;;;;;;;4582:10;4565:28;;;;;;;:38;;4597:6;;4565:16;:38;;4597:6;;4565:38;:::i;:::-;;;;-1:-1:-1;;4502:112:5;4624:75;4647:5;4666:3;4683:6;4624:9;:75::i;:::-;-1:-1:-1;4717:4:5;4352:376;;;;;:::o;4002:937:6:-;1377:7;;;:22;;;-1:-1:-1;;;1377:22:6;;;;4148:7;;4169:16;;-1:-1:-1;;;;;1377:7:6;;:20;;:22;;;;4148:7;;1377:22;;;;;4148:7;1377;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;691:20:::1;:18;:20::i;:::-;4224:22:::2;4260:32:::0;4306:25:::2;4345:35:::0;4393:55:::2;4427:11;4393:20;:55::i;:::-;4210:238;;;;;;;;4459:64;4478:10;4502:11;4459:5;:64::i;:::-;4534:85;4562:15;4591:18;4534:14;:85::i;:::-;4630:82;4657:14;4685:17;4630:13;:82::i;:::-;;4728:113;4757:11;4782:18;4814:17;4728:113;;;;;;;;:::i;:::-;;;;;;;;4873:17:::0;;-1:-1:-1;4904:18:6;-1:-1:-1;;;732:19:6::1;649:1:::0;988:6;:20;929:86;732:19:::1;4002:937:::0;;;:::o;3504:294:5:-;3668:10;3626:4;3714:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;3714:31:5;;;;;;;;;;3626:4;;3646:123;;3692:8;;3714:45;;3748:11;;3714:45;:::i;:::-;3646:8;:123::i;5012:242:6:-;5085:11;498:4:5;5116:11:6;;:34;5112:73;;;-1:-1:-1;5173:1:6;;5012:242::o;5112:73::-;5236:11;;5201:46;;498:4:5;5201:46:6;:::i;:::-;5195:52;;5012:242;:::o;9891:135::-;1249:18;;-1:-1:-1;;;;;1249:18:6;1235:10;:32;1214:106;;;;-1:-1:-1;;;1214:106:6;;10340:2:7;1214:106:6;;;10322:21:7;10379:2;10359:18;;;10352:30;10418:29;10398:18;;;10391:57;10465:18;;1214:106:6;10138:351:7;1214:106:6;9994:16:::1;:25:::0;;;::::1;;-1:-1:-1::0;;;9994:25:6::1;-1:-1:-1::0;;;;9994:25:6;;::::1;::::0;;;::::1;::::0;;9891:135::o;3630:282::-;3842:7;;;:25;;;-1:-1:-1;;;3842:25:6;;;;3734:7;;;;-1:-1:-1;;;;;3842:7:6;;:23;;:25;;;;3734:7;;3842:25;;;;;:7;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3842:25:6;;;;;;;;;;;;:::i;:::-;3757:110;;;;;3885:12;3898:6;3885:20;;;;;;;;;;:::i;:::-;;;;;;;3878:27;;;3630:282;;;:::o;3804:304:5:-;3973:10;3931:4;4019:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;4019:31:5;;;;;;;;;;3931:4;;3951:128;;3997:8;;4019:50;;4053:16;;4019:50;:::i;4114:232::-;4217:4;4237:80;4260:10;4284:3;4301:6;4237:9;:80::i;3304:232:6:-;1249:18;;-1:-1:-1;;;;;1249:18:6;1235:10;:32;1214:106;;;;-1:-1:-1;;;1214:106:6;;10340:2:7;1214:106:6;;;10322:21:7;10379:2;10359:18;;;10352:30;10418:29;10398:18;;;10391:57;10465:18;;1214:106:6;10138:351:7;1214:106:6;3423:15:::1;:36:::0;;-1:-1:-1;;;;;3423:36:6;;::::1;-1:-1:-1::0;;;;;;3423:36:6;;::::1;::::0;::::1;::::0;;;3470:7:::1;:59:::0;;;;::::1;;::::0;;3304:232::o;10097:128::-;10172:7;10202;;;;;;;;;-1:-1:-1;;;;;10202:7:6;-1:-1:-1;;;;;10202:14:6;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5346:1060::-;5469:7;5490:16;5520:7;5541:16;5596:19;5629:29;5672:22;5708:32;5753:7;;;;;;;;;-1:-1:-1;;;;;5753:7:6;-1:-1:-1;;;;;5753:23:6;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5753:25:6;;;;;;;;;;;;:::i;:::-;5806:19;;5582:196;;-1:-1:-1;5582:196:6;;-1:-1:-1;5582:196:6;-1:-1:-1;5582:196:6;-1:-1:-1;5789:14:6;5806:19;5873:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5873:21:6;;5835:59;;5910:9;5905:207;5929:6;5925:1;:10;5905:207;;;5980:121;6014:11;6043:12;6056:1;6043:15;;;;;;;;:::i;:::-;;;;;;;6076:11;;5980:16;:121::i;:::-;5956:18;5975:1;5956:21;;;;;;;;:::i;:::-;;;;;;;;;;:145;5937:3;;;;:::i;:::-;;;;5905:207;;;;6122:25;6150:101;6180:11;6205;6230;;6150:16;:101::i;:::-;6283:14;;6311:15;;-1:-1:-1;6283:14:6;;-1:-1:-1;6122:129:6;-1:-1:-1;5346:1060:6;;-1:-1:-1;;;;;;5346:1060:6:o;4734:1327:5:-;4980:15;4967:9;:28;;4946:105;;;;-1:-1:-1;;;4946:105:5;;12613:2:7;4946:105:5;;;12595:21:7;12652:2;12632:18;;;12625:30;12691:32;12671:18;;;12664:60;12741:18;;4946:105:5;12411:354:7;4946:105:5;-1:-1:-1;;;;;5404:14:5;;5062;5404;;;:6;:14;;;;;:16;;5164;;816:109;;5306:6;;5338:8;;5372:6;;5062:14;5404:16;;;:::i;:::-;;;;-1:-1:-1;5229:248:5;;;;;;13057:25:7;;;;-1:-1:-1;;;;;13156:15:7;;;13136:18;;;13129:43;13208:15;;;;13188:18;;;13181:43;13240:18;;;13233:34;13283:19;;;13276:35;13327:19;;;13320:35;;;13029:19;;5229:248:5;;;;;;;;;;;;5198:297;;;;;;5102:407;;;;;;;;-1:-1:-1;;;13624:27:7;;13676:1;13667:11;;13660:27;;;;13712:2;13703:12;;13696:28;13749:2;13740:12;;13366:392;5102:407:5;;;;;;;;;;;;;5079:440;;;;;;5062:457;;5548:66;5542:2;5534:11;;:80;5530:149;;;5630:38;;-1:-1:-1;;;5630:38:5;;13965:2:7;5630:38:5;;;13947:21:7;14004:2;13984:18;;;13977:30;14043;14023:18;;;14016:58;14091:18;;5630:38:5;13763:352:7;5530:149:5;5716:87;;;5689:24;5716:87;;;;;;;;;14347:25:7;;;14420:4;14408:17;;14388:18;;;14381:45;;;;14442:18;;;14435:34;;;14485:18;;;14478:34;;;5716:87:5;;14319:19:7;;5716:87:5;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5716:87:5;;-1:-1:-1;;5716:87:5;;;-1:-1:-1;;;;;;;5835:32:5;;;;;;:74;;;5903:6;-1:-1:-1;;;;;5883:26:5;:16;-1:-1:-1;;;;;5883:26:5;;5835:74;5814:149;;;;-1:-1:-1;;;5814:149:5;;13965:2:7;5814:149:5;;;13947:21:7;14004:2;13984:18;;;13977:30;14043;14023:18;;;14016:58;14091:18;;5814:149:5;13763:352:7;5814:149:5;5974:80;5996:6;6016:8;6038:6;5974:8;:80::i;:::-;4936:1125;;4734:1327;;;;;;;:::o;8707:1112:6:-;8835:7;691:20;:18;:20::i;:::-;8879:16:::1;::::0;-1:-1:-1;;;8879:16:6;::::1;;;:24;;8899:4;8879:24;8858:100;;;::::0;-1:-1:-1;;;8858:100:6;;14725:2:7;8858:100:6::1;::::0;::::1;14707:21:7::0;14764:2;14744:18;;;14737:30;14803:31;14783:18;;;14776:59;14852:18;;8858:100:6::1;14523:353:7::0;8858:100:6::1;9012:14;8990:18;:16;:18::i;:::-;:36;;8969:107;;;::::0;-1:-1:-1;;;8969:107:6;;15083:2:7;8969:107:6::1;::::0;::::1;15065:21:7::0;15122:2;15102:18;;;15095:30;15161:26;15141:18;;;15134:54;15205:18;;8969:107:6::1;14881:348:7::0;8969:107:6::1;9109:7;::::0;;:96:::1;::::0;-1:-1:-1;;;9109:96:6;;;;::::1;15408:25:7::0;;;9186:9:6::1;15449:18:7::0;;;15442:34;9087:19:6::1;::::0;-1:-1:-1;;;;;9109:7:6;;::::1;::::0;:35:::1;::::0;15381:18:7;;9109:96:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9087:118;;549:3:5;9237:11:6;:28;9216:102;;;::::0;-1:-1:-1;;;9216:102:6;;15689:2:7;9216:102:6::1;::::0;::::1;15671:21:7::0;15728:2;15708:18;;;15701:30;15767:29;15747:18;;;15740:57;15814:18;;9216:102:6::1;15487:351:7::0;9216:102:6::1;9345:11;9333:9;:23;9329:144;;;9379:83;::::0;-1:-1:-1;;;9379:83:6;;9410:9:::1;9379:83;::::0;::::1;15408:25:7::0;15449:18;;;15442:34;;;15381:18;;9379:83:6::1;15234:248:7::0;9329:144:6::1;9483:67;9502:10;9526:14;9483:5;:67::i;:::-;9569:10;9561:75;9603:23;9615:11:::0;9603:9:::1;:23;:::i;:::-;9561:75;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;9757:7:6::1;::::0;;:16:::1;::::0;;-1:-1:-1;;;9757:16:6;;;;-1:-1:-1;;;;;9757:7:6;;::::1;::::0;:14:::1;::::0;:16;;::::1;::::0;::::1;::::0;;;;;;;:7;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9652:131;::::0;;15408:25:7;;;15464:2;15449:18;;15442:34;;;9680:10:6::1;::::0;9652:131:::1;::::0;15381:18:7;9652:131:6::1;;;;;;;9801:11:::0;-1:-1:-1;732:19:6;649:1;988:6;:20;929:86;732:19;8707:1112;;;:::o;8227:338::-;8341:4;8382:10;-1:-1:-1;;;;;8396:15:6;8382:29;;8361:103;;;;-1:-1:-1;;;8361:103:6;;16045:2:7;8361:103:6;;;16027:21:7;16084:2;16064:18;;;16057:30;16123:29;16103:18;;;16096:57;16170:18;;8361:103:6;15843:351:7;8361:103:6;8475:61;8494:7;8515:11;8475:5;:61::i;2236:431::-;1089:15;;2394:12;;-1:-1:-1;;;;;1089:15:6;1075:10;:29;1054:100;;;;-1:-1:-1;;;1054:100:6;;8892:2:7;1054:100:6;;;8874:21:7;8931:2;8911:18;;;8904:30;-1:-1:-1;;;8950:18:7;;;8943:54;9014:18;;1054:100:6;8690:348:7;1054:100:6;2436:12:::1;2462:23:::0;2498:16:::1;-1:-1:-1::0;;;;;2498:21:6::1;2533:10;2498:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;2422:131:6;;-1:-1:-1;2422:131:6;-1:-1:-1;2568:16:6;::::1;;2579:5;2568:16:::0;2564:69:::1;;2607:15;;-1:-1:-1::0;;;2607:15:6::1;;;;;;;;;;;2564:69;2650:10:::0;2236:431;-1:-1:-1;;;;2236:431:6:o;2610:267:5:-;-1:-1:-1;;;;;2738:17:5;;;;;;;:9;:17;;;;;;;;:27;;;;;;;;;;;;;:36;;;2790:80;;3690:25:7;;;2790:80:5;;3663:18:7;2790:80:5;;;;;;;;2610:267;;;:::o;2883:369::-;-1:-1:-1;;;;;3033:16:5;;;;;;:9;:16;;;;;;:25;;3052:6;;3033:25;:::i;:::-;-1:-1:-1;;;;;3006:16:5;;;;;;;:9;:16;;;;;;;;:52;;;;3122:14;;;;;;;;;;;;:23;;3093:52;;3171:74;;3690:25:7;;;3006:16:5;;3171:74;;3663:18:7;3171:74:5;3544:177:7;764:159:6;611:1;828:6;;:17;824:66;;868:11;;-1:-1:-1;;;868:11:6;;;;;;;;;;;824:66;611:1;900:6;:16;764:159::o;2256:348:5:-;2405:11;;;:20;;;2379:46;;-1:-1:-1;;;;;2473:16:5;;;;-1:-1:-1;2473:16:5;;;;;;:25;;2419:6;;2473:25;:::i;:::-;-1:-1:-1;;;;;2446:16:5;;;;;;:9;:16;;;;;;:52;;;;2514:83;;;;;;2581:6;3690:25:7;;3678:2;3663:18;;3544:177;2514:83:5;;;;;;;;2256:348;;:::o;6919:718:6:-;7063:9;7058:573;7082:10;:17;7078:1;:21;7058:573;;;7144:10;7155:1;7144:13;;;;;;;;:::i;:::-;;;;;;;7124:14;7139:1;7124:17;;;;;;;;:::i;:::-;;;;;;;:33;7120:232;;;7213:7;;7306:13;;-1:-1:-1;;;;;7213:7:6;;;;:28;;7263:1;;7306:10;;7263:1;;7306:13;;;;;;:::i;:::-;;;;;;;7286:14;7301:1;7286:17;;;;;;;;:::i;:::-;;;;;;;:33;;;;:::i;:::-;7213:124;;-1:-1:-1;;;;;;7213:124:6;;;;;;;;;;15408:25:7;;;;15449:18;;;15442:34;15381:18;;7213:124:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7197:10;7208:1;7197:13;;;;;;;;:::i;:::-;;;;;;;:140;;;;:::i;:::-;7177:14;7192:1;7177:17;;;;;;;;:::i;:::-;;;;;;:160;;;;;7120:232;7467:7;;;:47;;-1:-1:-1;;;7467:47:6;;;;;3690:25:7;;;7384:12:6;;-1:-1:-1;;;;;7467:7:6;;;;:14;;3663:18:7;;7467:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7366:148;;;;;7529:5;-1:-1:-1;;;;;7529:14:6;;7561:10;7589:14;7604:1;7589:17;;;;;;;;:::i;:::-;;;;;;;7529:91;;;;;;;;;;;;;;;-1:-1:-1;;;;;17076:32:7;;;;17058:51;;17140:2;17125:18;;17118:34;17046:2;17031:18;;16884:274;7529:91:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7106:525;7101:3;;;;;:::i;:::-;;;;7058:573;;;;6919:718;;:::o;7714:427::-;7836:7;7879:10;7863:13;:26;7859:169;;;7934:7;;-1:-1:-1;;;;;7934:7:6;:25;7977:26;7993:10;7977:13;:26;:::i;:::-;7934:83;;;;;;;;;;;;;3690:25:7;;3678:2;3663:18;;3544:177;7934:83:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7921:96;;:10;:96;:::i;:::-;7905:112;;7859:169;8038:65;;8046:10;;8038:65;;;;;8080:13;;8038:65;;;;8080:13;8046:10;8038:65;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8121:13:6;;7714:427;-1:-1:-1;;7714:427:6:o;6502:332::-;6670:7;6815:12;518:4;6757:12;6700:42;518:4;6700:11;:42;:::i;:::-;:69;;;;:::i;:::-;:100;;;;:::i;:::-;:127;;;;:::i;1910:340:5:-;2043:6;2029:11;;:20;;;;:::i;:::-;2007:11;:42;;;-1:-1:-1;;;;;2113:14:5;;;;;:9;:14;;;;;;;;;;:23;;2084:52;;2162:81;3690:25:7;;;2113:14:5;;2007:11;2162:81;;3663:18:7;2162:81:5;3544:177:7;14:131;-1:-1:-1;;;;;89:31:7;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:127::-;211:10;206:3;202:20;199:1;192:31;242:4;239:1;232:15;266:4;263:1;256:15;282:275;353:2;347:9;418:2;399:13;;-1:-1:-1;;395:27:7;383:40;;453:18;438:34;;474:22;;;435:62;432:88;;;500:18;;:::i;:::-;536:2;529:22;282:275;;-1:-1:-1;282:275:7:o;562:530::-;604:5;657:3;650:4;642:6;638:17;634:27;624:55;;675:1;672;665:12;624:55;711:6;698:20;737:18;733:2;730:26;727:52;;;759:18;;:::i;:::-;803:55;846:2;827:13;;-1:-1:-1;;823:27:7;852:4;819:38;803:55;:::i;:::-;883:2;874:7;867:19;929:3;922:4;917:2;909:6;905:15;901:26;898:35;895:55;;;946:1;943;936:12;895:55;1011:2;1004:4;996:6;992:17;985:4;976:7;972:18;959:55;1059:1;1034:16;;;1052:4;1030:27;1023:38;;;;1038:7;562:530;-1:-1:-1;;;562:530:7:o;1097:523::-;1183:6;1191;1199;1252:2;1240:9;1231:7;1227:23;1223:32;1220:52;;;1268:1;1265;1258:12;1220:52;1307:9;1294:23;1326:31;1351:5;1326:31;:::i;:::-;1376:5;-1:-1:-1;1432:2:7;1417:18;;1404:32;1459:18;1448:30;;1445:50;;;1491:1;1488;1481:12;1445:50;1514:49;1555:7;1546:6;1535:9;1531:22;1514:49;:::i;:::-;1504:59;;;1610:2;1599:9;1595:18;1582:32;1572:42;;1097:523;;;;;:::o;1625:250::-;1710:1;1720:113;1734:6;1731:1;1728:13;1720:113;;;1810:11;;;1804:18;1791:11;;;1784:39;1756:2;1749:10;1720:113;;;-1:-1:-1;;1867:1:7;1849:16;;1842:27;1625:250::o;1880:270::-;1921:3;1959:5;1953:12;1986:6;1981:3;1974:19;2002:76;2071:6;2064:4;2059:3;2055:14;2048:4;2041:5;2037:16;2002:76;:::i;:::-;2132:2;2111:15;-1:-1:-1;;2107:29:7;2098:39;;;;2139:4;2094:50;;1880:270;-1:-1:-1;;1880:270:7:o;2155:217::-;2302:2;2291:9;2284:21;2265:4;2322:44;2362:2;2351:9;2347:18;2339:6;2322:44;:::i;:::-;2314:52;2155:217;-1:-1:-1;;;2155:217:7:o;2824:315::-;2892:6;2900;2953:2;2941:9;2932:7;2928:23;2924:32;2921:52;;;2969:1;2966;2959:12;2921:52;3008:9;2995:23;3027:31;3052:5;3027:31;:::i;:::-;3077:5;3129:2;3114:18;;;;3101:32;;-1:-1:-1;;;2824:315:7:o;3726:456::-;3803:6;3811;3819;3872:2;3860:9;3851:7;3847:23;3843:32;3840:52;;;3888:1;3885;3878:12;3840:52;3927:9;3914:23;3946:31;3971:5;3946:31;:::i;:::-;3996:5;-1:-1:-1;4053:2:7;4038:18;;4025:32;4066:33;4025:32;4066:33;:::i;:::-;3726:456;;4118:7;;-1:-1:-1;;;4172:2:7;4157:18;;;;4144:32;;3726:456::o;4558:180::-;4617:6;4670:2;4658:9;4649:7;4645:23;4641:32;4638:52;;;4686:1;4683;4676:12;4638:52;-1:-1:-1;4709:23:7;;4558:180;-1:-1:-1;4558:180:7:o;4743:435::-;4796:3;4834:5;4828:12;4861:6;4856:3;4849:19;4887:4;4916:2;4911:3;4907:12;4900:19;;4953:2;4946:5;4942:14;4974:1;4984:169;4998:6;4995:1;4992:13;4984:169;;;5059:13;;5047:26;;5093:12;;;;5128:15;;;;5020:1;5013:9;4984:169;;;-1:-1:-1;5169:3:7;;4743:435;-1:-1:-1;;;;;4743:435:7:o;5183:332::-;5390:6;5379:9;5372:25;5433:2;5428;5417:9;5413:18;5406:30;5353:4;5453:56;5505:2;5494:9;5490:18;5482:6;5453:56;:::i;5520:273::-;5576:6;5629:2;5617:9;5608:7;5604:23;5600:32;5597:52;;;5645:1;5642;5635:12;5597:52;5684:9;5671:23;5737:5;5730:13;5723:21;5716:5;5713:32;5703:60;;5759:1;5756;5749:12;5798:247;5857:6;5910:2;5898:9;5889:7;5885:23;5881:32;5878:52;;;5926:1;5923;5916:12;5878:52;5965:9;5952:23;5984:31;6009:5;5984:31;:::i;6050:114::-;6134:4;6127:5;6123:16;6116:5;6113:27;6103:55;;6154:1;6151;6144:12;6169:243;6226:6;6279:2;6267:9;6258:7;6254:23;6250:32;6247:52;;;6295:1;6292;6285:12;6247:52;6334:9;6321:23;6353:29;6376:5;6353:29;:::i;6417:609::-;6730:6;6719:9;6712:25;6773:3;6768:2;6757:9;6753:18;6746:31;6693:4;6800:57;6852:3;6841:9;6837:19;6829:6;6800:57;:::i;:::-;6893:6;6888:2;6877:9;6873:18;6866:34;6948:9;6940:6;6936:22;6931:2;6920:9;6916:18;6909:50;6976:44;7013:6;7005;6976:44;:::i;:::-;6968:52;6417:609;-1:-1:-1;;;;;;;6417:609:7:o;7031:801::-;7142:6;7150;7158;7166;7174;7182;7190;7243:3;7231:9;7222:7;7218:23;7214:33;7211:53;;;7260:1;7257;7250:12;7211:53;7299:9;7286:23;7318:31;7343:5;7318:31;:::i;:::-;7368:5;-1:-1:-1;7425:2:7;7410:18;;7397:32;7438:33;7397:32;7438:33;:::i;:::-;7490:7;-1:-1:-1;7544:2:7;7529:18;;7516:32;;-1:-1:-1;7595:2:7;7580:18;;7567:32;;-1:-1:-1;7651:3:7;7636:19;;7623:33;7665:31;7623:33;7665:31;:::i;:::-;7031:801;;;;-1:-1:-1;7031:801:7;;;;7715:7;7769:3;7754:19;;7741:33;;-1:-1:-1;7821:3:7;7806:19;;;7793:33;;7031:801;-1:-1:-1;;7031:801:7:o;7837:388::-;7905:6;7913;7966:2;7954:9;7945:7;7941:23;7937:32;7934:52;;;7982:1;7979;7972:12;7934:52;8021:9;8008:23;8040:31;8065:5;8040:31;:::i;:::-;8090:5;-1:-1:-1;8147:2:7;8132:18;;8119:32;8160:33;8119:32;8160:33;:::i;:::-;8212:7;8202:17;;;7837:388;;;;;:::o;8230:455::-;8307:6;8315;8368:2;8356:9;8347:7;8343:23;8339:32;8336:52;;;8384:1;8381;8374:12;8336:52;8423:9;8410:23;8442:31;8467:5;8442:31;:::i;:::-;8492:5;-1:-1:-1;8548:2:7;8533:18;;8520:32;8575:18;8564:30;;8561:50;;;8607:1;8604;8597:12;8561:50;8630:49;8671:7;8662:6;8651:9;8647:22;8630:49;:::i;:::-;8620:59;;;8230:455;;;;;:::o;9043:287::-;9172:3;9210:6;9204:13;9226:66;9285:6;9280:3;9273:4;9265:6;9261:17;9226:66;:::i;:::-;9308:16;;;;;9043:287;-1:-1:-1;;9043:287:7:o;9335:127::-;9396:10;9391:3;9387:20;9384:1;9377:31;9427:4;9424:1;9417:15;9451:4;9448:1;9441:15;9467:128;9534:9;;;9555:11;;;9552:37;;;9569:18;;:::i;9600:403::-;9835:6;9824:9;9817:25;9878:2;9873;9862:9;9858:18;9851:30;9798:4;9898:56;9950:2;9939:9;9935:18;9927:6;9898:56;:::i;:::-;9890:64;;9990:6;9985:2;9974:9;9970:18;9963:34;9600:403;;;;;;:::o;10008:125::-;10073:9;;;10094:10;;;10091:36;;;10107:18;;:::i;10494:709::-;10559:5;10612:3;10605:4;10597:6;10593:17;10589:27;10579:55;;10630:1;10627;10620:12;10579:55;10659:6;10653:13;10685:4;10708:18;10704:2;10701:26;10698:52;;;10730:18;;:::i;:::-;10776:2;10773:1;10769:10;10799:28;10823:2;10819;10815:11;10799:28;:::i;:::-;10861:15;;;10931;;;10927:24;;;10892:12;;;;10963:15;;;10960:35;;;10991:1;10988;10981:12;10960:35;11027:2;11019:6;11015:15;11004:26;;11039:135;11055:6;11050:3;11047:15;11039:135;;;11121:10;;11109:23;;11072:12;;;;11152;;;;11039:135;;11208:737;11355:6;11363;11371;11379;11432:3;11420:9;11411:7;11407:23;11403:33;11400:53;;;11449:1;11446;11439:12;11400:53;11478:9;11472:16;11462:26;;11532:2;11521:9;11517:18;11511:25;11555:18;11596:2;11588:6;11585:14;11582:34;;;11612:1;11609;11602:12;11582:34;11635:72;11699:7;11690:6;11679:9;11675:22;11635:72;:::i;:::-;11625:82;;11747:2;11736:9;11732:18;11726:25;11716:35;;11797:2;11786:9;11782:18;11776:25;11760:41;;11826:2;11816:8;11813:16;11810:36;;;11842:1;11839;11832:12;11810:36;;11865:74;11931:7;11920:8;11909:9;11905:24;11865:74;:::i;:::-;11855:84;;;11208:737;;;;;;;:::o;11950:127::-;12011:10;12006:3;12002:20;11999:1;11992:31;12042:4;12039:1;12032:15;12066:4;12063:1;12056:15;12082:184;12152:6;12205:2;12193:9;12184:7;12180:23;12176:32;12173:52;;;12221:1;12218;12211:12;12173:52;-1:-1:-1;12244:16:7;;12082:184;-1:-1:-1;12082:184:7:o;12271:135::-;12310:3;12331:17;;;12328:43;;12351:18;;:::i;:::-;-1:-1:-1;12398:1:7;12387:13;;12271:135::o;16199:680::-;16326:6;16334;16342;16350;16403:3;16391:9;16382:7;16378:23;16374:33;16371:53;;;16420:1;16417;16410:12;16371:53;16452:9;16446:16;16471:31;16496:5;16471:31;:::i;:::-;16571:2;16556:18;;16550:25;16521:5;;-1:-1:-1;16584:33:7;16550:25;16584:33;:::i;:::-;16688:2;16673:18;;16667:25;16636:7;;-1:-1:-1;16701:31:7;16667:25;16701:31;:::i;:::-;16803:2;16788:18;;16782:25;16751:7;;-1:-1:-1;16816:31:7;16782:25;16816:31;:::i;:::-;16199:680;;;;-1:-1:-1;16199:680:7;;-1:-1:-1;;16199:680:7:o;17163:168::-;17236:9;;;17267;;17284:15;;;17278:22;;17264:37;17254:71;;17305:18;;:::i;17336:217::-;17376:1;17402;17392:132;;17446:10;17441:3;17437:20;17434:1;17427:31;17481:4;17478:1;17471:15;17509:4;17506:1;17499:15;17392:132;-1:-1:-1;17538:9:7;;17336:217::o

Swarm Source

ipfs://f29b1b285138562e9f818fe7a11fbb049dd0c266fba3fef31fcba7065a99e1ae

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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