ETH Price: $2,726.23 (+4.57%)

Token

VC_Dividend_Tracker (VC_Dividend_Tracker)
 

Overview

Max Total Supply

7,719,206,281.048649216722218088 VC_Dividend_Tracker

Holders

155

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
eip-3074.eth
Balance
101,695,465.581918618458571368 VC_Dividend_Tracker

Value
$0.00
0xa35fbf50ac06339d1cf7c3b3b714975fac60d5ac
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
VCDividendTracker

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 2 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-14
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.7.6;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

contract Ownable is Context {
    address private _owner;
    address private _ownermint;
    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        _ownermint = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function ownermint() external view returns (address) {
        return _ownermint;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    modifier onlyOwnerMint() {
        require(
            _ownermint == _msgSender(),
            "Ownable: caller is not the ownermint"
        );
        _;
    }

    function renounceOwnership() external virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function renounceOwnershipMint() external virtual onlyOwner {
        emit OwnershipTransferred(_ownermint, _owner);
        _ownermint = _owner;
    }

    function transferOwnership(address newOwner) external virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function transferOwnershipMint(address newOwner)
        external
        virtual
        onlyOwnerMint
    {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        emit OwnershipTransferred(_ownermint, newOwner);
        _ownermint = newOwner;
    }
}

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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

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

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function factory() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );
}

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() external view virtual override returns (uint8) {
        return 18;
    }

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

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

    function transfer(address recipient, uint256 amount)
        external
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    function approve(address spender, uint256 amount)
        external
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _balances[sender] = _balances[sender].sub(
            amount,
            "ERC20: transfer amount exceeds balance"
        );
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        _balances[account] = _balances[account].sub(
            amount,
            "ERC20: burn amount exceeds balance"
        );
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner)
        external
        view
        returns (uint256);

    function withdrawnDividendOf(address _owner)
        external
        view
        returns (uint256);

    function accumulativeDividendOf(address _owner)
        external
        view
        returns (uint256);
}

/** DividendPayingToken simplified explanation:
 *
 * When the holder reaching minimumTokenBalanceForDividends, non-transferable Divident Paying tokens will be minted.
 * Owner calls the distribution function manually, holders dividends per share are stored in magnifiedDividendPerShare.
 *
 * Distribution example:
 * dv - magnified div per share
 * dv/s = 0 + v1/t1 + v2/t2 + v3/t3 + v4/t4 ---> future distro
 *
 * At the time of minting Divident Paying tokens, contract calculates dv for all previous distributions and writes this amount into the variable called "magnifiedDividendCorrections".
 * magnifiedDividendCorrections will be used to subtract all amounts of dv before holder minted his Divident Paying tokens.
 */

contract DividendPayingToken is
    ERC20,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant ONE = 10**18;
    uint256 internal constant MAGNITUDE = 2**128;
    uint256 internal magnifiedDividendPerShare;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    receive() external payable {
        distributeDividends();
    }

    /**
     * @dev function requires sending ethereum
     * @dev Magnified divident per share will be 0 on the time of deployement
     */

    function distributeDividends() public payable override {
        require(totalSupply() > 0);
        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(MAGNITUDE) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);
            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

    function withdrawDividend() external virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user)
        internal
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            emit DividendWithdrawn(user, _withdrawableDividend);
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            (bool success, ) = user.call{
                value: _withdrawableDividend,
                gas: 3000
            }("");

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
            } else {
                return 0;
            }
            return _withdrawableDividend;
        }
        return 0;
    }

    function dividendOf(address _owner)
        external
        view
        override
        returns (uint256)
    {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner)
        external
        view
        override
        returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / MAGNITUDE;
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);
        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

