ETH Price: $2,531.51 (+3.70%)

Token

WISEr Token (WISEr)
 

Overview

Max Total Supply

643,865,323.16183545247845869 WISEr

Holders

146

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.435539958597223813 WISEr

Value
$0.00
0x6928eabfeea1c9549f36b65dad138484b1cbc274
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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 7 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 1 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 2 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 3 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 4 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 5 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 6 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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.