pragma solidity ^0.8.0;









interface IERC20Extend {
    function decimals() external view returns (uint8);
}

contract Factory is Context, ReentrancyGuard, Ownable {
    using SafeERC20 for IERC20;
    using EnumerableSet for EnumerableSet.AddressSet;

    event LPLocked(
        uint256 id,
        address token,
        uint256 amount,
        uint256 lockUpTime,
        address lockOwner
    );

    event PairDeployed(
        uint256 indexed pairID,
        address indexed token,
        uint256 initialLiquidity,
        uint256 tokensAmount,
        uint256 lpLockingPeriod,
        string logo,
        string website,
        string community
    );

    event TreasuryClaimed(
        address indexed user,
        uint256 pairID,
        address indexed pairToken,
        uint256 amountClaimed,
        uint256 distributionIndex
    );

    address public uniswapRouter;

    address public constant deadAddr =
        0x000000000000000000000000000000000000dEaD;

    address public devWallet;

    address public lockAddress;

    address public supToken;

    uint256 public supWhitelistFee;

    uint256 public supTreasuryRequirement;

    uint256 public treasuryFee = 250;

    uint256 public maxTreasuryReceivers = 50;

    uint256 public totalPairs = 1;

    uint256 public totalInitialLiquidity;

    uint256 public totalDistributionsEthValue;

    uint256 public bountyAmnt = 500_000 * 1e8;

    uint256 public maxBountyReceivers = 200;

    struct ScamProjects {
        address bountyReceiver;
        string comment;
    }

    mapping(uint256 => bool) private _scamTokens;
    mapping(uint256 => ScamProjects) private _scamTokensInfo;

    struct Pairs {
        address token;
        uint256 initialLiquidity;
        uint256 tokensAmount;
        uint256 distributionPerSupWallet;
        uint256 distributionIndex;
        uint256 lpLockingPeriod;
        uint256 lockID;
        uint256 launchDate;
        string logo;
        string website;
        string community;
    }

    mapping(uint256 => Pairs) private _pairs;
    mapping(address => uint256) private _pairIds;
    mapping(uint256 => bool) private _treasuryNotClaimablePairs; // pairID => bool
    mapping(uint256 => bool) private _verifiedTokens;
    mapping(address => mapping(uint256 => uint256)) private _claimedBalances; // pairID => _claimedBalances

    mapping(address => bool) private _whitelistedWallets;

    constructor(address _locker) {
        lockAddress = _locker;
        devWallet = msg.sender;

        supTreasuryRequirement = 15000 * 1e8;

        _whitelistedWallets[msg.sender] = true;

        if (block.chainid == 56) {
            uniswapRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        } else if (block.chainid == 97) {
            uniswapRouter = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1;
        } else if (
            block.chainid == 1 ||
            block.chainid == 4 ||
            block.chainid == 3 ||
            block.chainid == 5
        ) {
            uniswapRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
            //Ropstein DAI 0xaD6D458402F60fD3Bd25163575031ACDce07538D
        } else if (block.chainid == 43114) {
            uniswapRouter = 0x60aE616a2155Ee3d9A68541Ba4544862310933d4;
        } else if (block.chainid == 250) {
            uniswapRouter = 0x31F63A33141fFee63D4B26755430a390ACdD8a4d;
        } else if (block.chainid == 42161) {
            uniswapRouter = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;
        } else if (block.chainid == 80001) {
            uniswapRouter = 0x8954AfA98594b838bda56FE4C12a09D7739D179b;
        } else {
            revert();
        }
    }

    function setSupToken(address _newSupToken) public onlyOwner {
        require(_newSupToken != address(0), "Invalid address");
        supToken = _newSupToken;
    }

    function setSupTreasuryRequirement(
        uint256 _newRequirement
    ) external onlyOwner {
        supTreasuryRequirement = _newRequirement;
    }

    function setTreasuryFee(uint256 _newFee) public onlyOwner {
        require(_newFee <= 1_000, "Fee cannot exceed the maximum allowed");
        treasuryFee = _newFee;
    }

    function addToNoTreasuryPool(uint256 pairID) public onlyOwner {
        _treasuryNotClaimablePairs[pairID] = true;
    }

    function removeFromNoTreasuryPool(uint256 pairID) public onlyOwner {
        _treasuryNotClaimablePairs[pairID] = false;
    }

    function istreasuryNotClaimable(uint256 pairID) public view returns (bool) {
        return _treasuryNotClaimablePairs[pairID];
    }

    function addToWhitelist(address wallet) public onlyOwner {
        _whitelistedWallets[wallet] = true;
    }

    function removeFromWhitelist(address wallet) public onlyOwner {
        _whitelistedWallets[wallet] = false;
    }

    function isTokenVerified(uint256 pairID) public view returns (bool) {
        return _verifiedTokens[pairID];
    }

    function verifyToken(address tokenAddr) public onlyOwner {
        uint256 pairID = getPairIdByTokenAddress(tokenAddr);
        _verifiedTokens[pairID] = true;
    }

    function removeVerifyToken(address tokenAddr) public onlyOwner {
        uint256 pairID = getPairIdByTokenAddress(tokenAddr);
        _verifiedTokens[pairID] = false;
    }

    function addToScamList(
        address tokenAddr,
        address bountyReceiver,
        string memory comment
    ) public onlyOwner {
        uint256 bountyTreasuryPerWallet = bountyAmnt / maxBountyReceivers;

        if (
            IERC20(supToken).balanceOf(address(this)) >=
            bountyTreasuryPerWallet &&
            !_whitelistedWallets[bountyReceiver]
        ) {
            SafeERC20.safeTransfer(
                IERC20(supToken),
                bountyReceiver,
                bountyTreasuryPerWallet
            );
        }

        uint256 pairID = getPairIdByTokenAddress(tokenAddr);

        ScamProjects memory newScamProject = ScamProjects(
            bountyReceiver,
            comment
        );

        _scamTokensInfo[pairID] = newScamProject;

        _scamTokens[pairID] = true;
    }

    function removeFromScamList(address tokenAddr) public onlyOwner {
        uint256 pairID = getPairIdByTokenAddress(tokenAddr);
        _scamTokens[pairID] = false;
    }

    function getScamProjectInfo(
        uint256 tokenId
    ) external view returns (address, string memory) {
        ScamProjects memory scamProjectInfo = _scamTokensInfo[tokenId];
        return (scamProjectInfo.bountyReceiver, scamProjectInfo.comment);
    }

    function setMaxTreasuryReceivers(uint256 _newMax) external onlyOwner {
        maxTreasuryReceivers = _newMax;
    }

    function isWhitelisted(address wallet) public view returns (bool) {
        return _whitelistedWallets[wallet];
    }

    function isInScamList(uint256 pairId) public view returns (bool) {
        return _scamTokens[pairId];
    }

    function getInitialPairPrice(uint256 pairId) public view returns (uint256) {
        address token = _pairs[pairId].token;
        uint256 tokensAmount = _pairs[pairId].tokensAmount;
        uint256 initialLiquidity = _pairs[pairId].initialLiquidity *
            10 ** IERC20Extend(token).decimals(); //Adjusted

        return initialLiquidity / tokensAmount;
    }

    function getCurrentPairPrice(uint256 pairId) public view returns (uint256) {
        address token = _pairs[pairId].token;
        address pair = getPair(token);

        uint256 totalEth = IERC20(IUniswapV2Router01(uniswapRouter).WETH())
            .balanceOf(pair) * 10 ** IERC20Extend(token).decimals();
        uint256 tokenBalance = IERC20(token).balanceOf(pair);

        return totalEth / tokenBalance;
    }

    function getPairIdByTokenAddress(
        address tokenAddress
    ) public view returns (uint256) {
        return _pairIds[tokenAddress];
    }

    function getPairData(
        uint256 pairID
    )
        public
        view
        returns (
            address token,
            uint256 initialLiquidity,
            uint256 tokensAmount,
            uint256 distributionPerSupWallet,
            uint256 distributionIndex,
            uint256 lpLockingPeriod,
            uint256 lockID,
            uint256 launchDate,
            string memory logo,
            string memory website,
            string memory community
        )
    {
        Pairs memory pair = _pairs[pairID];
        return (
            pair.token,
            pair.initialLiquidity,
            pair.tokensAmount,
            pair.distributionPerSupWallet,
            pair.distributionIndex,
            pair.lpLockingPeriod,
            pair.lockID,
            pair.launchDate,
            pair.logo,
            pair.website,
            pair.community
        );
    }

    function getUserClaimedBalanceById(
        address user,
        uint256 pairID
    ) public view returns (uint256) {
        return _claimedBalances[user][pairID];
    }

    function subscribeToPremium() public {
        require(supToken != address(0), "Token is undefined");
        require(!isWhitelisted(_msgSender()), "Already premium");
        require(supWhitelistFee > 0, "Disabled");
        uint256 supBalance = IERC20(supToken).balanceOf(_msgSender());
        require(supBalance >= supWhitelistFee, "Not enough $SUP");

        addToWhitelist(_msgSender());
        IERC20(supToken).transferFrom(_msgSender(), deadAddr, supWhitelistFee);
    }

    function deployPair(
        address _token,
        uint256 _tokensAmount,
        uint256 lpLockingPeriod,
        string memory _logo,
        string memory _website,
        string memory _community
    ) public payable {
        require(msg.value >= 0.1 ether, "Minimum liquidity is 0.1 ether");
        require(!hasEthLiquidity(_token), "Liquidity already added");

        bool _isWhitelisted = _whitelistedWallets[_msgSender()];

        if (_isWhitelisted) {
            deployPairWhithoutFee(
                _token,
                _tokensAmount,
                lpLockingPeriod,
                _logo,
                _website,
                _community
            );
        } else {
            deployPairWithFee(
                _token,
                _tokensAmount,
                lpLockingPeriod,
                _logo,
                _website,
                _community
            );
        }
    }

    function deployPairWithFee(
        address _token,
        uint256 _tokensAmount,
        uint256 lpLockingPeriod,
        string memory _logo,
        string memory _website,
        string memory _community
    ) internal {
        require(msg.value >= 0.1 ether, "Minimum liquidity is 0.1 ether");
        require(!hasEthLiquidity(_token), "Liquidity already added");

        uint256 supCommunityAlloc = (_tokensAmount * treasuryFee) / 10_000;
        uint256 supCommunityAllocPerWallet = supCommunityAlloc /
            maxTreasuryReceivers;

        Pairs storage newPair = _pairs[totalPairs];
        newPair.token = _token;
        newPair.initialLiquidity = msg.value;
        newPair.tokensAmount = _tokensAmount - supCommunityAlloc;
        newPair.distributionPerSupWallet = supCommunityAllocPerWallet;
        newPair.distributionIndex = 0;
        newPair.lpLockingPeriod = lpLockingPeriod;
        newPair.launchDate = block.timestamp;
        newPair.logo = _logo;
        newPair.website = _website;
        newPair.community = _community;

        _pairIds[_token] = totalPairs;

        totalPairs++;
        totalInitialLiquidity += msg.value;

        IERC20(_token).transferFrom(_msgSender(), address(this), _tokensAmount);

        uint256 tokensAmountAfterDeduction = _tokensAmount - supCommunityAlloc;

        _addLiquidity(_token, tokensAmountAfterDeduction, msg.value);

        //Trasnfer LP fee

        address possibleLP = getPair(_token);
        uint256 lpAmount = IERC20(possibleLP).balanceOf(address(this));
        uint256 _fee = (lpAmount * treasuryFee) / 10_000;

        IERC20(possibleLP).transfer(devWallet, _fee);

        lpAmount -= _fee;

        if (lpLockingPeriod == 0) {
            IERC20(possibleLP).transfer(_msgSender(), lpAmount);
            newPair.lockID = 1e8;
        } else {
            newPair.lockID = _lockLP(_token, lpLockingPeriod, _msgSender());
        }

        emit PairDeployed(
            totalPairs - 1,
            _token,
            msg.value,
            _tokensAmount,
            lpLockingPeriod,
            _logo,
            _website,
            _community
        );
    }

    function deployPairWhithoutFee(
        address _token,
        uint256 _tokensAmount,
        uint256 lpLockingPeriod,
        string memory _logo,
        string memory _website,
        string memory _community
    ) internal {
        Pairs storage newPair = _pairs[totalPairs];
        newPair.token = _token;
        newPair.initialLiquidity = msg.value;
        newPair.tokensAmount = _tokensAmount;
        newPair.distributionPerSupWallet = 0; // No community allocation
        newPair.distributionIndex = 0;
        newPair.lpLockingPeriod = lpLockingPeriod;
        newPair.launchDate = block.timestamp;
        newPair.logo = _logo;
        newPair.website = _website;
        newPair.community = _community;

        _pairIds[_token] = totalPairs;

        _treasuryNotClaimablePairs[totalPairs] = true;
        totalPairs++;
        totalInitialLiquidity += msg.value;

        IERC20(_token).transferFrom(_msgSender(), address(this), _tokensAmount);

        _addLiquidity(_token, _tokensAmount, msg.value);

        address possibleLP = getPair(_token);

        if (lpLockingPeriod == 0) {
            IERC20(possibleLP).transfer(
                _msgSender(),
                IERC20(possibleLP).balanceOf(address(this))
            );
        } else {
            newPair.lockID = _lockLP(_token, lpLockingPeriod, _msgSender());
        }

        emit PairDeployed(
            totalPairs - 1,
            _token,
            msg.value,
            _tokensAmount,
            lpLockingPeriod,
            _logo,
            _website,
            _community
        );
    }

    function _addLiquidity(
        address token,
        uint256 amount,
        uint256 initialLiquidity
    ) internal {
        _approve(token, address(uniswapRouter), amount);

        IUniswapV2Router01(uniswapRouter).addLiquidityETH{
            value: initialLiquidity
        }(
            token,
            amount,
            amount,
            initialLiquidity,
            address(this),
            block.timestamp + 120
        );
    }

    function _lockLP(
        address token,
        uint256 lockUpTime,
        address lockOwner
    ) internal returns (uint256 id) {
        address possibleLP = getPair(token);
        uint256 amount = IERC20(possibleLP).balanceOf(address(this));
        uint256 newLockUpTime = block.timestamp + lockUpTime;
        _approve(address(possibleLP), address(lockAddress), amount);

        id = IStartUpLocker(lockAddress).lock(
            true,
            possibleLP,
            lockOwner,
            amount,
            newLockUpTime,
            0,
            0,
            0,
            "STEALTH LOCK"
        );
        emit LPLocked(id, possibleLP, amount, newLockUpTime, lockOwner);
    }

    function isClaimable(
        address user,
        uint256 pairID
    ) public view returns (bool) {
        uint256 supBalance = IERC20(supToken).balanceOf(user);
        if (
            _pairs[pairID].distributionIndex >= maxTreasuryReceivers ||
            _claimedBalances[user][pairID] > 0 ||
            supBalance < supTreasuryRequirement ||
            isInScamList(pairID) ||
            istreasuryNotClaimable(pairID)
        ) {
            return false;
        } else {
            return true;
        }
    }

    function claimTreasury(uint256 pairID) public nonReentrant {
        require(isClaimable(_msgSender(), pairID), "Tokens are not claimable");
        uint256 pairAllocPerWallet = _pairs[pairID].distributionPerSupWallet;
        address pairToken = _pairs[pairID].token;

        IERC20(pairToken).transfer(_msgSender(), pairAllocPerWallet);

        _pairs[pairID].distributionIndex++;
        _claimedBalances[_msgSender()][pairID] = pairAllocPerWallet;

        uint256 valueInEth = (pairAllocPerWallet * getCurrentPairPrice(pairID));

        totalDistributionsEthValue += valueInEth;

        emit TreasuryClaimed(
            _msgSender(),
            pairID,
            pairToken,
            pairAllocPerWallet,
            _pairs[pairID].distributionIndex
        );
    }

    function getPair(address token) public view returns (address) {
        address pair;
        address factory = IUniswapV2Router01(uniswapRouter).factory();
        address wEth = IUniswapV2Router01(uniswapRouter).WETH();
        pair = IUniswapV2Factory(factory).getPair(token, wEth);
        return pair;
    }

    function _approve(
        address tokenAddr,
        address spender,
        uint256 amount
    ) internal {
        SafeERC20.safeIncreaseAllowance(IERC20(tokenAddr), spender, amount);
    }

    function hasEthLiquidity(address tokenAddress) public view returns (bool) {
        address[] memory path = new address[](2);
        path[0] = tokenAddress;
        path[1] = IUniswapV2Router01(uniswapRouter).WETH();

        try
            IUniswapV2Router01(uniswapRouter).getAmountsOut(0.01 ether, path)
        returns (uint256[] memory amounts) {
            return amounts[1] > 0;
        } catch {
            return false;
        }
    }
}
[{"inputs":[{"internalType":"address","name":"_locker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockUpTime","type":"uint256"},{"indexed":false,"internalType":"address","name":"lockOwner","type":"address"}],"name":"LPLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pairID","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpLockingPeriod","type":"uint256"},{"indexed":false,"internalType":"string","name":"logo","type":"string"},{"indexed":false,"internalType":"string","name":"website","type":"string"},{"indexed":false,"internalType":"string","name":"community","type":"string"}],"name":"PairDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"pairID","type":"uint256"},{"indexed":true,"internalType":"address","name":"pairToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"distributionIndex","type":"uint256"}],"name":"TreasuryClaimed","type":"event"},{"inputs":[{"internalType":"uint256","name":"pairID","type":"uint256"}],"name":"addToNoTreasuryPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"address","name":"bountyReceiver","type":"address"},{"internalType":"string","name":"comment","type":"string"}],"name":"addToScamList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bountyAmnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairID","type":"uint256"}],"name":"claimTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokensAmount","type":"uint256"},{"internalType":"uint256","name":"lpLockingPeriod","type":"uint256"},{"internalType":"string","name":"_logo","type":"string"},{"internalType":"string","name":"_website","type":"string"},{"internalType":"string","name":"_community","type":"string"}],"name":"deployPair","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairId","type":"uint256"}],"name":"getCurrentPairPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairId","type":"uint256"}],"name":"getInitialPairPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairID","type":"uint256"}],"name":"getPairData","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"initialLiquidity","type":"uint256"},{"internalType":"uint256","name":"tokensAmount","type":"uint256"},{"internalType":"uint256","name":"distributionPerSupWallet","type":"uint256"},{"internalType":"uint256","name":"distributionIndex","type":"uint256"},{"internalType":"uint256","name":"lpLockingPeriod","type":"uint256"},{"internalType":"uint256","name":"lockID","type":"uint256"},{"internalType":"uint256","name":"launchDate","type":"uint256"},{"internalType":"string","name":"logo","type":"string"},{"internalType":"string","name":"website","type":"string"},{"internalType":"string","name":"community","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getPairIdByTokenAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getScamProjectInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"pairID","type":"uint256"}],"name":"getUserClaimedBalanceById","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"hasEthLiquidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"pairID","type":"uint256"}],"name":"isClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairId","type":"uint256"}],"name":"isInScamList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairID","type":"uint256"}],"name":"isTokenVerified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairID","type":"uint256"}],"name":"istreasuryNotClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBountyReceivers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTreasuryReceivers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairID","type":"uint256"}],"name":"removeFromNoTreasuryPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"}],"name":"removeFromScamList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"}],"name":"removeVerifyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMax","type":"uint256"}],"name":"setMaxTreasuryReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSupToken","type":"address"}],"name":"setSupToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRequirement","type":"uint256"}],"name":"setSupTreasuryRequirement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setTreasuryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subscribeToPremium","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supTreasuryRequirement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supWhitelistFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDistributionsEthValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalInitialLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPairs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"}],"name":"verifyToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]