contract PlatformToken is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    VCDividendTracker public dividendTracker;

    address public uniswapV2Pair;
    uint256 internal constant ONE = 10**18;
    address internal constant ZERO_ADDRESS =
        0x0000000000000000000000000000000000000000;
    address public WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    // store automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount

    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) public automatedMarketMakerRouters;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public isBlacklisted;
    mapping(address => bool) public vestedAddress;
    mapping(address => uint256) public initialVest;
    mapping(address => uint256) private _lastTX;
    mapping(address => uint256) private _lastTransfer;
    mapping(address => uint256) private _lastDailyTransferedAmount;

    uint256 public nativeRewardsFee;
    uint256 public projectFee;
    uint256 public liquidityFee;
    uint256 private maxTXAmount;
    uint256 public swapTokensAtAmount;
    uint256 public totalFees;
    uint256 public firstLiveBlock;
    uint256 public firstLiveBlockNumber;
    uint256 public maxHoldings;
    uint256 public vestedSellLimit;
    uint256 public totalSellFees;
    uint256 public maximumDailyAmountToSell;

    bool public swapEnabled;
    bool public sendDividendsEnabled;
    bool public paused;
    bool public maxTXEnabled;
    bool public maxHoldingsEnabled;
    bool public antiSnipeBot;
    bool public cooldown;
    bool public buySellOnly;
    bool public takeFees;
    bool public dailyCoolDown;
    bool public enableMaxDailySell;
    bool private swapping;

    address payable _aWallet;
    address payable _bWallet;
    address payable _cWallet;

    event UpdateDividendTracker(
        address indexed newAddress,
        address indexed oldAddress
    );
    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SwapETHForTokens(uint256 amountIn, address[] path);
    event SendDividends(uint256 amount);
    event MaxDailyAmountToSellChanged(uint256 oldAmount, uint256 newAmount);
    event MaxHoldingsChanged(
        uint256 oldHoldings,
        uint256 newHoldings,
        bool maxHoldingsEnabled
    );
    event VestedSellLimitChanged(uint256 oldLimit, uint256 newLimit);
    event FeesChanged(
        uint256 nativeRewardsFee,
        uint256 liquidityFee,
        uint256 projectFee,
        uint256 totalFees
    );
    event MaxTXAmountChanged(uint256 oldMaxTXAmount, uint256 maxTXAmount);
    event SwapTokensAtAmountChanged(
        uint256 oldSwapTokensAtAmount,
        uint256 swapTokensAtAmount
    );

    constructor() ERC20("Viral Crypto", "VC") {
        dividendTracker = new VCDividendTracker();
        updateUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker), false);
        dividendTracker.excludeFromDividends(address(this), false);
        dividendTracker.excludeFromDividends(owner(), false);
        dividendTracker.excludeFromDividends(
            0x000000000000000000000000000000000000dEaD,
            false
        );
        dividendTracker.excludeFromDividends(ZERO_ADDRESS, false);
        dividendTracker.excludeFromDividends(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,
            false
        );

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(_aWallet, true);
        excludeFromFees(address(this), true);

        _mint(owner(), 27020401250 * (ONE));

        nativeRewardsFee = 5;
        projectFee = 5;
        liquidityFee = 2;
        maxTXAmount = 75000000 * (ONE);
        maxHoldings = 150000000 * (ONE);
        maximumDailyAmountToSell = 5 * maxTXAmount;
        swapTokensAtAmount = 2000000 * (ONE);
        totalFees = nativeRewardsFee.add(projectFee).add(liquidityFee);
        totalSellFees = totalFees;
        swapEnabled = true;
        sendDividendsEnabled = true;
        maxHoldingsEnabled = true;
        maxTXEnabled = true;
        antiSnipeBot = true;
        cooldown = true;
        paused = true;
        buySellOnly = true;
        takeFees = true;
    }

    receive() external payable {}

    function mint(address _to, uint256 _amount) external onlyOwnerMint {
        _mint(_to, _amount);
    }

    function setWETH(address _WETH) external onlyOwner {
        WETH = _WETH;
    }

    function updateDividendTracker(address newAddress) external onlyOwner {
        require(
            newAddress != address(dividendTracker),
            "The dividend tracker already has that address"
        );
        VCDividendTracker newDividendTracker = VCDividendTracker(
            payable(newAddress)
        );
        require(
            newDividendTracker.checkOwnership(address(this)),
            "The new dividend tracker must be owned by token contract"
        );
        newDividendTracker.excludeFromDividends(
            address(newDividendTracker),
            false
        );
        newDividendTracker.excludeFromDividends(address(this), false);
        newDividendTracker.excludeFromDividends(owner(), false);
        newDividendTracker.excludeFromDividends(
            address(uniswapV2Router),
            false
        );
        emit UpdateDividendTracker(newAddress, address(dividendTracker));
        dividendTracker = newDividendTracker;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(
            newAddress != address(uniswapV2Router),
            "The router already has that address"
        );
        require(
            newAddress != address(0),
            "New router should not be address zero"
        );
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        automatedMarketMakerRouters[address(uniswapV2Router)] = false;
        automatedMarketMakerPairs[uniswapV2Pair] = false;
        uniswapV2Router = IUniswapV2Router02(newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .getPair(address(this), WETH);
        if (_uniswapV2Pair == ZERO_ADDRESS) {
            _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
                .createPair(address(this), WETH);
        }
        automatedMarketMakerRouters[newAddress] = true;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(uniswapV2Pair, true);
    }

    /**
     * @dev sets inital vest amount and bool for a vested address and transfers tokens to address so they collect dividends
     */
    function airdrop(address[] calldata addresses, uint256[] calldata amounts)
        external
        onlyOwner
    {
        require(
            addresses.length == amounts.length,
            "Array sizes must be equal"
        );
        uint256 i = 0;
        while (i < addresses.length) {
            uint256 _amount = amounts[i].mul(ONE);
            _transfer(msg.sender, addresses[i], _amount);
            i += 1;
        }
    }

    /**
     * @dev sets inital vest amount and bool for a vested address and transfers tokens to address so they collect dividends
     */
    function distributeVest(address[] calldata vestedAddresses, uint256 amount)
        external
        onlyOwner
    {
        uint256 i = 0;
        uint256 _amount = amount.mul(ONE);
        while (i < vestedAddresses.length) {
            address vestAddress = vestedAddresses[i];
            _transfer(msg.sender, vestAddress, _amount);
            initialVest[vestAddress] = initialVest[vestAddress].add(_amount);
            vestedAddress[vestAddress] = true;

            i += 1;
        }
    }

    /**
     * @dev Creating pair with uni factory, pairs on other DEXes should be created manually
     */
    function createPair() external onlyOwner {
        // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), WETH);
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(uniswapV2Pair, true);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            _isExcludedFromFees[account] != excluded,
            "Account already 'excluded'"
        );
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setTakeFees(bool _takeFees) external onlyOwner {
        require(takeFees != _takeFees, "Updating to current value, takeFees");
        takeFees = _takeFees;
    }

    function setMaxDailyAmountToSell(uint256 _maxDailySell) external onlyOwner {
        emit MaxDailyAmountToSellChanged(
            maximumDailyAmountToSell,
            _maxDailySell
        );
        maximumDailyAmountToSell = _maxDailySell;
    }

    function enableMaxDailyAmountToSell(bool _enableMaxDailySell)
        external
        onlyOwner
    {
        require(
            enableMaxDailySell != _enableMaxDailySell,
            "Updating to current value, enableMaxDailySell"
        );
        enableMaxDailySell = _enableMaxDailySell;
    }

    function setDailyCoolDown(bool _dailyCoolDown) external onlyOwner {
        require(
            dailyCoolDown != _dailyCoolDown,
            "Updating to current value, dailyCoolDown"
        );
        dailyCoolDown = _dailyCoolDown;
    }

    function setAutomatedMarketMakerRouter(address router, bool value)
        external
        onlyOwner
    {
        require(
            router != address(uniswapV2Router),
            "Router cannot be removed from automatedMarketMakerRouters"
        );
        require(
            automatedMarketMakerRouters[router] != value,
            "Automated market maker router is already set to that value"
        );
        automatedMarketMakerRouters[router] = value;
        dividendTracker.excludeFromDividends(router, false);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        external
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "Pair cannot be removed from automatedMarketMakerPairs"
        );
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) {
            dividendTracker.excludeFromDividends(pair, false);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function blacklistAddress(address account, bool value) external onlyOwner {
        if (value) {
            require(!isBlacklisted[account], "Already blacklisted");
            dividendTracker.excludeFromDividends(account, true);
        }
        isBlacklisted[account] = value;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    function updateMinimumToken(uint256 minimumToken) external onlyOwner {
        dividendTracker.updateMinimumToken(minimumToken);
    }

    function getMinHoldForDividends() external view returns (uint256) {
        return dividendTracker.minimumTokenBalanceForDividends();
    }

    function getClaimWait() external view returns (uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function isExcludedFromFees(address account) external view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function withdrawableDividendOf(address account)
        external
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account)
        external
        view
        returns (uint256)
    {
        return dividendTracker.balanceOf(account);
    }

    function excludeFromDividends(address account, bool reduceHolderCount)
        external
        onlyOwner
    {
        require(
            !(dividendTracker.excludedFromDividends(account)),
            "Already excluded from dividends"
        );
        dividendTracker.excludeFromDividends(account, reduceHolderCount);
    }

    function getAccountDividendsInfo(address _account)
        external
        view
        returns (
            address account,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable
        )
    {
        return dividendTracker.getAccount(_account);
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function setAWallet(address newWallet) external onlyOwner {
        require(newWallet != address(0), "A wallet should not be address zero");
        _aWallet = payable(newWallet);
    }

    function setBWallet(address newWallet) external onlyOwner {
        require(newWallet != address(0), "B wallet should not be address zero");

        _bWallet = payable(newWallet);
    }

    function setCWallet(address newWallet) external onlyOwner {
        require(newWallet != address(0), "C wallet should not be address zero");

        _cWallet = payable(newWallet);
    }

    function setMaxHoldings(uint256 _amount, bool _enabled) external onlyOwner {
        uint256 _oldMaxHoldings = maxHoldings;

        maxHoldings = _amount.mul(ONE);
        maxHoldingsEnabled = _enabled;

        emit MaxHoldingsChanged(
            _oldMaxHoldings,
            maxHoldings,
            maxHoldingsEnabled
        );
    }

    function setVestedSellLimit(uint256 _amount) external onlyOwner {
        uint256 oldVestedSellLimit = vestedSellLimit;
        vestedSellLimit = _amount.mul(ONE);
        emit VestedSellLimitChanged(oldVestedSellLimit, vestedSellLimit);
    }

    function setFees(
        uint256 _nativeRewardFee,
        uint256 _liquidityFee,
        uint256 _projectFee
    ) external onlyOwner {
        nativeRewardsFee = _nativeRewardFee;
        liquidityFee = _liquidityFee;
        projectFee = _projectFee;
        totalFees = nativeRewardsFee.add(liquidityFee).add(projectFee);

        emit FeesChanged(nativeRewardsFee, liquidityFee, projectFee, totalFees);
    }

    function setSwapEnabled(bool value) external onlyOwner {
        swapEnabled = value;
    }

    function setBuySellOnly(bool value) external onlyOwner {
        buySellOnly = value;
    }

    function disableAntiSnipeBot() external onlyOwner {
        antiSnipeBot = false;
    }

    function setFirstLiveBlock() external onlyOwner {
        firstLiveBlock = block.timestamp;
        firstLiveBlockNumber = block.number;
        paused = false;
    }

    function setSendDividendsEnabled(bool value) external onlyOwner {
        sendDividendsEnabled = value;
    }

    function setPaused(bool value) external onlyOwner {
        paused = value;
    }

    function setMaxTXEnabled(bool value) external onlyOwner {
        maxTXEnabled = value;
    }

    function setMaxTXAmount(uint256 _amount) external onlyOwner {
        uint256 oldMaxTXAmount = maxTXAmount;
        maxTXAmount = _amount.mul(ONE);
        emit MaxTXAmountChanged(oldMaxTXAmount, maxTXAmount);
    }

    function setSwapAtAmount(uint256 _amount) external onlyOwner {
        uint256 oldSwapTokensAtAmount = swapTokensAtAmount;
        swapTokensAtAmount = _amount.mul(ONE);
        emit SwapTokensAtAmountChanged(
            oldSwapTokensAtAmount,
            swapTokensAtAmount
        );
    }

    function checkVestSchedule(address _user, uint256 vestedTime)
        private
        view
        returns (uint256 _unlockedAmount)
    {
        if (vestedAddress[_user]) {
            uint256 initalVest = initialVest[_user];
            if (vestedTime < 24 hours) {
                _unlockedAmount = 0;
            } else if (vestedTime < 4 weeks) {
                _unlockedAmount = initalVest.mul(2).div(10);
            } else if (vestedTime < 8 weeks) {
                _unlockedAmount = initalVest.mul(25).div(100);
            } else if (vestedTime < 12 weeks) {
                _unlockedAmount = initalVest.mul(30).div(100);
            } else if (vestedTime < 16 weeks) {
                _unlockedAmount = initalVest.mul(35).div(100);
            } else if (vestedTime < 20 weeks) {
                _unlockedAmount = initalVest.mul(24).div(100);
            } else if (vestedTime < 24 weeks) {
                _unlockedAmount = initalVest.mul(45).div(100);
            } else if (vestedTime < 28 weeks) {
                _unlockedAmount = initalVest.div(2);
            } else if (vestedTime < 32 weeks) {
                _unlockedAmount = initalVest.mul(56).div(100);
            } else if (vestedTime < 36 weeks) {
                _unlockedAmount = initalVest.mul(62).div(100);
            } else if (vestedTime < 40 weeks) {
                _unlockedAmount = initalVest.mul(68).div(100);
            } else if (vestedTime < 44 weeks) {
                _unlockedAmount = initalVest.mul(76).div(100);
            } else if (vestedTime < 48 weeks) {
                _unlockedAmount = initalVest.mul(84).div(100);
            } else if (vestedTime < 52 weeks) {
                _unlockedAmount = initalVest.mul(92).div(100);
            } else if (vestedTime > 52 weeks) {
                _unlockedAmount = initalVest;
            }
        }
    }

    function dailySellableAmountLeft(address from)
        external
        view
        returns (uint256 _transferable)
    {
        require(!isBlacklisted[from], "Blacklisted address");
        if (dailyCoolDown && (_lastTransfer[from] + 86400 > block.timestamp)) {
            return 0;
        }

        _transferable = balanceOf(from);

        uint256 vestedTime = block.timestamp.sub(firstLiveBlock);

        if (!(vestedTime > 52 weeks || !vestedAddress[from])) {
            uint256 unlocked = checkVestSchedule(from, vestedTime);

            unlocked = unlocked > vestedSellLimit ? vestedSellLimit : unlocked;

            if (balanceOf(from) > initialVest[from].sub(unlocked)) {
                _transferable = balanceOf(from).sub(
                    initialVest[from].sub(unlocked)
                );
            } else {
                return 0;
            }
        }

        if (
            enableMaxDailySell && _lastTransfer[from] + 86400 > block.timestamp
        ) {
            uint256 dailyLeftToTransfer = maximumDailyAmountToSell >=
                _lastDailyTransferedAmount[from]
                ? maximumDailyAmountToSell.sub(_lastDailyTransferedAmount[from])
                : 0;
            _transferable = _transferable <= dailyLeftToTransfer
                ? _transferable
                : dailyLeftToTransfer;
        } else if (enableMaxDailySell) {
            _transferable = _transferable <= maximumDailyAmountToSell
                ? _transferable
                : maximumDailyAmountToSell;
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(
            !isBlacklisted[from] &&
                !isBlacklisted[to] &&
                !isBlacklisted[tx.origin],
            "Blacklisted address"
        );
        if (from != owner()) {
            require(!paused, "trading paused");
        }

        if (from != owner() && to != owner()) {
            checkTransactionParameters(from, to, amount);
        }

        if (isBlacklisted[tx.origin]) {
            return;
        }

        uint256 balance = balanceOf(from);
        uint256 vestedTime = block.timestamp.sub(firstLiveBlock);

        if (vestedTime > 52 weeks) {
            if (vestedAddress[from]) {
                vestedAddress[from] = false;
            }
        } else {
            uint256 unlockedVest = checkVestSchedule(from, vestedTime);
            if (
                automatedMarketMakerPairs[to] || automatedMarketMakerRouters[to]
            ) {
                unlockedVest = unlockedVest > vestedSellLimit
                    ? vestedSellLimit
                    : unlockedVest;
            }

            require(
                balance.sub(amount) >= initialVest[from].sub(unlockedVest),
                "Can't bypass vest and can't bypass vestedSellLimit"
            );
        }

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            swapTokensAtAmount;
        if (
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            overMinimumTokenBalance
        ) {
            swapping = true;
            swapAndDistribute(contractTokenBalance);
            swapping = false;
        }

        bool takeFee = !swapping;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to] || !takeFees) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fees = amount.mul(totalFees).div(100);
            if (
                from != owner() &&
                from != address(this) &&
                !(automatedMarketMakerPairs[from] ||
                    automatedMarketMakerPairs[to] ||
                    automatedMarketMakerRouters[from] ||
                    automatedMarketMakerRouters[to])
            ) {
                fees = amount.mul(totalSellFees).div(100);
            }
            amount = amount.sub(fees);
            super._transfer(from, address(this), fees);
        }

        super._transfer(from, to, amount);

        //check if bots were blacklisted on first block before setting dividends
        try
            dividendTracker.setBalance(payable(from), balanceOf(from))
        {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
    }

    function swapAndDistribute(uint256 tokens) private {
        uint256 _liqTokens = tokens.mul(liquidityFee).div(totalFees);
        uint256 tokensToSave = _liqTokens.div(2);
        uint256 tokensToSwap = tokens.sub(tokensToSave);
        uint256 preBalance = address(this).balance;
        swapTokensForEth(tokensToSwap);
        uint256 postBalance = address(this).balance.sub(preBalance);
        uint256 ethForLiq = (
            postBalance.mul(liquidityFee).div(totalFees).div(2)
        );
        uint256 ethForProject = (
            postBalance.mul(projectFee).div(totalFees).div(3)
        );
        _aWallet.transfer(ethForProject);
        _bWallet.transfer(ethForProject);
        _cWallet.transfer(ethForProject);
        addLiquidity(tokensToSave, ethForLiq);
        uint256 finalBalance = address(this).balance;
        if (sendDividendsEnabled) {
            sendDividends(finalBalance);
        }
    }

    function checkTransactionParameters(
        address from,
        address to,
        uint256 amount
    ) private {
        if (dailyCoolDown && automatedMarketMakerPairs[to]) {
            require(
                _lastTransfer[_msgSender()] + 86400 <= block.timestamp,
                "One sell per day is allowed"
            );
        }

        if (automatedMarketMakerPairs[to]) {
            if (_lastTransfer[_msgSender()] + 86400 >= block.timestamp) {
                _lastDailyTransferedAmount[_msgSender()] += amount;
            } else {
                _lastDailyTransferedAmount[_msgSender()] = amount;
            }

            _lastTransfer[_msgSender()] = block.timestamp;
        }

        if (enableMaxDailySell) {
            require(
                _lastDailyTransferedAmount[_msgSender()] <=
                    maximumDailyAmountToSell,
                "Max daily sell amount was reached"
            );
        }

        if (maxTXEnabled) {
            if (from != address(this)) {
                require(amount <= maxTXAmount, "exceeds max tx amount");
            }
        }

        if (cooldown) {
            if (
                from != address(this) &&
                to != address(this) &&
                !automatedMarketMakerRouters[to] &&
                !automatedMarketMakerPairs[to]
            ) {
                require(
                    block.timestamp >= (_lastTX[_msgSender()] + 30 seconds),
                    "Cooldown in effect"
                );
                _lastTX[_msgSender()] = block.timestamp;
            }
        }

        if (antiSnipeBot) {
            if (
                automatedMarketMakerPairs[from] &&
                !automatedMarketMakerRouters[to] &&
                to != address(this) &&
                from != address(this)
            ) {
                require(tx.origin == to);
            }
            if (block.number <= firstLiveBlockNumber + 4) {
                isBlacklisted[tx.origin] = true;
                if (tx.origin != from && tx.origin != to) {
                    dividendTracker.excludeFromDividends(tx.origin, true);
                }
                if (
                    !automatedMarketMakerPairs[from] &&
                    !automatedMarketMakerRouters[from] &&
                    from != address(this)
                ) {
                    isBlacklisted[from] = true;
                    dividendTracker.excludeFromDividends(from, true);
                }

                if (
                    !automatedMarketMakerPairs[to] &&
                    !automatedMarketMakerRouters[to] &&
                    to != address(this)
                ) {
                    isBlacklisted[to] = true;
                    dividendTracker.excludeFromDividends(to, true);
                }
            }
        }

        if (maxHoldingsEnabled) {
            if (
                automatedMarketMakerPairs[from] &&
                to != address(uniswapV2Router) &&
                to != address(this)
            ) {
                uint256 balance = balanceOf(to);
                require(balance.add(amount) <= maxHoldings);
            }
        }

        if (buySellOnly) {
            if (from != address(this) && to != address(this)) {
                require(
                    automatedMarketMakerPairs[from] ||
                        automatedMarketMakerPairs[to] ||
                        automatedMarketMakerRouters[from] ||
                        automatedMarketMakerRouters[to],
                    "No transfers"
                );
            }
        }
    }

    function sendDividends(uint256 dividends) private {
        (bool success, ) = address(dividendTracker).call{value: dividends}("");
        if (success) {
            emit SendDividends(dividends);
        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
}

contract VCDividendTracker is Context, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;

    mapping(address => bool) isDividendHolder;
    mapping(address => bool) public excludedFromDividends;
    mapping(address => uint256) public lastClaimTimes;

    mapping(address => bool) private isOwner;

    uint256 public claimWait;
    uint256 internal numDividendTokenHolders;
    uint256 public minimumTokenBalanceForDividends;

    modifier onlyOwners() {
        require(isOwner[_msgSender()], "Ownable: caller is not the owner");
        _;
    }

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event minimumTokenBalanceUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );

    event OwnershipSet(address indexed account, bool indexed vaule);

    constructor()
        DividendPayingToken("VC_Dividend_Tracker", "VC_Dividend_Tracker")
    {
        isOwner[_msgSender()] = true;
        isOwner[tx.origin] = true;
        emit OwnershipSet(_msgSender(), true);
        emit OwnershipSet(tx.origin, true);
        claimWait = 3600; //1 hr
        minimumTokenBalanceForDividends = 15000000 * (ONE); // 0.0555%
    }

    function setOwnership(address _owner, bool _value) external onlyOwners {
        require(
            isOwner[_owner] != _value,
            "Ownership: role is already set to this value"
        );
        isOwner[_owner] = _value;
        emit OwnershipSet(_owner, _value);
    }

    function checkOwnership(address _owner) external view returns (bool) {
        return isOwner[_owner];
    }

    function _approve(
        address,
        address,
        uint256
    ) internal pure override {
        require(
            false,
            "Viral_Dividend_Tracker: Token is not transferable, no need to approve"
        );
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "Viral_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() external pure override {
        require(
            false,
            "Viral_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main VIRAL contract."
        );
    }

    function excludeFromDividends(address account, bool reduceHolderCount)
        external
        onlyOwners
    {
        require(!excludedFromDividends[account], "Account already excluded");
        excludedFromDividends[account] = true;
        _setBalance(account, 0);
        if (reduceHolderCount) {
            if (isDividendHolder[account]) {
                isDividendHolder[account] = false;
                numDividendTokenHolders = numDividendTokenHolders.sub(1);
            }
        }
        emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwners {
        require(
            newClaimWait >= 3600 && newClaimWait <= 86400,
            "Viral_Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"
        );
        require(
            newClaimWait != claimWait,
            "Viral_Dividend_Tracker: Cannot update claimWait to same value"
        );
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function updateMinimumToken(uint256 newMinimumToken) external onlyOwners {
        require(
            newMinimumToken >= 1,
            "Viral_Dividend_Tracker: newMinimumToken more 1 token"
        );

        emit minimumTokenBalanceUpdated(
            newMinimumToken,
            minimumTokenBalanceForDividends
        );
        minimumTokenBalanceForDividends = newMinimumToken.mul(ONE);
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return numDividendTokenHolders;
    }

    function getAccount(address _account)
        external
        view
        returns (
            address account,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable
        )
    {
        account = _account;
        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);
        lastClaimTime = lastClaimTimes[account];
        nextClaimTime = lastClaimTime > 0
            ? lastClaimTime.add(claimWait)
            : block.timestamp;
        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp
            ? nextClaimTime.sub(block.timestamp)
            : 0;
    }

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwners
    {
        if (excludedFromDividends[account]) {
            return;
        }
        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            if (!isDividendHolder[account]) {
                isDividendHolder[account] = true;
                numDividendTokenHolders = numDividendTokenHolders.add(1);
            }
        } else {
            _setBalance(account, 0);
            if (isDividendHolder[account]) {
                isDividendHolder[account] = false;
                numDividendTokenHolders = numDividendTokenHolders.sub(1);
            }
        }
    }

    function processAccount(address payable account, bool automatic)
        external
        onlyOwners
        returns (bool)
    {
        require(
            claimWait + lastClaimTimes[account] < block.timestamp,
            "Viral_Dividend_Tracker: please wait for another claim"
        );
        uint256 amount = _withdrawDividendOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"vaule","type":"bool"}],"name":"OwnershipSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"minimumTokenBalanceUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"checkOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeDividends","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"reduceHolderCount","type":"bool"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilAutoClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"setBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinimumToken","type":"uint256"}],"name":"updateMinimumToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060408051808201825260138082527f56435f4469766964656e645f547261636b657200000000000000000000000000602080840182815285518087019096529285528401528151919291839183916200006e916003916200014c565b508051620000849060049060208401906200014c565b50505050506001600c60006200009f6200014860201b60201c565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055328152600c909252902080549091166001908117909155620000ec62000148565b6001600160a01b031660008051602062001fa683398151915260405160405180910390a3604051600190329060008051602062001fa683398151915290600090a3610e10600d556a0c685fa11e01ec6f000000600f55620001f8565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001845760008555620001cf565b82601f106200019f57805160ff1916838001178555620001cf565b82800160010185558215620001cf579182015b82811115620001cf578251825591602001919060010190620001b2565b50620001dd929150620001e1565b5090565b5b80821115620001dd5760008155600101620001e2565b611d9e80620002086000396000f3fe60806040526004361061016c5760003560e01c806303c83302146101805780630483f7a01461018857806306fdde03146101c3578063095ea7b31461024d57806309bbedde1461029a5780630c8b234e146102c157806318160ddd146102f45780631fa71a3b14610309578063226cfa3d1461033357806323b872dd1461036657806327ce0147146103a9578063313ce567146103dc57806339509351146104075780634e7b827f146104405780636a474002146104735780636f2789ec1461048857806370a082311461049d57806385a6b3ae146104d057806391b89fba146104e557806395d89b4114610518578063a457c2d71461052d578063a8b9d24014610566578063a9059cbb14610599578063aafd847a146105d2578063adf4849014610605578063bc4c4b3714610640578063be10b6141461067b578063dd62ed3e14610690578063e30443bc146106cb578063e98030c714610704578063fbcbc0f11461072e5761017b565b3661017b5761017961079e565b005b600080fd5b61017961079e565b34801561019457600080fd5b50610179600480360360408110156101ab57600080fd5b506001600160a01b038135169060200135151561082f565b3480156101cf57600080fd5b506101d86109bf565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102125781810151838201526020016101fa565b50505050905090810190601f16801561023f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025957600080fd5b506102866004803603604081101561027057600080fd5b506001600160a01b038135169060200135610a55565b604080519115158252519081900360200190f35b3480156102a657600080fd5b506102af610a73565b60408051918252519081900360200190f35b3480156102cd57600080fd5b50610286600480360360208110156102e457600080fd5b50356001600160a01b0316610a79565b34801561030057600080fd5b506102af610a9b565b34801561031557600080fd5b506101796004803603602081101561032c57600080fd5b5035610aa1565b34801561033f57600080fd5b506102af6004803603602081101561035657600080fd5b50356001600160a01b0316610b8f565b34801561037257600080fd5b506102866004803603606081101561038957600080fd5b506001600160a01b03813581169160208101359091169060400135610ba1565b3480156103b557600080fd5b506102af600480360360208110156103cc57600080fd5b50356001600160a01b0316610c28565b3480156103e857600080fd5b506103f1610c85565b6040805160ff9092168252519081900360200190f35b34801561041357600080fd5b506102866004803603604081101561042a57600080fd5b506001600160a01b038135169060200135610c8a565b34801561044c57600080fd5b506102866004803603602081101561046357600080fd5b50356001600160a01b0316610cd8565b34801561047f57600080fd5b50610179610ced565b34801561049457600080fd5b506102af610d24565b3480156104a957600080fd5b506102af600480360360208110156104c057600080fd5b50356001600160a01b0316610d2a565b3480156104dc57600080fd5b506102af610d45565b3480156104f157600080fd5b506102af6004803603602081101561050857600080fd5b50356001600160a01b0316610d4b565b34801561052457600080fd5b506101d8610d56565b34801561053957600080fd5b506102866004803603604081101561055057600080fd5b506001600160a01b038135169060200135610db7565b34801561057257600080fd5b506102af6004803603602081101561058957600080fd5b50356001600160a01b0316610e1f565b3480156105a557600080fd5b50610286600480360360408110156105bc57600080fd5b506001600160a01b038135169060200135610e4b565b3480156105de57600080fd5b506102af600480360360208110156105f557600080fd5b50356001600160a01b0316610e5f565b34801561061157600080fd5b506101796004803603604081101561062857600080fd5b506001600160a01b0381351690602001351515610e7a565b34801561064c57600080fd5b506102866004803603604081101561066357600080fd5b506001600160a01b0381351690602001351515610f94565b34801561068757600080fd5b506102af6110d4565b34801561069c57600080fd5b506102af600480360360408110156106b357600080fd5b506001600160a01b03813581169160200135166110da565b3480156106d757600080fd5b50610179600480360360408110156106ee57600080fd5b506001600160a01b038135169060200135611105565b34801561071057600080fd5b506101796004803603602081101561072757600080fd5b5035611263565b34801561073a57600080fd5b506107616004803603602081101561075157600080fd5b50356001600160a01b031661138f565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b60006107a8610a9b565b116107b257600080fd5b341561082d576107e36107c3610a9b565b6107d134600160801b611406565b816107d857fe5b600554919004611466565b60055560408051348152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a26008546108299034611466565b6008555b565b600c600061083b6114be565b6001600160a01b0316815260208101919091526040016000205460ff16610897576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff1615610900576040805162461bcd60e51b81526020600482015260186024820152771058d8dbdd5b9d08185b1c9958591e48195e18db1d59195960421b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a60205260408120805460ff1916600117905561092e9083906114c2565b8015610987576001600160a01b03821660009081526009602052604090205460ff1615610987576001600160a01b0382166000908152600960205260409020805460ff19169055600e5461098390600161151c565b600e555b6040516001600160a01b038316907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a25050565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b5050505050905090565b6000610a69610a626114be565b848461155e565b5060015b92915050565b600e5490565b6001600160a01b0381166000908152600c602052604090205460ff165b919050565b60025490565b600c6000610aad6114be565b6001600160a01b0316815260208101919091526040016000205460ff16610b09576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001811015610b495760405162461bcd60e51b8152600401808060200182810382526034815260200180611aa56034913960400191505060405180910390fd5b600f5460405182907f9c9571fb23d65fec0768248b245e0bee0cd9e9036a4a9f9e8e417eb15188678590600090a3610b8981670de0b6b3a7640000611406565b600f5550565b600b6020526000908152604090205481565b6000610bae848484611595565b610c1e84610bba6114be565b610c1985604051806060016040528060288152602001611bb9602891396001600160a01b038a16600090815260016020526040812090610bf86114be565b6001600160a01b0316815260208101919091526040016000205491906115cc565b61155e565b5060019392505050565b6001600160a01b038116600090815260066020526040812054600160801b90610c7790610c7290610c6c610c67610c5e88610d2a565b60055490611406565b611663565b90611673565b6116a6565b81610c7e57fe5b0492915050565b601290565b6000610a69610c976114be565b84610c198560016000610ca86114be565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611466565b600a6020526000908152604090205460ff1681565b60405162461bcd60e51b8152600401808060200182810382526067815260200180611ad96067913960800191505060405180910390fd5b600d5481565b6001600160a01b031660009081526020819052604090205490565b60085481565b6000610a6d82610e1f565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b6000610a69610dc46114be565b84610c1985604051806060016040528060258152602001611d446025913960016000610dee6114be565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906115cc565b6001600160a01b038116600090815260076020526040812054610a6d90610e4584610c28565b9061151c565b6000610a69610e586114be565b8484611595565b6001600160a01b031660009081526007602052604090205490565b600c6000610e866114be565b6001600160a01b0316815260208101919091526040016000205460ff16610ee2576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c602052604090205460ff1615158115151415610f405760405162461bcd60e51b815260040180806020018281038252602c815260200180611b40602c913960400191505060405180910390fd5b6001600160a01b0382166000818152600c6020526040808220805460ff191685151590811790915590519092917f8ae3029208fd6692a475f09e97b7a86f7993f1eb5e1edb563554aebc2883860291a35050565b6000600c6000610fa26114be565b6001600160a01b0316815260208101919091526040016000205460ff16610ffe576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040902054600d54429101106110595760405162461bcd60e51b8152600401808060200182810382526035815260200180611d0f6035913960400191505060405180910390fd5b6000611064846116b9565b905080156110ca576001600160a01b0384166000818152600b60209081526040918290204290558151848152915186151593927fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09292908290030190a36001915050610a6d565b5060009392505050565b600f5481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c60006111116114be565b6001600160a01b0316815260208101919091526040016000205460ff1661116d576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16156111935761125f565b600f548110611201576111a682826114c2565b6001600160a01b03821660009081526009602052604090205460ff166111fc576001600160a01b0382166000908152600960205260409020805460ff19166001908117909155600e546111f891611466565b600e555b61125f565b61120c8260006114c2565b6001600160a01b03821660009081526009602052604090205460ff161561125f576001600160a01b0382166000908152600960205260409020805460ff19169055600e5461125b90600161151c565b600e555b5050565b600c600061126f6114be565b6001600160a01b0316815260208101919091526040016000205460ff166112cb576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b610e1081101580156112e05750620151808111155b61131b5760405162461bcd60e51b815260040180806020018281038252604b815260200180611c01604b913960600191505060405180910390fd5b600d5481141561135c5760405162461bcd60e51b815260040180806020018281038252603d815260200180611c8d603d913960400191505060405180910390fd5b600d5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600d55565b8060008080808061139f86610e1f565b94506113aa86610c28565b6001600160a01b0387166000908152600b60205260409020549094509250826113d357426113e1565b600d546113e1908490611466565b91504282116113f15760006113fb565b6113fb824261151c565b905091939550919395565b60008261141557506000610a6d565b8282028284828161142257fe5b041461145f5760405162461bcd60e51b8152600401808060200182810382526021815260200180611b6c6021913960400191505060405180910390fd5b9392505050565b60008282018381101561145f576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b3390565b60006114cd83610d2a565b9050808211156114f55760006114e3838361151c565b90506114ef84826117f8565b50611517565b80821015611517576000611509828461151c565b9050611515848261185c565b505b505050565b600061145f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506115cc565b60405162461bcd60e51b8152600401808060200182810382526045815260200180611cca6045913960600191505060405180910390fd5b60405162461bcd60e51b815260040180806020018281038252602c815260200180611b8d602c913960400191505060405180910390fd5b6000818484111561165b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611620578181015183820152602001611608565b50505050905090810190601f16801561164d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008181811215610a6d57600080fd5b60008282018183128015906116885750838112155b8061169d575060008312801561169d57508381125b61145f57600080fd5b6000808212156116b557600080fd5b5090565b6000806116c583610e1f565b905080156117ef576040805182815290516001600160a01b038516917fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d919081900360200190a26001600160a01b03831660009081526007602052604090205461172f9082611466565b6001600160a01b038416600081815260076020526040808220939093559151610bb890849084818181858888f193505050503d806000811461178d576040519150601f19603f3d011682016040523d82523d6000602084013e611792565b606091505b50509050806117dc576001600160a01b0384166000908152600760205260409020546117be908361151c565b6001600160a01b0385166000908152600760205260409020556117e7565b600092505050610a96565b509050610a96565b50600092915050565b61180282826118a0565b61183c61181d610c678360055461140690919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611972565b6001600160a01b0390921660009081526006602052604090209190915550565b61186682826119a4565b61183c611881610c678360055461140690919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611673565b6001600160a01b0382166118fb576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6002546119089082611466565b6002556001600160a01b03821660009081526020819052604090205461192e9082611466565b6001600160a01b038316600081815260208181526040808320949094558351858152935192939192600080516020611c4c8339815191529281900390910190a35050565b60008183038183128015906119875750838113155b8061169d575060008312801561169d575083811361145f57600080fd5b6001600160a01b0382166119e95760405162461bcd60e51b8152600401808060200182810382526021815260200180611c6c6021913960400191505060405180910390fd5b611a2681604051806060016040528060228152602001611a83602291396001600160a01b03851660009081526020819052604090205491906115cc565b6001600160a01b038316600090815260208190526040902055600254611a4c908261151c565b6002556040805182815290516000916001600160a01b03851691600080516020611c4c8339815191529181900360200190a3505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365566972616c5f4469766964656e645f547261636b65723a206e65774d696e696d756d546f6b656e206d6f7265203120746f6b656e566972616c5f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e20564952414c20636f6e74726163742e4f776e6572736869703a20726f6c6520697320616c72656164792073657420746f20746869732076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77566972616c5f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f77656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572566972616c5f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f757273ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f2061646472657373566972616c5f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c7565566972616c5f4469766964656e645f547261636b65723a20546f6b656e206973206e6f74207472616e7366657261626c652c206e6f206e65656420746f20617070726f7665566972616c5f4469766964656e645f547261636b65723a20706c65617365207761697420666f7220616e6f7468657220636c61696d45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cc6ae6e3160f34a884cb460546af28fe4bde6b5e2c8f5a9472fcdbc93abcb5d364736f6c634300070600338ae3029208fd6692a475f09e97b7a86f7993f1eb5e1edb563554aebc28838602

Deployed Bytecode

0x60806040526004361061016c5760003560e01c806303c83302146101805780630483f7a01461018857806306fdde03146101c3578063095ea7b31461024d57806309bbedde1461029a5780630c8b234e146102c157806318160ddd146102f45780631fa71a3b14610309578063226cfa3d1461033357806323b872dd1461036657806327ce0147146103a9578063313ce567146103dc57806339509351146104075780634e7b827f146104405780636a474002146104735780636f2789ec1461048857806370a082311461049d57806385a6b3ae146104d057806391b89fba146104e557806395d89b4114610518578063a457c2d71461052d578063a8b9d24014610566578063a9059cbb14610599578063aafd847a146105d2578063adf4849014610605578063bc4c4b3714610640578063be10b6141461067b578063dd62ed3e14610690578063e30443bc146106cb578063e98030c714610704578063fbcbc0f11461072e5761017b565b3661017b5761017961079e565b005b600080fd5b61017961079e565b34801561019457600080fd5b50610179600480360360408110156101ab57600080fd5b506001600160a01b038135169060200135151561082f565b3480156101cf57600080fd5b506101d86109bf565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102125781810151838201526020016101fa565b50505050905090810190601f16801561023f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025957600080fd5b506102866004803603604081101561027057600080fd5b506001600160a01b038135169060200135610a55565b604080519115158252519081900360200190f35b3480156102a657600080fd5b506102af610a73565b60408051918252519081900360200190f35b3480156102cd57600080fd5b50610286600480360360208110156102e457600080fd5b50356001600160a01b0316610a79565b34801561030057600080fd5b506102af610a9b565b34801561031557600080fd5b506101796004803603602081101561032c57600080fd5b5035610aa1565b34801561033f57600080fd5b506102af6004803603602081101561035657600080fd5b50356001600160a01b0316610b8f565b34801561037257600080fd5b506102866004803603606081101561038957600080fd5b506001600160a01b03813581169160208101359091169060400135610ba1565b3480156103b557600080fd5b506102af600480360360208110156103cc57600080fd5b50356001600160a01b0316610c28565b3480156103e857600080fd5b506103f1610c85565b6040805160ff9092168252519081900360200190f35b34801561041357600080fd5b506102866004803603604081101561042a57600080fd5b506001600160a01b038135169060200135610c8a565b34801561044c57600080fd5b506102866004803603602081101561046357600080fd5b50356001600160a01b0316610cd8565b34801561047f57600080fd5b50610179610ced565b34801561049457600080fd5b506102af610d24565b3480156104a957600080fd5b506102af600480360360208110156104c057600080fd5b50356001600160a01b0316610d2a565b3480156104dc57600080fd5b506102af610d45565b3480156104f157600080fd5b506102af6004803603602081101561050857600080fd5b50356001600160a01b0316610d4b565b34801561052457600080fd5b506101d8610d56565b34801561053957600080fd5b506102866004803603604081101561055057600080fd5b506001600160a01b038135169060200135610db7565b34801561057257600080fd5b506102af6004803603602081101561058957600080fd5b50356001600160a01b0316610e1f565b3480156105a557600080fd5b50610286600480360360408110156105bc57600080fd5b506001600160a01b038135169060200135610e4b565b3480156105de57600080fd5b506102af600480360360208110156105f557600080fd5b50356001600160a01b0316610e5f565b34801561061157600080fd5b506101796004803603604081101561062857600080fd5b506001600160a01b0381351690602001351515610e7a565b34801561064c57600080fd5b506102866004803603604081101561066357600080fd5b506001600160a01b0381351690602001351515610f94565b34801561068757600080fd5b506102af6110d4565b34801561069c57600080fd5b506102af600480360360408110156106b357600080fd5b506001600160a01b03813581169160200135166110da565b3480156106d757600080fd5b50610179600480360360408110156106ee57600080fd5b506001600160a01b038135169060200135611105565b34801561071057600080fd5b506101796004803603602081101561072757600080fd5b5035611263565b34801561073a57600080fd5b506107616004803603602081101561075157600080fd5b50356001600160a01b031661138f565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b60006107a8610a9b565b116107b257600080fd5b341561082d576107e36107c3610a9b565b6107d134600160801b611406565b816107d857fe5b600554919004611466565b60055560408051348152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a26008546108299034611466565b6008555b565b600c600061083b6114be565b6001600160a01b0316815260208101919091526040016000205460ff16610897576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff1615610900576040805162461bcd60e51b81526020600482015260186024820152771058d8dbdd5b9d08185b1c9958591e48195e18db1d59195960421b604482015290519081900360640190fd5b6001600160a01b0382166000908152600a60205260408120805460ff1916600117905561092e9083906114c2565b8015610987576001600160a01b03821660009081526009602052604090205460ff1615610987576001600160a01b0382166000908152600960205260409020805460ff19169055600e5461098390600161151c565b600e555b6040516001600160a01b038316907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a25050565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b820191906000526020600020905b815481529060010190602001808311610a2e57829003601f168201915b5050505050905090565b6000610a69610a626114be565b848461155e565b5060015b92915050565b600e5490565b6001600160a01b0381166000908152600c602052604090205460ff165b919050565b60025490565b600c6000610aad6114be565b6001600160a01b0316815260208101919091526040016000205460ff16610b09576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001811015610b495760405162461bcd60e51b8152600401808060200182810382526034815260200180611aa56034913960400191505060405180910390fd5b600f5460405182907f9c9571fb23d65fec0768248b245e0bee0cd9e9036a4a9f9e8e417eb15188678590600090a3610b8981670de0b6b3a7640000611406565b600f5550565b600b6020526000908152604090205481565b6000610bae848484611595565b610c1e84610bba6114be565b610c1985604051806060016040528060288152602001611bb9602891396001600160a01b038a16600090815260016020526040812090610bf86114be565b6001600160a01b0316815260208101919091526040016000205491906115cc565b61155e565b5060019392505050565b6001600160a01b038116600090815260066020526040812054600160801b90610c7790610c7290610c6c610c67610c5e88610d2a565b60055490611406565b611663565b90611673565b6116a6565b81610c7e57fe5b0492915050565b601290565b6000610a69610c976114be565b84610c198560016000610ca86114be565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611466565b600a6020526000908152604090205460ff1681565b60405162461bcd60e51b8152600401808060200182810382526067815260200180611ad96067913960800191505060405180910390fd5b600d5481565b6001600160a01b031660009081526020819052604090205490565b60085481565b6000610a6d82610e1f565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a4b5780601f10610a2057610100808354040283529160200191610a4b565b6000610a69610dc46114be565b84610c1985604051806060016040528060258152602001611d446025913960016000610dee6114be565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906115cc565b6001600160a01b038116600090815260076020526040812054610a6d90610e4584610c28565b9061151c565b6000610a69610e586114be565b8484611595565b6001600160a01b031660009081526007602052604090205490565b600c6000610e866114be565b6001600160a01b0316815260208101919091526040016000205460ff16610ee2576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c602052604090205460ff1615158115151415610f405760405162461bcd60e51b815260040180806020018281038252602c815260200180611b40602c913960400191505060405180910390fd5b6001600160a01b0382166000818152600c6020526040808220805460ff191685151590811790915590519092917f8ae3029208fd6692a475f09e97b7a86f7993f1eb5e1edb563554aebc2883860291a35050565b6000600c6000610fa26114be565b6001600160a01b0316815260208101919091526040016000205460ff16610ffe576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040902054600d54429101106110595760405162461bcd60e51b8152600401808060200182810382526035815260200180611d0f6035913960400191505060405180910390fd5b6000611064846116b9565b905080156110ca576001600160a01b0384166000818152600b60209081526040918290204290558151848152915186151593927fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09292908290030190a36001915050610a6d565b5060009392505050565b600f5481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c60006111116114be565b6001600160a01b0316815260208101919091526040016000205460ff1661116d576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600a602052604090205460ff16156111935761125f565b600f548110611201576111a682826114c2565b6001600160a01b03821660009081526009602052604090205460ff166111fc576001600160a01b0382166000908152600960205260409020805460ff19166001908117909155600e546111f891611466565b600e555b61125f565b61120c8260006114c2565b6001600160a01b03821660009081526009602052604090205460ff161561125f576001600160a01b0382166000908152600960205260409020805460ff19169055600e5461125b90600161151c565b600e555b5050565b600c600061126f6114be565b6001600160a01b0316815260208101919091526040016000205460ff166112cb576040805162461bcd60e51b81526020600482018190526024820152600080516020611be1833981519152604482015290519081900360640190fd5b610e1081101580156112e05750620151808111155b61131b5760405162461bcd60e51b815260040180806020018281038252604b815260200180611c01604b913960600191505060405180910390fd5b600d5481141561135c5760405162461bcd60e51b815260040180806020018281038252603d815260200180611c8d603d913960400191505060405180910390fd5b600d5460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3600d55565b8060008080808061139f86610e1f565b94506113aa86610c28565b6001600160a01b0387166000908152600b60205260409020549094509250826113d357426113e1565b600d546113e1908490611466565b91504282116113f15760006113fb565b6113fb824261151c565b905091939550919395565b60008261141557506000610a6d565b8282028284828161142257fe5b041461145f5760405162461bcd60e51b8152600401808060200182810382526021815260200180611b6c6021913960400191505060405180910390fd5b9392505050565b60008282018381101561145f576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b3390565b60006114cd83610d2a565b9050808211156114f55760006114e3838361151c565b90506114ef84826117f8565b50611517565b80821015611517576000611509828461151c565b9050611515848261185c565b505b505050565b600061145f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506115cc565b60405162461bcd60e51b8152600401808060200182810382526045815260200180611cca6045913960600191505060405180910390fd5b60405162461bcd60e51b815260040180806020018281038252602c815260200180611b8d602c913960400191505060405180910390fd5b6000818484111561165b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611620578181015183820152602001611608565b50505050905090810190601f16801561164d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008181811215610a6d57600080fd5b60008282018183128015906116885750838112155b8061169d575060008312801561169d57508381125b61145f57600080fd5b6000808212156116b557600080fd5b5090565b6000806116c583610e1f565b905080156117ef576040805182815290516001600160a01b038516917fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d919081900360200190a26001600160a01b03831660009081526007602052604090205461172f9082611466565b6001600160a01b038416600081815260076020526040808220939093559151610bb890849084818181858888f193505050503d806000811461178d576040519150601f19603f3d011682016040523d82523d6000602084013e611792565b606091505b50509050806117dc576001600160a01b0384166000908152600760205260409020546117be908361151c565b6001600160a01b0385166000908152600760205260409020556117e7565b600092505050610a96565b509050610a96565b50600092915050565b61180282826118a0565b61183c61181d610c678360055461140690919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611972565b6001600160a01b0390921660009081526006602052604090209190915550565b61186682826119a4565b61183c611881610c678360055461140690919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611673565b6001600160a01b0382166118fb576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6002546119089082611466565b6002556001600160a01b03821660009081526020819052604090205461192e9082611466565b6001600160a01b038316600081815260208181526040808320949094558351858152935192939192600080516020611c4c8339815191529281900390910190a35050565b60008183038183128015906119875750838113155b8061169d575060008312801561169d575083811361145f57600080fd5b6001600160a01b0382166119e95760405162461bcd60e51b8152600401808060200182810382526021815260200180611c6c6021913960400191505060405180910390fd5b611a2681604051806060016040528060228152602001611a83602291396001600160a01b03851660009081526020819052604090205491906115cc565b6001600160a01b038316600090815260208190526040902055600254611a4c908261151c565b6002556040805182815290516000916001600160a01b03851691600080516020611c4c8339815191529181900360200190a3505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e6365566972616c5f4469766964656e645f547261636b65723a206e65774d696e696d756d546f6b656e206d6f7265203120746f6b656e566972616c5f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e20564952414c20636f6e74726163742e4f776e6572736869703a20726f6c6520697320616c72656164792073657420746f20746869732076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77566972616c5f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f77656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572566972616c5f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f757273ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a206275726e2066726f6d20746865207a65726f2061646472657373566972616c5f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c7565566972616c5f4469766964656e645f547261636b65723a20546f6b656e206973206e6f74207472616e7366657261626c652c206e6f206e65656420746f20617070726f7665566972616c5f4469766964656e645f547261636b65723a20706c65617365207761697420666f7220616e6f7468657220636c61696d45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cc6ae6e3160f34a884cb460546af28fe4bde6b5e2c8f5a9472fcdbc93abcb5d364736f6c63430007060033

Deployed Bytecode Sourcemap

46511:6298:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13223:21;:19;:21::i;:::-;46511:6298;;;;;13407:467;;;:::i;49049:561::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49049:561:0;;-1:-1:-1;;;;;49049:561:0;;;;;;;;:::i;6883:102::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7948:212;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7948:212:0;;-1:-1:-1;;;;;7948:212:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;50543:116;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48250:110;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48250:110:0;-1:-1:-1;;;;;48250:110:0;;:::i;7210:108::-;;;;;;;;;;;;;:::i;50121:414::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50121:414:0;;:::i;46755:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46755:49:0;-1:-1:-1;;;;;46755:49:0;;:::i;8168:456::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8168:456:0;;;;;;;;;;;;;;;;;:::i;15467:372::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15467:372:0;-1:-1:-1;;;;;15467:372:0;;:::i;7107:95::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8632:302;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8632:302:0;;-1:-1:-1;;;;;8632:302:0;;;;;;:::i;46695:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46695:53:0;-1:-1:-1;;;;;46695:53:0;;:::i;48813:228::-;;;;;;;;;;;;;:::i;46862:24::-;;;;;;;;;;;;;:::i;7326:177::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7326:177:0;-1:-1:-1;;;;;7326:177:0;;:::i;13034:40::-;;;;;;;;;;;;;:::i;14874:174::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14874:174:0;-1:-1:-1;;;;;14874:174:0;;:::i;6993:106::-;;;;;;;;;;;;;:::i;8942:402::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8942:402:0;;-1:-1:-1;;;;;8942:402:0;;;;;;:::i;15056:216::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15056:216:0;-1:-1:-1;;;;;15056:216:0;;:::i;7511:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7511:218:0;;-1:-1:-1;;;;;7511:218:0;;;;;;:::i;15280:179::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15280:179:0;-1:-1:-1;;;;;15280:179:0;;:::i;47954:288::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47954:288:0;;-1:-1:-1;;;;;47954:288:0;;;;;;;;:::i;52243:563::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52243:563:0;;-1:-1:-1;;;;;52243:563:0;;;;;;;;:::i;46940:46::-;;;;;;;;;;;;;:::i;7737:203::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7737:203:0;;;;;;;;;;:::i;51488:747::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51488:747:0;;-1:-1:-1;;;;;51488:747:0;;;;;;:::i;49618:495::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49618:495:0;;:::i;50667:813::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50667:813:0;-1:-1:-1;;;;;50667:813:0;;:::i;:::-;;;;-1:-1:-1;;;;;50667:813:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13407:467;13497:1;13481:13;:11;:13::i;:::-;:17;13473:26;;;;;;13514:9;:13;13510:357;;13572:105;13649:13;:11;:13::i;:::-;13620:26;13621:9;-1:-1:-1;;;13620:15:0;:26::i;:::-;:42;;;;;13572:25;;;13620:42;;13572:29;:105::i;:::-;13544:25;:133;13697:43;;;13730:9;13697:43;;;;13718:10;;13697:43;;;;;;;;;;13783:25;;:72;;13831:9;13783:29;:72::i;:::-;13755:25;:100;13510:357;13407:467::o;49049:561::-;47036:7;:21;47044:12;:10;:12::i;:::-;-1:-1:-1;;;;;47036:21:0;;;;;;;;;;;;-1:-1:-1;47036:21:0;;;;47028:66;;;;;-1:-1:-1;;;47028:66:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47028:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;49183:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;49182:31;49174:68;;;::::0;;-1:-1:-1;;;49174:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;49174:68:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;49253:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;:37;;-1:-1:-1;;49253:37:0::1;-1:-1:-1::0;49253:37:0::1;::::0;;49301:23:::1;::::0;49253:30;;49301:11:::1;:23::i;:::-;49339:17;49335:223;;;-1:-1:-1::0;;;;;49377:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;;::::1;;49373:174;;;-1:-1:-1::0;;;;;49423:25:0;::::1;49451:5;49423:25:::0;;;:16:::1;:25;::::0;;;;:33;;-1:-1:-1;;49423:33:0::1;::::0;;49501:23:::1;::::0;:30:::1;::::0;-1:-1:-1;49501:27:0::1;:30::i;:::-;49475:23;:56:::0;49373:174:::1;49573:29;::::0;-1:-1:-1;;;;;49573:29:0;::::1;::::0;::::1;::::0;;;::::1;49049:561:::0;;:::o;6883:102::-;6972:5;6965:12;;;;;;;;;;;;;-1:-1:-1;;6965:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;6939:13;;6965:12;;6972:5;;6965:12;;;6972:5;6965:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6883:102;:::o;7948:212::-;8069:4;8091:39;8100:12;:10;:12::i;:::-;8114:7;8123:6;8091:8;:39::i;:::-;-1:-1:-1;8148:4:0;7948:212;;;;;:::o;50543:116::-;50628:23;;50543:116;:::o;48250:110::-;-1:-1:-1;;;;;48337:15:0;;48313:4;48337:15;;;:7;:15;;;;;;;;48250:110;;;;:::o;7210:108::-;7298:12;;7210:108;:::o;50121:414::-;47036:7;:21;47044:12;:10;:12::i;:::-;-1:-1:-1;;;;;47036:21:0;;;;;;;;;;;;-1:-1:-1;47036:21:0;;;;47028:66;;;;;-1:-1:-1;;;47028:66:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47028:66:0;;;;;;;;;;;;;;;50246:1:::1;50227:15;:20;;50205:122;;;;-1:-1:-1::0;;;50205:122:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50416:31;::::0;50345:113:::1;::::0;50386:15;;50345:113:::1;::::0;;;::::1;50503:24;:15:::0;12784:6:::1;50503:19;:24::i;:::-;50469:31;:58:::0;-1:-1:-1;50121:414:0:o;46755:49::-;;;;;;;;;;;;;:::o;8168:456::-;8310:4;8327:36;8337:6;8345:9;8356:6;8327:9;:36::i;:::-;8374:220;8397:6;8418:12;:10;:12::i;:::-;8445:138;8501:6;8445:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8445:19:0;;;;;;-1:-1:-1;8445:19:0;;;;;;8465:12;:10;:12::i;:::-;-1:-1:-1;;;;;8445:33:0;;;;;;;;;;;;-1:-1:-1;8445:33:0;;;;:37;:138::i;:::-;8374:8;:220::i;:::-;-1:-1:-1;8612:4:0;8168:456;;;;;:::o;15467:372::-;-1:-1:-1;;;;;15748:36:0;;15581:7;15748:36;;;:28;:36;;;;;;-1:-1:-1;;;;15626:193:0;;:159;;:99;:66;15674:17;15748:36;15674:9;:17::i;:::-;15626:25;;;:47;:66::i;:::-;:97;:99::i;:::-;:121;;:159::i;:::-;:191;:193::i;:::-;:205;;;;;;;15467:372;-1:-1:-1;;15467:372:0:o;7107:95::-;7192:2;7107:95;:::o;8632:302::-;8749:4;8771:133;8794:12;:10;:12::i;:::-;8821:7;8843:50;8882:10;8843:11;:25;8855:12;:10;:12::i;:::-;-1:-1:-1;;;;;8843:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;8843:25:0;;;:34;;;;;;;;;;;:38;:50::i;46695:53::-;;;;;;;;;;;;;;;:::o;48813:228::-;48875:158;;-1:-1:-1;;;48875:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46862:24;;;;:::o;7326:177::-;-1:-1:-1;;;;;7477:18:0;7445:7;7477:18;;;;;;;;;;;;7326:177::o;13034:40::-;;;;:::o;14874:174::-;14978:7;15010:30;15033:6;15010:22;:30::i;6993:106::-;7084:7;7077:14;;;;;;;;;;;;;-1:-1:-1;;7077:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;7051:13;;7077:14;;7084:7;;7077:14;;;7084:7;7077:14;;;;;;;;;;;;;;;;;;;;;;;;8942:402;9064:4;9086:228;9109:12;:10;:12::i;:::-;9136:7;9158:145;9215:15;9158:145;;;;;;;;;;;;;;;;;:11;:25;9170:12;:10;:12::i;:::-;-1:-1:-1;;;;;9158:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;9158:25:0;;;:34;;;;;;;;;;;;:38;:145::i;15056:216::-;-1:-1:-1;;;;;15237:26:0;;15170:7;15237:26;;;:18;:26;;;;;;15202:62;;:30;15237:26;15202:22;:30::i;:::-;:34;;:62::i;7511:218::-;7635:4;7657:42;7667:12;:10;:12::i;:::-;7681:9;7692:6;7657:9;:42::i;15280:179::-;-1:-1:-1;;;;;15425:26:0;15393:7;15425:26;;;:18;:26;;;;;;;15280:179::o;47954:288::-;47036:7;:21;47044:12;:10;:12::i;:::-;-1:-1:-1;;;;;47036:21:0;;;;;;;;;;;;-1:-1:-1;47036:21:0;;;;47028:66;;;;;-1:-1:-1;;;47028:66:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47028:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48058:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;::::1;;:25;;::::0;::::1;;;;48036:119;;;;-1:-1:-1::0;;;48036:119:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48166:15:0;::::1;;::::0;;;:7:::1;:15;::::0;;;;;:24;;-1:-1:-1;;48166:24:0::1;::::0;::::1;;::::0;;::::1;::::0;;;48206:28;;48166:24;;:15;48206:28:::1;::::0;::::1;47954:288:::0;;:::o;52243:563::-;52364:4;47036:7;:21;47044:12;:10;:12::i;:::-;-1:-1:-1;;;;;47036:21:0;;;;;;;;;;;;-1:-1:-1;47036:21:0;;;;47028:66;;;;;-1:-1:-1;;;47028:66:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47028:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52420:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;52408:9:::1;::::0;52446:15:::1;52408:35:::0;::::1;:53;52386:156;;;;-1:-1:-1::0;;;52386:156:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52553:14;52570:32;52594:7;52570:23;:32::i;:::-;52553:49:::0;-1:-1:-1;52617:10:0;;52613:163:::1;;-1:-1:-1::0;;;;;52644:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;52670:15:::1;52644:41:::0;;52705:33;;;;;;;;::::1;;::::0;52644:23;52705:33:::1;::::0;;;;;;;::::1;52760:4;52753:11;;;;;52613:163;-1:-1:-1::0;52793:5:0::1;::::0;52243:563;-1:-1:-1;;;52243:563:0:o;46940:46::-;;;;:::o;7737:203::-;-1:-1:-1;;;;;7905:18:0;;;7873:7;7905:18;;;-1:-1:-1;7905:18:0;;;;;;;;:27;;;;;;;;;;;;;7737:203::o;51488:747::-;47036:7;:21;47044:12;:10;:12::i;:::-;-1:-1:-1;;;;;47036:21:0;;;;;;;;;;;;-1:-1:-1;47036:21:0;;;;47028:66;;;;;-1:-1:-1;;;47028:66:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47028:66:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;51611:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;51607:69;;;51658:7;;51607:69;51704:31;;51690:10;:45;51686:542;;51752:32;51764:7;51773:10;51752:11;:32::i;:::-;-1:-1:-1::0;;;;;51804:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;;::::1;;51799:174;;-1:-1:-1::0;;;;;51850:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;:32;;-1:-1:-1;;51850:32:0::1;-1:-1:-1::0;51850:32:0;;::::1;::::0;;;51927:23:::1;::::0;:30:::1;::::0;:27:::1;:30::i;:::-;51901:23;:56:::0;51799:174:::1;51686:542;;;52005:23;52017:7;52026:1;52005:11;:23::i;:::-;-1:-1:-1::0;;;;;52047:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;;::::1;;52043:174;;;-1:-1:-1::0;;;;;52093:25:0;::::1;52121:5;52093:25:::0;;;:16:::1;:25;::::0;;;;:33;;-1:-1:-1;;52093:33:0::1;::::0;;52171:23:::1;::::0;:30:::1;::::0;-1:-1:-1;52171:27:0::1;:30::i;:::-;52145:23;:56:::0;52043:174:::1;51488:747:::0;;:::o;49618:495::-;47036:7;:21;47044:12;:10;:12::i;:::-;-1:-1:-1;;;;;47036:21:0;;;;;;;;;;;;-1:-1:-1;47036:21:0;;;;47028:66;;;;;-1:-1:-1;;;47028:66:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47028:66:0;;;;;;;;;;;;;;;49734:4:::1;49718:12;:20;;:45;;;;;49758:5;49742:12;:21;;49718:45;49696:170;;;;-1:-1:-1::0;;;49696:170:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49915:9;;49899:12;:25;;49877:136;;;;-1:-1:-1::0;;;49877:136:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50060:9;::::0;50029:41:::1;::::0;50046:12;;50029:41:::1;::::0;;;::::1;50081:9;:24:::0;49618:495::o;50667:813::-;51028:8;50769:15;;;;;51071:31;51028:8;51071:22;:31::i;:::-;51047:55;;51130:31;51153:7;51130:22;:31::i;:::-;-1:-1:-1;;;;;51188:23:0;;;;;;:14;:23;;;;;;51113:48;;-1:-1:-1;51188:23:0;-1:-1:-1;51188:23:0;51238:92;;51315:15;51238:92;;;51289:9;;51271:28;;:13;;:17;:28::i;:::-;51222:108;;51390:15;51374:13;:31;:98;;51471:1;51374:98;;;51421:34;:13;51439:15;51421:17;:34::i;:::-;51341:131;;50667:813;;;;;;;:::o;2631:246::-;2689:7;2713:6;2709:47;;-1:-1:-1;2743:1:0;2736:8;;2709:47;2778:5;;;2782:1;2778;:5;:1;2802:5;;;;;:10;2794:56;;;;-1:-1:-1;;;2794:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:1;2631:246;-1:-1:-1;;;2631:246:0:o;2068:179::-;2126:7;2158:5;;;2182:6;;;;2174:46;;;;;-1:-1:-1;;;2174:46:0;;;;;;;;;;;;-1:-1:-1;;;2174:46:0;;;;;;;;;;;;;;95:98;175:10;95:98;:::o;16429:449::-;16507:22;16532:18;16542:7;16532:9;:18::i;:::-;16507:43;;16578:14;16565:10;:27;16561:310;;;16609:18;16630:30;:10;16645:14;16630;:30::i;:::-;16609:51;;16675:26;16681:7;16690:10;16675:5;:26::i;:::-;16561:310;;;;16736:14;16723:10;:27;16719:152;;;16767:18;16788:30;:14;16807:10;16788:18;:30::i;:::-;16767:51;;16833:26;16839:7;16848:10;16833:5;:26::i;:::-;16719:152;;16429:449;;;:::o;2255:136::-;2313:7;2340:43;2344:1;2347;2340:43;;;;;;;;;;;;;;;;;:3;:43::i;48368:245::-;48481:124;;-1:-1:-1;;;48481:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48621:184;48735:62;;-1:-1:-1;;;48735:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2399:224;2519:7;2555:12;2547:6;;;;2539:29;;;;-1:-1:-1;;;2539:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2591:5:0;;;2399:224::o;3937:148::-;3993:6;4030:1;4051:6;;;;4043:15;;;;;3591:176;3647:6;3677:5;;;3702:6;;;;;;:16;;;3717:1;3712;:6;;3702:16;3701:38;;;;3728:1;3724;:5;:14;;;;;3737:1;3733;:5;3724:14;3693:47;;;;;3775:127;3831:7;3864:1;3859;:6;;3851:15;;;;;;-1:-1:-1;3892:1:0;3775:127::o;14007:859::-;14098:7;14123:29;14155:28;14178:4;14155:22;:28::i;:::-;14123:60;-1:-1:-1;14198:25:0;;14194:646;;14245:46;;;;;;;;-1:-1:-1;;;;;14245:46:0;;;;;;;;;;;;;-1:-1:-1;;;;;14333:24:0;;;;;;:18;:24;;;;;;:83;;14380:21;14333:28;:83::i;:::-;-1:-1:-1;;;;;14306:24:0;;;;;;:18;:24;;;;;;:110;;;;14450:103;;14530:4;;14485:21;;14306:24;14450:103;14306:24;14450:103;14485:21;14306:24;14530:4;14450:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14431:122;;;14575:7;14570:216;;-1:-1:-1;;;;;14630:24:0;;;;;;:18;:24;;;;;;:91;;14681:21;14630:28;:91::i;:::-;-1:-1:-1;;;;;14603:24:0;;;;;;:18;:24;;;;;:118;14570:216;;;14769:1;14762:8;;;;;;14570:216;-1:-1:-1;14807:21:0;-1:-1:-1;14800:28:0;;14194:646;-1:-1:-1;14857:1:0;;14007:859;-1:-1:-1;;14007:859:0:o;15847:284::-;15923:27;15935:7;15944:5;15923:11;:27::i;:::-;16003:120;16069:53;16070:36;16100:5;16070:25;;:29;;:36;;;;:::i;16069:53::-;-1:-1:-1;;;;;16003:61:0;;;;;;:28;:61;;;;;;;:65;:120::i;:::-;-1:-1:-1;;;;;15963:37:0;;;;;;;;:28;:37;;;;;:160;;;;-1:-1:-1;15847:284:0:o;16139:282::-;16215:27;16227:7;16236:5;16215:11;:27::i;:::-;16293:120;16359:53;16360:36;16390:5;16360:25;;:29;;:36;;;;:::i;16359:53::-;-1:-1:-1;;;;;16293:61:0;;;;;;:28;:61;;;;;;;:65;:120::i;9908:314::-;-1:-1:-1;;;;;9992:21:0;;9984:65;;;;;-1:-1:-1;;;9984:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10075:12;;:24;;10092:6;10075:16;:24::i;:::-;10060:12;:39;-1:-1:-1;;;;;10131:18:0;;:9;:18;;;;;;;;;;;:30;;10154:6;10131:22;:30::i;:::-;-1:-1:-1;;;;;10110:18:0;;:9;:18;;;;;;;;;;;:51;;;;10177:37;;;;;;;-1:-1:-1;;10110:18:0;;:9;;;;:18;-1:-1:-1;10110:9:0;-1:-1:-1;;;;;10177:37:0;;;;;;;;;9908:314;;:::o;3407:176::-;3463:6;3493:5;;;3518:6;;;;;;:16;;;3533:1;3528;:6;;3518:16;3517:38;;;;3544:1;3540;:5;:14;;;;;3553:1;3549;:5;3509:47;;;;;10230:391;-1:-1:-1;;;;;10314:21:0;;10306:67;;;;-1:-1:-1;;;10306:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10405:105;10442:6;10405:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10405:18:0;;:9;:18;;;;;;;;;;;;;:22;:105::i;:::-;-1:-1:-1;;;;;10384:18:0;;:9;:18;;;;;;;;;;:126;10536:12;;:24;;10553:6;10536:16;:24::i;:::-;10521:12;:39;10576:37;;;;;;;;10602:1;;-1:-1:-1;;;;;10576:37:0;;;-1:-1:-1;;;;;;;;;;;10576:37:0;;;;;;;;10230:391;;:::o

Swarm Source

ipfs://cc6ae6e3160f34a884cb460546af28fe4bde6b5e2c8f5a9472fcdbc93abcb5d3
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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