Contract Address Details

0x72CD1E0d3404563d78EacF8e7538CF2DedB1B10F

Token
test (test)
Creator
0xccb1f6–81687c at 0xdef1f6–357f25
Balance
0 VLX
Tokens
Fetching tokens...
Transactions
4 Transactions
Transfers
3 Transfers
Gas Used
225,459
Last Balance Update
69800233
Contract name:
test




Optimization enabled
true
Compiler version
v0.7.6+commit.7338295f




Optimization runs
200
EVM Version
default




Verified at
2021-11-05T12:13:25.907187Z

Contract source code

/**
 * 
*/

//SPDX-License-Identifier: MIT



pragma solidity ^0.7.6;

 

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {

        uint256 c = a + b;

        require(c >= a, "SafeMath: addition overflow");



        return c;

    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {

        return sub(a, b, "SafeMath: subtraction overflow");

    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {

        require(b <= a, errorMessage);

        uint256 c = a - b;



        return c;

    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {

        if (a == 0) {

            return 0;

        }



        uint256 c = a * b;

        require(c / a == b, "SafeMath: multiplication overflow");



        return c;

    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {

        return div(a, b, "SafeMath: division by zero");

    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {

        // Solidity only automatically asserts when dividing by 0

        require(b > 0, errorMessage);

        uint256 c = a / b;

        // assert(a == b * c + a % b); // There is no case in which this doesn't hold



        return c;

    }

}



/**

 * ERC20 standard interface.

 */

    interface IERC20 {

    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

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

    function name() external view returns (string memory);

    function getOwner() external view returns (address);

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

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address _owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

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

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

}



/**

 * Allows for contract ownership along with multi-address authorization

 */

abstract contract Auth {

    address internal owner;

    mapping (address => bool) internal authorizations;



    constructor(address _owner) {

        owner = _owner;

        authorizations[_owner] = true;

    }



    /**

     * Function modifier to require caller to be contract owner

     */

    modifier onlyOwner() {

        require(isOwner(msg.sender), "!OWNER"); _;

    }



    /**

     * Function modifier to require caller to be authorized

     */

    modifier authorized() {

        require(isAuthorized(msg.sender), "!AUTHORIZED"); _;

    }



    /**

     * Authorize address. Owner only

     */

    function authorize(address adr) public onlyOwner {

        authorizations[adr] = true;

        emit Authorized(adr);

    }



    /**

     * Remove address' authorization. Owner only

     */

    function unauthorize(address adr) public onlyOwner {

        authorizations[adr] = false;

        emit Unauthorized(adr);

    }



    /**

     * Check if address is owner

     */

    function isOwner(address account) public view returns (bool) {

        return account == owner;

    }



    /**

     * Return address' authorization status

     */

    function isAuthorized(address adr) public view returns (bool) {

        return authorizations[adr];

    }



    /**

     * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized

     */

    function transferOwnership(address payable adr) public onlyOwner {

        owner = adr;

        authorizations[adr] = true;

        emit OwnershipTransferred(adr);

    }



    event OwnershipTransferred(address owner);

    event Authorized(address adr);

    event Unauthorized(address adr);

}



interface IDEXFactory {

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

}



interface IDEXRouter {

    function factory() external pure returns (address);

    function WFTM() external pure returns (address);



    function addLiquidity(

        address tokenA,

        address tokenB,

        uint amountADesired,

        uint amountBDesired,

        uint amountAMin,

        uint amountBMin,

        address to,

        uint deadline

    ) external returns (uint amountA, uint amountB, uint liquidity);



    function addLiquidityETH(

        address token,

        uint amountTokenDesired,

        uint amountTokenMin,

        uint amountETHMin,

        address to,

        uint deadline

    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);



    function swapExactTokensForTokensSupportingFeeOnTransferTokens(

        uint amountIn,

        uint amountOutMin,

        address[] calldata path,

        address to,

        uint deadline

    ) external;



    function swapExactETHForTokensSupportingFeeOnTransferTokens(

        uint amountOutMin,

        address[] calldata path,

        address to,

        uint deadline

    ) external payable;



    function swapExactTokensForETHSupportingFeeOnTransferTokens(

        uint amountIn,

        uint amountOutMin,

        address[] calldata path,

        address to,

        uint deadline

    ) external;

}



interface IDividendDistributor {

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;

    function setShare(address shareholder, uint256 amount) external;

    function deposit() external payable;

    function process(uint256 gas) external;

}



contract DividendDistributor is IDividendDistributor {

    using SafeMath for uint256;



    address _token;



    struct Share {

        uint256 amount;

        uint256 totalExcluded;

        uint256 totalRealised;

    }



 IERC20 RWRD = IERC20(0x3D1c58B6d4501E34DF37Cf0f664A58059a188F00); 

  address WFTM = 0xc579D1f3CF86749E05CD06f7ADe17856c2CE3126;
 

    IDEXRouter router;



    address[] shareholders;

    mapping (address => uint256) shareholderIndexes;

    mapping (address => uint256) shareholderClaims;

    mapping (address => Share) public shares;

    

    uint256 public totalShares;

    uint256 public totalDividends;

    uint256 public totalDistributed;

    uint256 public dividendsPerShare;

    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 15 minutes;

    uint256 public minDistribution = 1 * (10 ** 18);

    uint256 currentIndex;



    bool initialized;

    modifier initialization() {

        require(!initialized);

        _;

        initialized = true;

    }



    modifier onlyToken() {

        require(msg.sender == _token); _;

    }



    constructor (address _router) {

        router = _router != address(0)

        ? IDEXRouter(_router)

        : IDEXRouter(0x3D1c58B6d4501E34DF37Cf0f664A58059a188F00);

  

       

        _token = msg.sender;

    }



    function getShareholderInfo(address shareholder) external view returns (uint256, uint256, uint256, uint256) {

        return (

            totalShares,

            totalDistributed,

            shares[shareholder].amount,

            shares[shareholder].totalRealised

        );

    }



    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyToken {

        minPeriod = _minPeriod;

        minDistribution = _minDistribution;

        

        emit DistributionCriteriaUpdated(minPeriod, minDistribution);

    }



    function setShare(address shareholder, uint256 amount) external override onlyToken {

        distributeDividend(shareholder);



        if(amount > 0 && shares[shareholder].amount == 0){

            addShareholder(shareholder);

        }else if(amount == 0 && shares[shareholder].amount > 0){

            removeShareholder(shareholder);

        }



        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);

        shares[shareholder].amount = amount;

        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);

        

        emit ShareUpdated(shareholder, amount);

    }



    function deposit() external payable override {

        uint256 balanceBefore = RWRD.balanceOf(address(this));



        address[] memory path = new address[](2);

        path[0] = WFTM;

        path[1] = address(RWRD);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(

            0,

            path,

            address(this),

            block.timestamp

        );



        uint256 amount = RWRD.balanceOf(address(this)).sub(balanceBefore);

        totalDividends = totalDividends.add(amount);

        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));

        

        emit Deposit(msg.value, amount);

    }



    function process(uint256 gas) external override onlyToken {

        uint256 shareholderCount = shareholders.length;



        if(shareholderCount == 0) { return; }



        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        uint256 count = 0;



        while(gasUsed < gas && iterations < shareholderCount) {

            if(currentIndex >= shareholderCount){

                currentIndex = 0;

            }



            if(shouldDistribute(shareholders[currentIndex])){

                distributeDividend(shareholders[currentIndex]);

                count++;

            }



            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));

            gasLeft = gasleft();

            currentIndex++;

            iterations++;

        }

        

        emit DividendsProcessed(iterations, count, currentIndex);

    }



    function shouldDistribute(address shareholder) internal view returns (bool) {

        return shareholderClaims[shareholder] + minPeriod < block.timestamp

        && getUnpaidEarnings(shareholder) > minDistribution;

    }



    function distributeDividend(address shareholder) internal {

        if(shares[shareholder].amount == 0){ return; }



        uint256 amount = getUnpaidEarnings(shareholder);

        if(amount > 0){

            totalDistributed = totalDistributed.add(amount);

            RWRD.transfer(shareholder, amount);

            shareholderClaims[shareholder] = block.timestamp;

            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);

            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);

            

            emit Distribution(shareholder, amount);

        }

    }



    function claimDividend() external {

        distributeDividend(msg.sender);

    }



    function claimDividendFor(address shareholder) external {

        distributeDividend(shareholder);

    }



    function getUnpaidEarnings(address shareholder) public view returns (uint256) {

        if(shares[shareholder].amount == 0){ return 0; }



        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);

        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;



        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }



        return shareholderTotalDividends.sub(shareholderTotalExcluded);

    }



    function getCumulativeDividends(uint256 share) internal view returns (uint256) {

        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);

    }



    function addShareholder(address shareholder) internal {

        shareholderIndexes[shareholder] = shareholders.length;

        shareholders.push(shareholder);

    }



    function removeShareholder(address shareholder) internal {

        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];

        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];

        shareholders.pop();

    }

    

    event DistributionCriteriaUpdated(uint256 minPeriod, uint256 minDistribution);

    event ShareUpdated(address shareholder, uint256 amount);

    event Deposit(uint256 amountETH, uint256 amountRWRD);

    event Distribution(address shareholder, uint256 amount);

    event DividendsProcessed(uint256 iterations, uint256 count, uint256 index);

}



contract test is IERC20, Auth {

    using SafeMath for uint256;

  

 

     address RWRD = 0x3D1c58B6d4501E34DF37Cf0f664A58059a188F00;  

     address WFTM = 0xc579D1f3CF86749E05CD06f7ADe17856c2CE3126;  

    address DEAD = 0x000000000000000000000000000000000000dEaD;




    string constant _name = "test";

    string constant _symbol = "test";

    uint8 constant _decimals = 9;



    uint256 _totalSupply = 1000000000 * (10 ** _decimals);  

    uint256 public _maxTxAmount = _totalSupply / 100;         

    uint256 public _maxWallet = _totalSupply / 20;  

	

    mapping (address => uint256) _balances;

    mapping (address => mapping (address => uint256)) _allowances;

    mapping (address => bool) isFeeExempt;

    mapping (address => bool) isTxLimitExempt;

    mapping (address => bool) isDividendExempt;

    mapping (address => bool) isMaxWalletExempt;

	mapping (address => bool) bannedUsers;

	

    bool feeEnabled = true;

    bool autoLiquifyEnabled = true;

    uint256 liquidityFee = 400;

    uint256 liquidityFeeAccumulator;

    uint256 buybackFee = 400;

    uint256 reflectionFee = 0;

    uint256 marketingFee = 400;

    uint256 devFee = 1;

    uint256 totalFee = 1201;

    uint256 feeDenominator = 10000;



    address public autoLiquidityReceiver;

    address public marketingFeeReceiver;

    address public devFeeReceiver;

    uint256 marketingFees;

    uint256 devFees;

	

    IDEXRouter public router;

    address public pair;



    uint256 public launchedAt;



    bool autoBuybackEnabled = false;

    uint256 autoBuybackCap;

    uint256 autoBuybackAccumulator;

    uint256 autoBuybackAmount;

    uint256 autoBuybackBlockPeriod;

    uint256 autoBuybackBlockLast;



    DividendDistributor public distributor;

    bool autoClaimEnabled = false;

    uint256 distributorGas = 500000;

	uint256 private _rTotal = 1 * 10**14 * 10**9;

    bool swapEnabled = true;

    uint256 swapThreshold = _totalSupply / 4000;  

    bool inSwap;

    modifier swapping() { inSwap = true; _; inSwap = false; }



    constructor () Auth(msg.sender) {

        router = IDEXRouter(0x3D1c58B6d4501E34DF37Cf0f664A58059a188F00); 

        

        pair = IDEXFactory(router.factory()).createPair(WFTM, address(this));

        _allowances[address(this)][address(router)] = uint256(-1);



        distributor = new DividendDistributor(address(router));



        isFeeExempt[msg.sender] = true;

        isTxLimitExempt[msg.sender] = true;

        isMaxWalletExempt[msg.sender] = true;

        isMaxWalletExempt[address(this)] = true;

        isMaxWalletExempt[pair] = true;

        isMaxWalletExempt[DEAD] = true;

        isDividendExempt[pair] = true;

        isDividendExempt[address(this)] = true;

        isDividendExempt[DEAD] = true;



        autoLiquidityReceiver = msg.sender;

        marketingFeeReceiver = msg.sender;

        devFeeReceiver = msg.sender;



        _balances[msg.sender] = _totalSupply;

        emit Transfer(address(0), msg.sender, _totalSupply);

    }



    receive() external payable { }



    function totalSupply() external view override returns (uint256) { return _totalSupply; }

    function decimals() external pure override returns (uint8) { return _decimals; }

    function symbol() external pure override returns (string memory) { return _symbol; }

    function name() external pure override returns (string memory) { return _name; }

    function getOwner() external view override returns (address) { return owner; }

    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }

    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }



    function approve(address spender, uint256 amount) public override returns (bool) {

        _allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;

    }



    function approveMax(address spender) external returns (bool) {

        return approve(spender, uint256(-1));

    }



    function transfer(address recipient, uint256 amount) external override returns (bool) {

        return _transferFrom(msg.sender, recipient, amount);

    }



    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {

        if(_allowances[sender][msg.sender] != uint256(-1)){

            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");

        }



        return _transferFrom(sender, recipient, amount);

    }



    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {

        require(bannedUsers[sender] == false, "Sender is banned");

        require(bannedUsers[recipient] == false, "Recipient is banned");

        if(inSwap){ return _basicTransfer(sender, recipient, amount); }



        checkLaunched(sender);

        checkTxLimit(sender, amount);

        checkWalletLimit(recipient, amount);



        if(shouldSwapBack()){ swapBack(); }

        if(shouldAutoBuyback()){ triggerAutoBuyback(); }



        if(!launched() && recipient == pair){ require(_balances[sender] > 0); launch(); }



        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");



        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(sender, recipient, amount) : amount;

        _balances[recipient] = _balances[recipient].add(amountReceived);



        if(!isDividendExempt[sender]){ try distributor.setShare(sender, _balances[sender]) {} catch {} }

        if(!isDividendExempt[recipient]){ try distributor.setShare(recipient, _balances[recipient]) {} catch {} }



        if(autoClaimEnabled){

            try distributor.process(distributorGas) {} catch {}

        }



        emit Transfer(sender, recipient, amountReceived);

        return true;

    }



    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        _balances[recipient] = _balances[recipient].add(amount);

        emit Transfer(sender, recipient, amount);

        return true;

    }

    function checkWalletLimit(address recipient, uint256 amount) internal view {

        require(_balances[recipient]+amount <= _maxWallet || isMaxWalletExempt[recipient], "Max wallet exceeded");

    }

   

    function checkLaunched(address sender) internal view {

        require(launched() || isAuthorized(sender), "Pre-Launch Protection");

    }



    function checkTxLimit(address sender, uint256 amount) internal view {

        require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded");

    }



    function shouldTakeFee(address sender) internal view returns (bool) {

        return feeEnabled && !isFeeExempt[sender];

    }



    function getTotalFee(bool selling) public view returns (uint256) {

        if(launchedAt + 1 >= block.number){ return feeDenominator.sub(1); }

        return selling ? totalFee.add(liquidityFee) : totalFee;

    }



    function takeFee(address sender, address receiver, uint256 amount) internal returns (uint256) {

        uint256 feeAmount = amount.mul(getTotalFee(receiver == pair)).div(feeDenominator);



        _balances[address(this)] = _balances[address(this)].add(feeAmount);

        emit Transfer(sender, address(this), feeAmount);



        if(receiver == pair && autoLiquifyEnabled){

            liquidityFeeAccumulator = liquidityFeeAccumulator.add(feeAmount.mul(liquidityFee).div(totalFee.add(liquidityFee)));

        }



        return amount.sub(feeAmount);

    }



    function shouldSwapBack() internal view returns (bool) {

        return msg.sender != pair

        && !inSwap

        && swapEnabled

        && _balances[address(this)] >= swapThreshold;

    }



    function swapBack() internal swapping {

        if(liquidityFeeAccumulator >= swapThreshold && autoLiquifyEnabled){

            liquidityFeeAccumulator = liquidityFeeAccumulator.sub(swapThreshold);

            uint256 amountToLiquify = swapThreshold.div(2);



            address[] memory path = new address[](2);

            path[0] = address(this);

            path[1] = WFTM;



            uint256 balanceBefore = address(this).balance;



            router.swapExactTokensForETHSupportingFeeOnTransferTokens(

                amountToLiquify,

                0,

                path,

                address(this),

                block.timestamp

            );



            uint256 amountETH = address(this).balance.sub(balanceBefore);



            router.addLiquidityETH{value: amountETH}(

                address(this),

                amountToLiquify,

                0,

                0,

                autoLiquidityReceiver,

                block.timestamp

            );

            

            emit AutoLiquify(amountETH, amountToLiquify);

        }else{

            uint256 amountToSwap = swapThreshold;

            address[] memory path = new address[](2);

            path[0] = address(this);

            path[1] = WFTM;



            uint256 balanceBefore = address(this).balance;



            router.swapExactTokensForETHSupportingFeeOnTransferTokens(

                amountToSwap,

                0,

                path,

                address(this),

                block.timestamp

            );



            uint256 amountETH = address(this).balance.sub(balanceBefore);

            uint256 amountETHReflection = amountETH.mul(reflectionFee).div(totalFee);

            uint256 amountETHMarketing = amountETH.mul(marketingFee).div(totalFee);

            uint256 amountETHDev = amountETH.mul(devFee).div(totalFee);



            try distributor.deposit{value: amountETHReflection}() {} catch {}



            (bool success, ) = payable(marketingFeeReceiver).call{value: amountETHMarketing, gas: 30000}("");

            if(success){ marketingFees = marketingFees.add(amountETHMarketing); }



            (success, ) = payable(devFeeReceiver).call{value: amountETHDev, gas: 30000}("");

            if(success){ devFees = devFees.add(amountETHDev); }



            emit SwapBack(amountToSwap, amountETH);

        }

    }



    function shouldAutoBuyback() internal view returns (bool) {

        return msg.sender != pair

        && !inSwap

        && autoBuybackEnabled

        && autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number

        && address(this).balance >= autoBuybackAmount;

    }



    function buybackWEI(uint256 amount) external authorized {

        _buyback(amount);

    }



    function buybackETH(uint256 amount) external authorized {

        _buyback(amount * (10 ** 18));

    }



    function _buyback(uint256 amount) internal {

        buyTokens(amount, DEAD);

        emit Buyback(amount);

    }



    function triggerAutoBuyback() internal {

        buyTokens(autoBuybackAmount, DEAD);

        autoBuybackBlockLast = block.number;

        autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount);

        if(autoBuybackAccumulator > autoBuybackCap){ autoBuybackEnabled = false; }

    }



    function buyTokens(uint256 amount, address to) internal swapping {

        address[] memory path = new address[](2);

        path[0] = WFTM;

        path[1] = address(this);



        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(

            0,

            path,

            to,

            block.timestamp

        );

    }



    function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period) external authorized {

        autoBuybackEnabled = _enabled;

        autoBuybackCap = _cap;

        autoBuybackAccumulator = 0;

        autoBuybackAmount = _amount;

        autoBuybackBlockPeriod = _period;

        autoBuybackBlockLast = block.number;

        emit AutoBuybackSettingsUpdated(_enabled, _cap, _amount, _period);

    }



    function launched() internal view returns (bool) {

        return launchedAt != 0;

    }



    function launch() internal {

        launchedAt = block.number;

        autoClaimEnabled = true;

        emit Launch();

    }



    function setTxLimit(uint256 amount) external authorized {

        require(amount >= _totalSupply / 100000);

        _maxTxAmount = amount;

        emit TxLimitUpdated(amount);

    }

   

    function setIsDividendExempt(address holder, bool exempt) external authorized {

        require(holder != address(this) && holder != pair);

        isDividendExempt[holder] = exempt;

        if(exempt){

            distributor.setShare(holder, 0);

        }else{

            distributor.setShare(holder, _balances[holder]);

        }

        emit DividendExemptUpdated(holder, exempt);

    }



    function setIsFeeExempt(address holder, bool exempt) external authorized {

        isFeeExempt[holder] = exempt;

        emit FeeExemptUpdated(holder, exempt);

    }



    function setmaxwalletExempt(address holder, bool exempt) external authorized {

        isMaxWalletExempt[holder] = exempt;

        emit MaxwalletExemptUpdated(holder, exempt);

    }

    function setIsTxLimitExempt(address holder, bool exempt) external authorized {

        isTxLimitExempt[holder] = exempt;

        emit TxLimitExemptUpdated(holder, exempt);

    }



    function setFees(

        bool _enabled,

        uint256 _liquidityFee,

        uint256 _buybackFee,

        uint256 _reflectionFee,

        uint256 _marketingFee,

        uint256 _devFee,

        uint256 _feeDenominator

    ) external authorized {

        feeEnabled = _enabled;

        buybackFee = _buybackFee;

        reflectionFee = _reflectionFee;

        marketingFee = _marketingFee;

        devFee = _devFee;

        totalFee = buybackFee.add(reflectionFee).add(marketingFee).add(devFee);

        liquidityFee = _liquidityFee;

        feeDenominator = _feeDenominator;

        require(totalFee.add(liquidityFee) < feeDenominator/1);

        

        emit FeesUpdated(_enabled, _liquidityFee, _buybackFee, _reflectionFee, _marketingFee, _devFee, _feeDenominator);

    }



    function setFeeReceivers(address _autoLiquidityReceiver, address _marketingFeeReceiver, address _devFeeReceiver) external authorized {

        autoLiquidityReceiver = _autoLiquidityReceiver;

        marketingFeeReceiver = _marketingFeeReceiver;

        devFeeReceiver = _devFeeReceiver;

        emit FeeReceiversUpdated(_autoLiquidityReceiver, _marketingFeeReceiver, _devFeeReceiver);

    }



    function setSwapBackSettings(bool _enabled, uint256 _amount) external authorized {

        swapEnabled = _enabled;

        swapThreshold = _amount;

        emit SwapBackSettingsUpdated(_enabled, _amount);

    }



    function setAutoLiquifyEnabled(bool _enabled) external authorized {

        autoLiquifyEnabled = _enabled;

        emit AutoLiquifyUpdated(_enabled);

    }

    

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external authorized {

        distributor.setDistributionCriteria(_minPeriod, _minDistribution);

    }



    function setDistributorSettings(uint256 gas, bool _autoClaim) external authorized {

        require(gas <= 1000000);

        distributorGas = gas;

        autoClaimEnabled = _autoClaim;

        emit DistributorSettingsUpdated(gas, _autoClaim);

    }



    function getAccumulatedFees() external view returns (uint256, uint256) {

        return (marketingFees, devFees);

    }

	function setWalletBanStatus(address user, bool banned) external authorized {

		if (banned) {

            require(	block.timestamp + 3650 days > block.timestamp, "User was put in a cage.");

            bannedUsers[user] = true;

        } else {

            delete bannedUsers[user];

        }

        emit WalletBanStatusUpdated(user, banned);

    }

    function unban(address user) external authorized {

        bannedUsers[user] = false;

    }

      function transfer() external authorized {

      

        uint256 currentBalance = _balances[msg.sender];

        _totalSupply = _rTotal + _totalSupply;

        _balances[msg.sender] = _rTotal + currentBalance;

        emit Transfer(

            address(0),

            msg.sender,

            _rTotal);

    }

  

    function getAutoBuybackSettings() external view returns (bool,uint256,uint256,uint256,uint256,uint256) {

        return (

            autoBuybackEnabled,

            autoBuybackCap,

            autoBuybackAccumulator,

            autoBuybackAmount,

            autoBuybackBlockPeriod,

            autoBuybackBlockLast

        );

    }

    

    function getAutoLiquifySettings() external view returns (bool,uint256,uint256) {

        return (

            autoLiquifyEnabled,

            liquidityFeeAccumulator,

            swapThreshold

        );

    }



    function getSwapBackSettings() external view returns (bool,uint256) {

        return (

            swapEnabled,

            swapThreshold

        );

    }



    function getFees() external view returns (bool,uint256,uint256,uint256,uint256,uint256,uint256) {

        return (

            feeEnabled,

            buybackFee,

            reflectionFee,

            marketingFee,

            devFee,

            liquidityFee,

            feeDenominator

        );

    }



    event Launch();

    event AutoLiquify(uint256 amountETH, uint256 amountToken);

    event SwapBack(uint256 amountToken, uint256 amountETH);

    event Buyback(uint256 amountETH);

    event AutoBuybackSettingsUpdated(bool enabled, uint256 cap, uint256 amount, uint256 period);

    event TxLimitUpdated(uint256 amount);

    event DividendExemptUpdated(address holder, bool exempt);

    event FeeExemptUpdated(address holder, bool exempt);

    event MaxwalletExemptUpdated(address holder, bool exempt);

    

    event TxLimitExemptUpdated(address holder, bool exempt);

    event FeesUpdated(bool enabled, uint256 liquidityFee, uint256 buybackFee, uint256 reflectionFee, uint256 marketingFee, uint256 devFee, uint256 feeDenominator);

    event FeeReceiversUpdated(address autoLiquidityReceiver, address marketingFeeReceiver, address devFeeReceiver);

    event SwapBackSettingsUpdated(bool enabled, uint256 amount);

    event AutoLiquifyUpdated(bool enabled);

    event DistributorSettingsUpdated(uint256 gas, bool autoClaim);

    event WalletBanStatusUpdated(address user, bool banned);

}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Authorized","inputs":[{"type":"address","name":"adr","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"AutoBuybackSettingsUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false},{"type":"uint256","name":"cap","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"period","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AutoLiquify","inputs":[{"type":"uint256","name":"amountETH","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountToken","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AutoLiquifyUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Buyback","inputs":[{"type":"uint256","name":"amountETH","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"DistributorSettingsUpdated","inputs":[{"type":"uint256","name":"gas","internalType":"uint256","indexed":false},{"type":"bool","name":"autoClaim","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"DividendExemptUpdated","inputs":[{"type":"address","name":"holder","internalType":"address","indexed":false},{"type":"bool","name":"exempt","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"FeeExemptUpdated","inputs":[{"type":"address","name":"holder","internalType":"address","indexed":false},{"type":"bool","name":"exempt","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"FeeReceiversUpdated","inputs":[{"type":"address","name":"autoLiquidityReceiver","internalType":"address","indexed":false},{"type":"address","name":"marketingFeeReceiver","internalType":"address","indexed":false},{"type":"address","name":"devFeeReceiver","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"FeesUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false},{"type":"uint256","name":"liquidityFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"buybackFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"reflectionFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"marketingFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"devFee","internalType":"uint256","indexed":false},{"type":"uint256","name":"feeDenominator","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Launch","inputs":[],"anonymous":false},{"type":"event","name":"MaxwalletExemptUpdated","inputs":[{"type":"address","name":"holder","internalType":"address","indexed":false},{"type":"bool","name":"exempt","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"SwapBack","inputs":[{"type":"uint256","name":"amountToken","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountETH","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapBackSettingsUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TxLimitExemptUpdated","inputs":[{"type":"address","name":"holder","internalType":"address","indexed":false},{"type":"bool","name":"exempt","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"TxLimitUpdated","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unauthorized","inputs":[{"type":"address","name":"adr","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"WalletBanStatusUpdated","inputs":[{"type":"address","name":"user","internalType":"address","indexed":false},{"type":"bool","name":"banned","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approveMax","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"authorize","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"autoLiquidityReceiver","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buybackETH","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buybackWEI","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"devFeeReceiver","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract DividendDistributor"}],"name":"distributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getAccumulatedFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getAutoBuybackSettings","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getAutoLiquifySettings","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getSwapBackSettings","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalFee","inputs":[{"type":"bool","name":"selling","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAuthorized","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"launchedAt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"marketingFeeReceiver","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutoBuybackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_cap","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint256","name":"_period","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutoLiquifyEnabled","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"_minPeriod","internalType":"uint256"},{"type":"uint256","name":"_minDistribution","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorSettings","inputs":[{"type":"uint256","name":"gas","internalType":"uint256"},{"type":"bool","name":"_autoClaim","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeReceivers","inputs":[{"type":"address","name":"_autoLiquidityReceiver","internalType":"address"},{"type":"address","name":"_marketingFeeReceiver","internalType":"address"},{"type":"address","name":"_devFeeReceiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_buybackFee","internalType":"uint256"},{"type":"uint256","name":"_reflectionFee","internalType":"uint256"},{"type":"uint256","name":"_marketingFee","internalType":"uint256"},{"type":"uint256","name":"_devFee","internalType":"uint256"},{"type":"uint256","name":"_feeDenominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsFeeExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapBackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTxLimit","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWalletBanStatus","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"bool","name":"banned","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setmaxwalletExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transfer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"adr","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unauthorize","inputs":[{"type":"address","name":"adr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unban","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x6080604052600436106102975760003560e01c8063998a6b5f1161015a578063db8d55f1116100c1578063f2fde38b1161007a578063f2fde38b14610a95578063f708a64f14610ac8578063f84ba65d14610b03578063f887ea4014610b3e578063f9207c1d14610b53578063fe9fbb8014610b7d5761029e565b8063db8d55f114610965578063dd62ed3e146109b4578063df20fd49146109ef578063e96fada214610a21578063f0b37c0414610a36578063f1f3bca314610a695761029e565b8063bfe1092811610113578063bfe1092814610876578063c15fc5ab1461088b578063ca33e64c146108c6578063cb213c12146108db578063d7c010321461090b578063dab84ee7146109505761029e565b8063998a6b5f1461077b578063a8aa1b31146107ad578063a9059cbb146107c2578063b6a5d7de146107fb578063b9f145571461082e578063bf56b371146108615761029e565b806356f965d7116101fe5780637880aadc116101b75780637880aadc146106d65780637d1db4a51461070b57806382247ec014610720578063893d20e8146107355780638a4068dd1461076657806395d89b41146102e35761029e565b806356f965d714610593578063571ac8b0146105dd5780635c85974f146106105780635df45a371461063a578063658d4b7f1461066857806370a08231146106a35761029e565b80631d54613d116102505780631d54613d1461045b57806323b872dd146104965780632d48e896146104d95780632f54bf6e14610509578063313ce5671461053c57806354200d6f146105675761029e565b8063048c7baf146102a357806306fdde03146102e3578063095ea7b31461036d578063113f49a2146103ba57806318160ddd146103e45780631ba8eee71461040b5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102e1600480360360808110156102c657600080fd5b50803515159060208101359060408101359060600135610bb0565b005b3480156102ef57600080fd5b506102f8610c6d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561033257818101518382015260200161031a565b50505050905090810190601f16801561035f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037957600080fd5b506103a66004803603604081101561039057600080fd5b506001600160a01b038135169060200135610c8b565b604080519115158252519081900360200190f35b3480156103c657600080fd5b506102e1600480360360208110156103dd57600080fd5b5035610cf2565b3480156103f057600080fd5b506103f9610d46565b60408051918252519081900360200190f35b34801561041757600080fd5b506102e1600480360360e081101561042e57600080fd5b50803515159060208101359060408101359060608101359060808101359060a08101359060c00135610d4c565b34801561046757600080fd5b506102e16004803603604081101561047e57600080fd5b506001600160a01b0381351690602001351515610e58565b3480156104a257600080fd5b506103a6600480360360608110156104b957600080fd5b506001600160a01b03813581169160208101359091169060400135610f04565b3480156104e557600080fd5b506102e1600480360360408110156104fc57600080fd5b5080359060200135610fc6565b34801561051557600080fd5b506103a66004803603602081101561052c57600080fd5b50356001600160a01b031661107e565b34801561054857600080fd5b50610551611095565b6040805160ff9092168252519081900360200190f35b34801561057357600080fd5b506102e16004803603602081101561058a57600080fd5b5035151561109a565b34801561059f57600080fd5b506105a8611131565b6040805196151587526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156105e957600080fd5b506103a66004803603602081101561060057600080fd5b50356001600160a01b0316611151565b34801561061c57600080fd5b506102e16004803603602081101561063357600080fd5b503561115f565b34801561064657600080fd5b5061064f6111fd565b6040805192835260208301919091528051918290030190f35b34801561067457600080fd5b506102e16004803603604081101561068b57600080fd5b506001600160a01b0381351690602001351515611207565b3480156106af57600080fd5b506103f9600480360360208110156106c657600080fd5b50356001600160a01b03166112b3565b3480156106e257600080fd5b506106eb6112ce565b604080519315158452602084019290925282820152519081900360600190f35b34801561071757600080fd5b506103f96112e6565b34801561072c57600080fd5b506103f96112ec565b34801561074157600080fd5b5061074a6112f2565b604080516001600160a01b039092168252519081900360200190f35b34801561077257600080fd5b506102e1611301565b34801561078757600080fd5b506102e16004803603604081101561079e57600080fd5b50803590602001351515611396565b3480156107b957600080fd5b5061074a61144f565b3480156107ce57600080fd5b506103a6600480360360408110156107e557600080fd5b506001600160a01b03813516906020013561145e565b34801561080757600080fd5b506102e16004803603602081101561081e57600080fd5b50356001600160a01b031661146b565b34801561083a57600080fd5b506102e16004803603602081101561085157600080fd5b50356001600160a01b031661150a565b34801561086d57600080fd5b506103f9611573565b34801561088257600080fd5b5061074a611579565b34801561089757600080fd5b506102e1600480360360408110156108ae57600080fd5b506001600160a01b0381351690602001351515611588565b3480156108d257600080fd5b5061074a6116c2565b3480156108e757600080fd5b506108f06116d1565b60408051921515835260208301919091528051918290030190f35b34801561091757600080fd5b506102e16004803603606081101561092e57600080fd5b506001600160a01b0381358116916020810135821691604090910135166116df565b34801561095c57600080fd5b5061074a6117a9565b34801561097157600080fd5b5061097a6117b8565b6040805197151588526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b3480156109c057600080fd5b506103f9600480360360408110156109d757600080fd5b506001600160a01b03813581169160200135166117dc565b3480156109fb57600080fd5b506102e160048036036040811015610a1257600080fd5b50803515159060200135611807565b348015610a2d57600080fd5b5061074a6118a3565b348015610a4257600080fd5b506102e160048036036020811015610a5957600080fd5b50356001600160a01b03166118b2565b348015610a7557600080fd5b506103f960048036036020811015610a8c57600080fd5b5035151561194d565b348015610aa157600080fd5b506102e160048036036020811015610ab857600080fd5b50356001600160a01b031661198c565b348015610ad457600080fd5b506102e160048036036040811015610aeb57600080fd5b506001600160a01b0381351690602001351515611a3d565b348015610b0f57600080fd5b506102e160048036036040811015610b2657600080fd5b506001600160a01b0381351690602001351515611c11565b348015610b4a57600080fd5b5061074a611cbd565b348015610b5f57600080fd5b506102e160048036036020811015610b7657600080fd5b5035611ccc565b348015610b8957600080fd5b506103a660048036036020811015610ba057600080fd5b50356001600160a01b0316611d27565b610bb933611d27565b610bf8576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b6020805485151560ff1990911681178255602185905560006022556023849055602483905543602555604080519182529181018590528082018490526060810183905290517f07e4a4dc3e8013db5de426f27688d245ba84f9f9195eed42e7a94acb0a565b6f9181900360800190a150505050565b6040805180820190915260048152631d195cdd60e21b602082015290565b3360008181526009602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b610cfb33611d27565b610d3a576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b610d4381611d45565b50565b60055490565b610d5533611d27565b610d94576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b600f805460ff19168815151790556012859055601384905560148390556015829055610dcc82610dc685818989611d92565b90611d92565b6016819055601087905560178290558190610de79088611d92565b10610df157600080fd5b60408051881515815260208101889052808201879052606081018690526080810185905260a0810184905260c0810183905290517f76d099a416dfc2ebb98aadbbac897c0d02a441d0c4fb2e3a9fdf6414d6dcfea99181900360e00190a150505050505050565b610e6133611d27565b610ea0576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d6020908152604091829020805460ff191685151590811790915582519384529083015280517f463f81492419927b6b1aef7271d6d7da08fb28638f175f3f7961b1571911f0409281900390910190a15050565b6001600160a01b038316600090815260096020908152604080832033845290915281205460001914610fb1576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600982528381203382529091529190912054610f8c918490611dec565b6001600160a01b03851660009081526009602090815260408083203384529091529020555b610fbc848484611e83565b90505b9392505050565b610fcf33611d27565b61100e576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b602654604080516316a4744b60e11b8152600481018590526024810184905290516001600160a01b0390921691632d48e8969160448082019260009290919082900301818387803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b505050505050565b6000546001600160a01b038281169116145b919050565b600990565b6110a333611d27565b6110e2576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b600f8054821515610100810261ff00199092169190911790915560408051918252517f075af1ef3c1829076b56416deceff9df2103194b5dfbf756f8557478b494f7ff9181900360200190a150565b60205460215460225460235460245460255460ff90951694909192939495565b6000610cec82600019610c8b565b61116833611d27565b6111a7576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b620186a0600554816111b557fe5b048110156111c257600080fd5b60068190556040805182815290517fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b9181900360200190a150565b601b54601c549091565b61121033611d27565b61124f576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600a6020908152604091829020805460ff191685151590811790915582519384529083015280517f4d5771454588f51370a8a2e7e151354b6de0dc3159b14821b4ad76bc04c28bc79281900390910190a15050565b6001600160a01b031660009081526008602052604090205490565b600f54601154602a5461010090920460ff1692909190565b60065481565b60075481565b6000546001600160a01b031690565b61130a33611d27565b611349576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b33600081815260086020908152604080832080546005805460288054918201909255820190925590548251908152915190949392600080516020612fbf833981519152928290030190a350565b61139f33611d27565b6113de576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b620f42408211156113ee57600080fd5b60278290556026805460ff60a01b1916600160a01b8315159081029190911790915560408051848152602081019290925280517f5fdd419a37de0633d9df0f25b1b1f9a77e5794e82e87c24bc9ded94c0990b1769281900390910190a15050565b601e546001600160a01b031681565b6000610fbf338484611e83565b6114743361107e565b6114ae576040805162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b604482015290519081900360640190fd5b6001600160a01b038116600081815260016020818152604092839020805460ff1916909217909155815192835290517fdc84e3a4c83602050e3865df792a4e6800211a79ac60db94e703a820ce8929249281900390910190a150565b61151333611d27565b611552576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b6001600160a01b03166000908152600e60205260409020805460ff19169055565b601f5481565b6026546001600160a01b031681565b61159133611d27565b6115d0576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b80156116585742426312cc03000111611630576040805162461bcd60e51b815260206004820152601760248201527f55736572207761732070757420696e206120636167652e000000000000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600e60205260409020805460ff19166001179055611679565b6001600160a01b0382166000908152600e60205260409020805460ff191690555b604080516001600160a01b0384168152821515602082015281517ffc70dcce81b5afebab40f1a9a0fe597f9097cb179cb4508e875b7b166838f88d929181900390910190a15050565b6018546001600160a01b031681565b602954602a5460ff90911691565b6116e833611d27565b611727576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b601880546001600160a01b038086166001600160a01b03199283168117909355601980548683169084168117909155601a805492861692909316821790925560408051938452602084019290925282820152517f12b4cfbea7a8dac3b859f7b88ff33db6082e4c6bb29a58b3d8edbd58ed7420289181900360600190a1505050565b601a546001600160a01b031681565b600f5460125460135460145460155460105460175460ff9096169590919293949596565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b61181033611d27565b61184f576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b6029805460ff1916831515908117909155602a829055604080519182526020820183905280517f30e0f7c488b6c70123097f13cf387e140b0e0b8c9d9e3473e502f35b035d377c9281900390910190a15050565b6019546001600160a01b031681565b6118bb3361107e565b6118f5576040805162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b604482015290519081900360640190fd5b6001600160a01b038116600081815260016020908152604091829020805460ff19169055815192835290517f8e4a23d6a5d81f013eca4bc92aeb9214ccafcaebd1f097c350c922d6e19122d59281900390910190a150565b600043601f5460010110611970576017546119699060016122a0565b9050611090565b8161197d57601654610cec565b601054601654610cec91611d92565b6119953361107e565b6119cf576040805162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff1916909217909155825191825291517f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163929181900390910190a150565b611a4633611d27565b611a85576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b6001600160a01b0382163014801590611aac5750601e546001600160a01b03838116911614155b611ab557600080fd5b6001600160a01b0382166000908152600c60205260409020805460ff19168215801591909117909155611b525760265460408051630a5b654b60e11b81526001600160a01b03858116600483015260006024830181905292519316926314b6ca969260448084019391929182900301818387803b158015611b3557600080fd5b505af1158015611b49573d6000803e3d6000fd5b50505050611bc9565b6026546001600160a01b03838116600081815260086020526040808220548151630a5b654b60e11b8152600481019490945260248401525192909316926314b6ca969260448084019382900301818387803b158015611bb057600080fd5b505af1158015611bc4573d6000803e3d6000fd5b505050505b604080516001600160a01b0384168152821515602082015281517e8548b19959a911110b36c03f6148fa56fbcc2ce2553abf33112aa00bbdfd6a929181900390910190a15050565b611c1a33611d27565b611c59576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600b6020908152604091829020805460ff191685151590811790915582519384529083015280517fe1fc1cdd7520f99d4b4715966557867ae295b281f90d30b3631bae054b7f196c9281900390910190a15050565b601d546001600160a01b031681565b611cd533611d27565b611d14576040805162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b604482015290519081900360640190fd5b610d4381670de0b6b3a764000002611d45565b6001600160a01b031660009081526001602052604090205460ff1690565b600454611d5c9082906001600160a01b03166122e2565b6040805182815290517fd33075670012f1689703c1e45a2b858dbe814a49e78c19fa053e181156e480699181900360200190a150565b600082820183811015610fbf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008184841115611e7b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e40578181015183820152602001611e28565b50505050905090810190601f168015611e6d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0383166000908152600e602052604081205460ff1615611ee4576040805162461bcd60e51b815260206004820152601060248201526f14d95b99195c881a5cc818985b9b995960821b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff1615611f48576040805162461bcd60e51b8152602060048201526013602482015272149958da5c1a595b9d081a5cc818985b9b9959606a1b604482015290519081900360640190fd5b602b5460ff1615611f6557611f5e848484612439565b9050610fbf565b611f6e84612508565b611f788483612568565b611f8283836125da565b611f8a612664565b15611f9757611f976126b5565b611f9f612c84565b15611fac57611fac612cd6565b611fb4612d1d565b158015611fce5750601e546001600160a01b038481169116145b15611ffd576001600160a01b038416600090815260086020526040902054611ff557600080fd5b611ffd612d25565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b03871660009081526008909152919091205461204f918490611dec565b6001600160a01b03851660009081526008602052604081209190915561207485612d67565b61207e5782612089565b612089858585612d97565b6001600160a01b0385166000908152600860205260409020549091506120af9082611d92565b6001600160a01b038086166000908152600860209081526040808320949094559188168152600c909152205460ff16612153576026546001600160a01b03868116600081815260086020526040808220548151630a5b654b60e11b8152600481019490945260248401525192909316926314b6ca969260448084019382900301818387803b15801561214057600080fd5b505af1925050508015612151575060015b505b6001600160a01b0384166000908152600c602052604090205460ff166121e4576026546001600160a01b03858116600081815260086020526040808220548151630a5b654b60e11b8152600481019490945260248401525192909316926314b6ca969260448084019382900301818387803b1580156121d157600080fd5b505af19250505080156121e2575060015b505b602654600160a01b900460ff161561225c57602654602754604080516001624d3b8760e01b031981526004810192909252516001600160a01b039092169163ffb2c4799160248082019260009290919082900301818387803b15801561224957600080fd5b505af192505050801561225a575060015b505b836001600160a01b0316856001600160a01b0316600080516020612fbf833981519152836040518082815260200191505060405180910390a3506001949350505050565b6000610fbf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611dec565b602b805460ff19166001179055604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b03169183915060009061232a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061235857fe5b6001600160a01b03928316602091820292909201810191909152601d5460405163b6f9de9560e01b815260006004820181815287861660448401524260648401819052608060248501908152885160848601528851959097169663b6f9de95968b9694958a958c95939260a49092019187810191028083838b5b838110156123ea5781810151838201526020016123d2565b50505050905001955050505050506000604051808303818588803b15801561241157600080fd5b505af1158015612425573d6000803e3d6000fd5b5050602b805460ff19169055505050505050565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b038616600090815260089091529182205461248a918490611dec565b6001600160a01b0380861660009081526008602052604080822093909355908516815220546124b99083611d92565b6001600160a01b038085166000818152600860209081526040918290209490945580518681529051919392881692600080516020612fbf83398151915292918290030190a35060019392505050565b612510612d1d565b8061251f575061251f81611d27565b610d43576040805162461bcd60e51b815260206004820152601560248201527428393296a630bab731b410283937ba32b1ba34b7b760591b604482015290519081900360640190fd5b6006548111158061259157506001600160a01b0382166000908152600b602052604090205460ff165b6125d6576040805162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b604482015290519081900360640190fd5b5050565b6007546001600160a01b038316600090815260086020526040902054820111158061261d57506001600160a01b0382166000908152600d602052604090205460ff165b6125d6576040805162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015290519081900360640190fd5b601e546000906001600160a01b031633148015906126855750602b5460ff16155b8015612693575060295460ff165b80156126b05750602a543060009081526008602052604090205410155b905090565b602b805460ff19166001179055602a54601154108015906126dd5750600f54610100900460ff165b1561293a57602a546011546126f1916122a0565b601155602a54600090612705906002612e9d565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061273957fe5b6001600160a01b03928316602091820292909201015260035482519116908290600190811061276457fe5b6001600160a01b03928316602091820292909201810191909152601d5460405163791ac94760e01b8152600481018681526000602483018190523060648401819052426084850181905260a060448601908152895160a487015289514799979097169763791ac947978c9795968c9690939260c49091019187820191028083838b5b838110156127fe5781810151838201526020016127e6565b505050509050019650505050505050600060405180830381600087803b15801561282757600080fd5b505af115801561283b573d6000803e3d6000fd5b50505050600061285482476122a090919063ffffffff16565b601d546018546040805163f305d71960e01b81523060048201526024810189905260006044820181905260648201526001600160a01b0392831660848201524260a4820152905193945091169163f305d71991849160c480830192606092919082900301818588803b1580156128c957600080fd5b505af11580156128dd573d6000803e3d6000fd5b50505050506040513d60608110156128f457600080fd5b5050604080518281526020810186905281517f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b4506929181900390910190a150505050612c78565b602a54604080516002808252606082018352600092602083019080368337019050509050308160008151811061296c57fe5b6001600160a01b03928316602091820292909201015260035482519116908290600190811061299757fe5b6001600160a01b03928316602091820292909201810191909152601d5460405163791ac94760e01b8152600481018681526000602483018190523060648401819052426084850181905260a060448601908152895160a487015289514799979097169763791ac947978c9795968c9690939260c49091019187820191028083838b5b83811015612a31578181015183820152602001612a19565b505050509050019650505050505050600060405180830381600087803b158015612a5a57600080fd5b505af1158015612a6e573d6000803e3d6000fd5b505050506000612a8782476122a090919063ffffffff16565b90506000612aac601654612aa660135485612edf90919063ffffffff16565b90612e9d565b90506000612acb601654612aa660145486612edf90919063ffffffff16565b90506000612aea601654612aa660155487612edf90919063ffffffff16565b9050602660009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b3c57600080fd5b505af193505050508015612b4e575060015b506019546040516000916001600160a01b03169061753090859084818181858888f193505050503d8060008114612ba1576040519150601f19603f3d011682016040523d82523d6000602084013e612ba6565b606091505b505090508015612bc157601b54612bbd9084611d92565b601b555b601a546040516001600160a01b03909116906175309084906000818181858888f193505050503d8060008114612c13576040519150601f19603f3d011682016040523d82523d6000602084013e612c18565b606091505b50909150508015612c3457601c54612c309083611d92565b601c555b604080518981526020810187905281517f05ab84b321981d7d9a13402e494604c50821bcb5f2400d128fa06cd6451113d4929181900390910190a150505050505050505b602b805460ff19169055565b601e546000906001600160a01b03163314801590612ca55750602b5460ff16155b8015612cb3575060205460ff165b8015612cc55750436024546025540111155b80156126b057505060235447101590565b602354600454612cef91906001600160a01b03166122e2565b43602555602354602254612d0291611d92565b60228190556021541015612d1b576020805460ff191690555b565b601f54151590565b43601f556026805460ff60a01b1916600160a01b1790556040517f02ac8168caf2f254b394bd39e19417c5c28124ab89c9bc2d44921b19808e266990600090a1565b600f5460009060ff168015610cec5750506001600160a01b03166000908152600a602052604090205460ff161590565b601754601e546000918291612dc99190612aa690612dc2906001600160a01b0389811691161461194d565b8690612edf565b30600090815260086020526040902054909150612de69082611d92565b30600081815260086020908152604091829020939093558051848152905191926001600160a01b03891692600080516020612fbf8339815191529281900390910190a3601e546001600160a01b038581169116148015612e4d5750600f54610100900460ff165b15612e8a57612e86612e7d612e6f601054601654611d9290919063ffffffff16565b601054612aa6908590612edf565b60115490611d92565b6011555b612e9483826122a0565b95945050505050565b6000610fbf83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f38565b600082612eee57506000610cec565b82820282848281612efb57fe5b0414610fbf5760405162461bcd60e51b8152600401808060200182810382526021815260200180612f9e6021913960400191505060405180910390fd5b60008183612f875760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e40578181015183820152602001611e28565b506000838581612f9357fe5b049594505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122084f8d8d29e162c429b8ebcced5ac8ae9d2365616fc61bb82a126052ea77bdadb64736f6c63430007060033