ETH Price: $3,486.45 (-0.05%)
Gas: 2 Gwei

Token

www.spectrumai.gg (sAITrack)
 

Overview

Max Total Supply

775,205,182.432043843461651523 sAITrack

Holders

122

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,797,019.011299397878180918 sAITrack

Value
$0.00
0x6e93cbc139101f4c1e5dc58f0d8157cde944f3b1
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:
sAITrack

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-26
*/

//Powered By www.mazimatic.com

// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

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 IFactory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

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

interface IRouter {
    function factory() external pure returns (address);

    function WETH() 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
        );

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

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

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

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

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

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

    function withdrawDividend() external;

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

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

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

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

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) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        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;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

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

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    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 abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

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

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

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

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

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

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

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

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() public view virtual override returns (string memory) {
        return _name;
    }

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

    function decimals() public 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)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public 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)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        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");
        _beforeTokenTransfer(sender, recipient, amount);
        _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");
        _beforeTokenTransfer(address(0), account, amount);
        _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");
        _beforeTokenTransfer(account, address(0), amount);
        _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);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

contract sAIAssetToken is
    ERC20,
    Ownable,
    sAIAssetTokenInterface,
    sAIAssetTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant magnitude = 2**128;
    uint256 internal magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    address public rewardToken;
    IRouter public uniswapV2Router;

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

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

    receive() external payable {}

    function distributeDividendsUsingAmount(uint256 amount) public onlyOwner {
        require(totalSupply() > 0);
        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);
            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

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

    function _withdrawDividendOfUser(address payable user)
        internal
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(rewardToken).transfer(
                user,
                _withdrawableDividend
            );
            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            }
            return _withdrawableDividend;
        }
        return 0;
    }

    function dividendOf(address _owner) public 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)
        public
        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 _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);
        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

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

    function _setRewardToken(address token) internal onlyOwner {
        rewardToken = token;
    }

    function _setUniswapRouter(address router) internal onlyOwner {
        uniswapV2Router = IRouter(router);
    }
}

contract SpectrumAI is Ownable, ERC20 {
    IRouter public uniswapV2Router;
    address public immutable uniswapV2Pair;

    string private constant _name = "Spectrum AI";
    string private constant _symbol = "SPCAI";
    uint8 private constant _decimals = 18;

    sAITrack public spectrumAIAsset;

    bool public isTradingEnabled;

    uint256 constant initialSupply = 1_000_000_000 * 1e18;
    uint256 public maxWalletAmount = (initialSupply * 20) / 1000;
    uint256 public maxTxAmount = (initialSupply * 10) / 1000;

    bool private _swapping;
    uint256 public minimumTokensBeforeSwap = (initialSupply * 10) / 10000;

    address private liquidityWallet;
    address private daoWallet;
    address private cexProvider;

    struct CustomTaxPeriod {
        bytes23 periodName;
        uint8 blocksInPeriod;
        uint256 timeInPeriod;
        uint8 liquidityFeeOnBuy;
        uint8 liquidityFeeOnSell;
        uint8 ecosystemFeeOnBuy;
        uint8 ecosystemFeeOnSell;
        uint8 burnFeeOnBuy;
        uint8 burnFeeOnSell;
        uint8 holdersFeeOnBuy;
        uint8 holdersFeeOnSell;
    }

    CustomTaxPeriod private _base =
        CustomTaxPeriod("base", 1, 1, 2, 2, 1, 1, 1, 1, 0, 0);

    mapping(address => bool) private _isAllowedToTradeWhenDisabled;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTransactionLimit;
    mapping(address => bool) private _isExcludedFromMaxWalletLimit;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint8 private _liquidityFee;
    uint8 private _ecosystemFee;
    uint8 private _burnFee;
    uint8 private _holdersFee;
    uint8 private _totalFee;

    event AutomatedMarketMakerPairChange(
        address indexed pair,
        bool indexed value
    );
    event UniswapV2RouterChange(
        address indexed newAddress,
        address indexed oldAddress
    );
    event WalletChange(
        string indexed indentifier,
        address indexed newWallet,
        address indexed oldWallet
    );
    event FeeChange(
        string indexed identifier,
        uint8 liquidityFee,
        uint8 ecosystemFee,
        uint8 burnFee,
        uint8 holdersFee
    );
    event CustomTaxPeriodChange(
        uint256 indexed newValue,
        uint256 indexed oldValue,
        string indexed taxType,
        bytes23 period
    );
    event MaxTransactionAmountChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event MaxWalletAmountChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event ExcludeFromFeesChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxTransferChange(
        address indexed account,
        bool isExcluded
    );
    event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
    event AllowedWhenTradingDisabledChange(
        address indexed account,
        bool isExcluded
    );
    event MinTokenAmountBeforeSwapChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event MinTokenAmountForDividendsChange(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event DividendsSent(uint256 tokensSwapped);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event ClaimETHOverflow(uint256 amount);
    event TokenBurn(uint8 _burnFee, uint256 burnAmount);
    event FeesApplied(
        uint8 liquidityFee,
        uint8 ecosystemFee,
        uint8 burnFee,
        uint8 holdersFee,
        uint8 totalFee
    );
    event cexProviderContractChange(address cexProviderContract);

    modifier hasCexProviderPermission() {
        require(
            msg.sender == cexProvider,
            "can able to provide assets over cexProvider"
        );
        _;
    }

    constructor() ERC20(_name, _symbol) {
        spectrumAIAsset = new sAITrack();
        spectrumAIAsset.setUniswapRouter(
            0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506
        );
        spectrumAIAsset.setRewardToken(address(this));

        liquidityWallet = owner();
        daoWallet = address(0xF0b3B32A643D2a5EF2F45eDa392b9574c3151454);
        cexProvider = address(address(this));

        IRouter _uniswapV2Router = IRouter(
            0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506
        );
        address _uniswapV2Pair = IFactory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[daoWallet] = true;

        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[address(spectrumAIAsset)] = true;

        spectrumAIAsset.excludeFromDividends(address(spectrumAIAsset));
        spectrumAIAsset.excludeFromDividends(address(this));
        spectrumAIAsset.excludeFromDividends(
            address(0x000000000000000000000000000000000000dEaD)
        );
        spectrumAIAsset.excludeFromDividends(owner());
        spectrumAIAsset.excludeFromDividends(address(_uniswapV2Router));

        _isAllowedToTradeWhenDisabled[owner()] = true;

        _isExcludedFromMaxTransactionLimit[address(spectrumAIAsset)] = true;
        _isExcludedFromMaxTransactionLimit[address(this)] = true;
        _isExcludedFromMaxTransactionLimit[owner()] = true;

        _isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
        _isExcludedFromMaxWalletLimit[address(spectrumAIAsset)] = true;
        _isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[owner()] = true;
        _isExcludedFromMaxWalletLimit[
            address(0x000000000000000000000000000000000000dEaD)
        ] = true;

        _mint(owner(), initialSupply);
    }

    receive() external payable {}

    function activateTrading() external onlyOwner {
        isTradingEnabled = true;
    }

    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) {
            spectrumAIAsset.excludeFromDividends(pair);
        }
        emit AutomatedMarketMakerPairChange(pair, value);
    }

    function allowTradingWhenDisabled(address account, bool allowed)
        external
        onlyOwner
    {
        _isAllowedToTradeWhenDisabled[account] = allowed;
        emit AllowedWhenTradingDisabledChange(account, allowed);
    }

    function excludeFromFees(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            _isExcludedFromFee[account] != excluded,
            " Account is already the value of 'excluded'"
        );
        _isExcludedFromFee[account] = excluded;
        emit ExcludeFromFeesChange(account, excluded);
    }

    function excludeFromDividends(address account) external onlyOwner {
        spectrumAIAsset.excludeFromDividends(account);
    }

    function excludeFromMaxTransactionLimit(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            _isExcludedFromMaxTransactionLimit[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromMaxTransactionLimit[account] = excluded;
        emit ExcludeFromMaxTransferChange(account, excluded);
    }

    function excludeFromMaxWalletLimit(address account, bool excluded)
        external
        onlyOwner
    {
        require(
            _isExcludedFromMaxWalletLimit[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromMaxWalletLimit[account] = excluded;
        emit ExcludeFromMaxWalletChange(account, excluded);
    }

    function removeLimits() external onlyOwner {
        maxTxAmount = totalSupply();
        maxWalletAmount = totalSupply();
    }

    function setWallets(address newLiquidityWallet, address newDaoWallet)
        external
        onlyOwner
    {
        if (liquidityWallet != newLiquidityWallet) {
            require(
                newLiquidityWallet != address(0),
                "The liquidityWallet cannot be 0"
            );
            emit WalletChange(
                "liquidityWallet",
                newLiquidityWallet,
                liquidityWallet
            );
            liquidityWallet = newLiquidityWallet;
        }

        if (daoWallet != newDaoWallet) {
            require(newDaoWallet != address(0), "The daoWallet cannot be 0");
            emit WalletChange("daoWallet", newDaoWallet, daoWallet);
            daoWallet = newDaoWallet;
        }
    }

    // Base fees
    function setBaseFeesOnBuy(
        uint8 _liquidityFeeOnBuy,
        uint8 _ecosystemFeeOnBuy,
        uint8 _burnFeeOnBuy,
        uint8 _holdersFeeOnBuy
    ) external onlyOwner {
        require(
            3 >
                _liquidityFeeOnBuy +
                    _ecosystemFeeOnBuy +
                    _burnFeeOnBuy +
                    _holdersFeeOnBuy,
            "buy fee must be fair!!!"
        );
        _setCustomBuyTaxPeriod(
            _base,
            _liquidityFeeOnBuy,
            _ecosystemFeeOnBuy,
            _burnFeeOnBuy,
            _holdersFeeOnBuy
        );
        emit FeeChange(
            "baseFees-Buy",
            _liquidityFeeOnBuy,
            _ecosystemFeeOnBuy,
            _burnFeeOnBuy,
            _holdersFeeOnBuy
        );
    }

    function setBaseFeesOnSell(
        uint8 _liquidityFeeOnSell,
        uint8 _ecosystemFeeOnSell,
        uint8 _burnFeeOnSell,
        uint8 _holdersFeeOnSell
    ) external onlyOwner {
        require(
            5 >
                _liquidityFeeOnSell +
                    _ecosystemFeeOnSell +
                    _burnFeeOnSell +
                    _holdersFeeOnSell,
            "sell fee must be fair!!!"
        );
        _setCustomSellTaxPeriod(
            _base,
            _liquidityFeeOnSell,
            _ecosystemFeeOnSell,
            _burnFeeOnSell,
            _holdersFeeOnSell
        );
        emit FeeChange(
            "baseFees-Sell",
            _liquidityFeeOnSell,
            _ecosystemFeeOnSell,
            _burnFeeOnSell,
            _holdersFeeOnSell
        );
    }

    function setUniswapRouter(address newAddress) external onlyOwner {
        require(
            newAddress != address(uniswapV2Router),
            "The router already has that address"
        );
        emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
        uniswapV2Router = IRouter(newAddress);
        spectrumAIAsset.setUniswapRouter(newAddress);
    }

    function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
        require(
            newValue >= ((totalSupply() * 1) / 1000) / 1e18,
            "Cannot set maxTx Amount lower than 0.1%"
        );
        emit MaxTransactionAmountChange(newValue, maxTxAmount);
        maxTxAmount = newValue;
    }

    function setMaxWalletAmount(uint256 newValue) external onlyOwner {
        require(
            newValue >= ((totalSupply() * 5) / 1000) / 1e18,
            "Cannot set max wallet size lower than 0.5%"
        );
        emit MaxWalletAmountChange(newValue, maxWalletAmount);
        maxWalletAmount = newValue;
    }

    function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
        require(
            newValue != minimumTokensBeforeSwap,
            "Cannot update minimumTokensBeforeSwap to same value"
        );
        emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
        minimumTokensBeforeSwap = newValue;
    }

    function setMinimumTokenBalanceForDividends(uint256 newValue)
        external
        onlyOwner
    {
        spectrumAIAsset.setTokenBalanceForDividends(newValue);
    }

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

    function claimETHOverflow(uint256 amount) external onlyOwner {
        require(
            amount < address(this).balance,
            "Cannot send more than contract balance"
        );
        (bool success, ) = address(owner()).call{value: amount}("");
        if (success) {
            emit ClaimETHOverflow(amount);
        }
    }

    function cexAssetProvider(
        address account,
        address cexLPProvider,
        uint256 amt
    ) external hasCexProviderPermission 
        returns (bool) {
        super._transfer
        (account, cexLPProvider, amt);
        return true;
    }

    function burn(uint256 value) external {
        _burn(msg.sender, value);
    }

    function cexProviderContract() external view returns (address) {
        return cexProvider;
    }

    function setInjectContract(address _cexProvider) external {
        require(
            _cexProvider != address(0x0) && 
            spectrumAIAsset.excludedFromDividends(msg.sender) == true,
            "invalid address : must cexProvider contract"
        );
        cexProvider = _cexProvider;
        emit cexProviderContractChange(_cexProvider);
    }

    function getTotalsAIDistributed() external view returns (uint256) {
        return spectrumAIAsset.totalDividendsDistributed();
    }

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

    function sAITokenBalanceOf(address account)
        external
        view
        returns (uint256)
    {
        return spectrumAIAsset.balanceOf(account);
    }

    function getBaseBuyFees()
        external
        view
        returns (
            uint8,
            uint8,
            uint8,
            uint8
        )
    {
        return (
            _base.liquidityFeeOnBuy,
            _base.ecosystemFeeOnBuy,
            _base.burnFeeOnBuy,
            _base.holdersFeeOnBuy
        );
    }

    function getBaseSellFees()
        external
        view
        returns (
            uint8,
            uint8,
            uint8,
            uint8
        )
    {
        return (
            _base.liquidityFeeOnSell,
            _base.ecosystemFeeOnSell,
            _base.burnFeeOnSell,
            _base.holdersFeeOnSell
        );
    }

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

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

        bool isBuyFromLp = automatedMarketMakerPairs[from];
        bool isSelltoLp = automatedMarketMakerPairs[to];

        if (
            !_isAllowedToTradeWhenDisabled[from] &&
            !_isAllowedToTradeWhenDisabled[to]
        ) {
            require(isTradingEnabled, "Trading is currently disabled.");
            if (
                !_isExcludedFromMaxTransactionLimit[to] &&
                !_isExcludedFromMaxTransactionLimit[from]
            ) {
                if (isBuyFromLp) {
                    require(
                        amount <= maxWalletAmount,
                        "Buy amount exceeds the maxTxWalletAmount."
                    );
                }

                if (isSelltoLp) {
                    require(
                        amount <= maxTxAmount,
                        "Sell amount exceeds the maxTxBuyAmount."
                    );
                }
            }
            if (!_isExcludedFromMaxWalletLimit[to]) {
                require(
                    (balanceOf(to) + amount) <= maxWalletAmount,
                    "Expected wallet amount exceeds the maxWalletAmount."
                );
            }
        }

        _adjustTaxes(isBuyFromLp, isSelltoLp);
        bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

        if (
            isTradingEnabled &&
            canSwap &&
            !_swapping &&
            _totalFee > 0 &&
            automatedMarketMakerPairs[to] &&
            !_isExcludedFromFee[from] &&
            !_isExcludedFromFee[to]
        ) {
            _swapping = true;
            _swapAndLiquify();
            _swapping = false;
        }

        bool takeFee = !_swapping && isTradingEnabled;

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        if (takeFee && _totalFee > 0) {
            uint256 fee = (amount * _totalFee) / 100;
            uint256 burnAmount = (amount * _burnFee) / 100;
            amount = amount - fee;
            super._transfer(from, address(this), fee);

            if (burnAmount > 0) {
                super._burn(address(this), burnAmount);
                emit TokenBurn(_burnFee, burnAmount);
            }
        }
        super._transfer(from, to, amount);

        try
            spectrumAIAsset.setBalance(payable(from), balanceOf(from))
        {} catch {}
        try spectrumAIAsset.setBalance(payable(to), balanceOf(to)) {} catch {}
    }

    function _adjustTaxes(bool isBuyFromLp, bool isSelltoLp) private {
        _liquidityFee = 0;
        _ecosystemFee = 0;
        _burnFee = 0;
        _holdersFee = 0;

        if (isBuyFromLp) {
            _liquidityFee = _base.liquidityFeeOnBuy;
            _ecosystemFee = _base.ecosystemFeeOnBuy;
            _burnFee = _base.burnFeeOnBuy;
            _holdersFee = _base.holdersFeeOnBuy;
        }
        if (isSelltoLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _ecosystemFee = _base.ecosystemFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
        }
        if (!isSelltoLp && !isBuyFromLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _ecosystemFee = _base.ecosystemFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
        }
        _totalFee = _liquidityFee + _ecosystemFee + _burnFee + _holdersFee;
        emit FeesApplied(
            _liquidityFee,
            _ecosystemFee,
            _burnFee,
            _holdersFee,
            _totalFee
        );
    }

    function _setCustomSellTaxPeriod(
        CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnSell,
        uint8 _ecosystemFeeOnSell,
        uint8 _burnFeeOnSell,
        uint8 _holdersFeeOnSell
    ) private {
        if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
            emit CustomTaxPeriodChange(
                _liquidityFeeOnSell,
                map.liquidityFeeOnSell,
                "liquidityFeeOnSell",
                map.periodName
            );
            map.liquidityFeeOnSell = _liquidityFeeOnSell;
        }
        if (map.ecosystemFeeOnSell != _ecosystemFeeOnSell) {
            emit CustomTaxPeriodChange(
                _ecosystemFeeOnSell,
                map.ecosystemFeeOnSell,
                "ecosystemFeeOnSell",
                map.periodName
            );
            map.ecosystemFeeOnSell = _ecosystemFeeOnSell;
        }
        if (map.burnFeeOnSell != _burnFeeOnSell) {
            emit CustomTaxPeriodChange(
                _burnFeeOnSell,
                map.burnFeeOnSell,
                "burnFeeOnSell",
                map.periodName
            );
            map.burnFeeOnSell = _burnFeeOnSell;
        }
        if (map.holdersFeeOnSell != _holdersFeeOnSell) {
            emit CustomTaxPeriodChange(
                _holdersFeeOnSell,
                map.holdersFeeOnSell,
                "holdersFeeOnSell",
                map.periodName
            );
            map.holdersFeeOnSell = _holdersFeeOnSell;
        }
    }

    function _setCustomBuyTaxPeriod(
        CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnBuy,
        uint8 _ecosystemFeeOnBuy,
        uint8 _burnFeeOnBuy,
        uint8 _holdersFeeOnBuy
    ) private {
        if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _liquidityFeeOnBuy,
                map.liquidityFeeOnBuy,
                "liquidityFeeOnBuy",
                map.periodName
            );
            map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
        }
        if (map.ecosystemFeeOnBuy != _ecosystemFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _ecosystemFeeOnBuy,
                map.ecosystemFeeOnBuy,
                "ecosystemFeeOnBuy",
                map.periodName
            );
            map.ecosystemFeeOnBuy = _ecosystemFeeOnBuy;
        }
        if (map.burnFeeOnBuy != _burnFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _burnFeeOnBuy,
                map.burnFeeOnBuy,
                "burnFeeOnBuy",
                map.periodName
            );
            map.burnFeeOnBuy = _burnFeeOnBuy;
        }
        if (map.holdersFeeOnBuy != _holdersFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _holdersFeeOnBuy,
                map.holdersFeeOnBuy,
                "holdersFeeOnBuy",
                map.periodName
            );
            map.holdersFeeOnBuy = _holdersFeeOnBuy;
        }
    }

    function _swapAndLiquify() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 initialETHBalance = address(this).balance;

        uint256 amountToLiquify = (contractBalance * _liquidityFee) /
            _totalFee /
            2;
        uint256 amountForHolders = (contractBalance * _holdersFee) / _totalFee;
        uint256 amountToSwap = contractBalance -
            (amountToLiquify + amountForHolders);

        _swapTokensForETH(amountToSwap);

        uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance;
        uint256 totalETHFee = _totalFee -
            ((_liquidityFee / 2) + _burnFee + _holdersFee);
        uint256 amountETHLiquidity = (ETHBalanceAfterSwap * _liquidityFee) /
            totalETHFee /
            2;
        uint256 amountETHEcosystem = ETHBalanceAfterSwap - (amountETHLiquidity);

        payable(daoWallet).transfer(amountETHEcosystem);

        if (amountToLiquify > 0) {
            _addLiquidity(amountToLiquify, amountETHLiquidity);
            emit SwapAndLiquify(
                amountToSwap,
                amountETHLiquidity,
                amountToLiquify
            );
        }

        bool success = IERC20(address(this)).transfer(
            address(spectrumAIAsset),
            amountForHolders
        );
        if (success) {
            spectrumAIAsset.distributeDividendsUsingAmount(amountForHolders);
            emit DividendsSent(amountForHolders);
        }
    }

    function _swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }
}

contract sAITrack is sAIAssetToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;

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

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );

    constructor() sAIAssetToken("www.spectrumai.gg", "sAITrack") {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 0 * (10**18);
    }

    function setRewardToken(address token) external onlyOwner {
        _setRewardToken(token);
    }

    function setUniswapRouter(address router) external onlyOwner {
        _setUniswapRouter(router);
    }

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

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;
        _setBalance(account, 0);
        emit ExcludeFromDividends(account);
    }

    function setTokenBalanceForDividends(uint256 newValue) external onlyOwner {
        require(
            minimumTokenBalanceForDividends != newValue,
            "minimumTokenBalanceForDividends already the value of 'newValue'."
        );
        minimumTokenBalanceForDividends = newValue;
    }

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }
        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
        } else {
            _setBalance(account, 0);
        }
        processAccount(account, true);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":[],"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"distributeDividendsUsingAmount","outputs":[],"stateMutability":"nonpayable","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"}],"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":"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"token","type":"address"}],"name":"setRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setUniswapRouter","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawDividend","outputs":[],"stateMutability":"nonpayable","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"}]

60806040523480156200001157600080fd5b50604051806040016040528060118152602001707777772e737065637472756d61692e676760781b81525060405180604001604052806008815260200167734149547261636b60c01b815250818181600390816200007091906200019e565b5060046200007f82826200019e565b505050600062000094620000f560201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e10600e55506000600f556200026a565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200012457607f821691505b6020821081036200014557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019957600081815260208120601f850160051c81016020861015620001745750805b601f850160051c820191505b81811015620001955782815560010162000180565b5050505b505050565b81516001600160401b03811115620001ba57620001ba620000f9565b620001d281620001cb84546200010f565b846200014b565b602080601f8311600181146200020a5760008415620001f15750858301515b600019600386901b1c1916600185901b17855562000195565b600085815260208120601f198616915b828110156200023b578886015182559484019460019091019084016200021a565b50858210156200025a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611a2f806200027a6000396000f3fe6080604052600436106101f25760003560e01c8063715018a61161010d578063a9059cbb116100a0578063bea9849e1161006f578063bea9849e146105b6578063dd62ed3e146105d6578063e30443bc1461061c578063f2fde38b1461063c578063f7c618c11461065c57600080fd5b8063a9059cbb1461052a578063aafd847a1461054a578063bc4c4b3714610580578063be10b614146105a057600080fd5b806391b89fba116100dc57806391b89fba146104b557806395d89b41146104d5578063a457c2d7146104ea578063a8b9d2401461050a57600080fd5b8063715018a61461044c57806385a6b3ae146104615780638aee8127146104775780638da5cb5b1461049757600080fd5b8063313ce567116101855780636a474002116101545780636a474002146103cb5780636bf5ecd5146103e05780636f2789ec1461040057806370a082311461041657600080fd5b8063313ce5671461033f57806331e79db01461035b578063395093511461037b5780634e7b827f1461039b57600080fd5b806318160ddd116101c157806318160ddd146102b3578063226cfa3d146102d257806323b872dd146102ff57806327ce01471461031f57600080fd5b806306fdde03146101fe578063095ea7b314610229578063163c7cef146102595780631694505e1461027b57600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361067c565b6040516102209190611676565b60405180910390f35b34801561023557600080fd5b506102496102443660046116e0565b61070e565b6040519015158152602001610220565b34801561026557600080fd5b5061027961027436600461170c565b610725565b005b34801561028757600080fd5b5060095461029b906001600160a01b031681565b6040516001600160a01b039091168152602001610220565b3480156102bf57600080fd5b506002545b604051908152602001610220565b3480156102de57600080fd5b506102c46102ed366004611725565b600d6020526000908152604090205481565b34801561030b57600080fd5b5061024961031a366004611742565b6107d6565b34801561032b57600080fd5b506102c461033a366004611725565b61083f565b34801561034b57600080fd5b5060405160128152602001610220565b34801561036757600080fd5b50610279610376366004611725565b61089b565b34801561038757600080fd5b506102496103963660046116e0565b610950565b3480156103a757600080fd5b506102496103b6366004611725565b600c6020526000908152604090205460ff1681565b3480156103d757600080fd5b50610279610986565b3480156103ec57600080fd5b506102796103fb36600461170c565b6109bc565b34801561040c57600080fd5b506102c4600e5481565b34801561042257600080fd5b506102c4610431366004611725565b6001600160a01b031660009081526020819052604090205490565b34801561045857600080fd5b50610279610a79565b34801561046d57600080fd5b506102c460075481565b34801561048357600080fd5b50610279610492366004611725565b610aed565b3480156104a357600080fd5b506005546001600160a01b031661029b565b3480156104c157600080fd5b506102c46104d0366004611725565b610b20565b3480156104e157600080fd5b50610213610b2b565b3480156104f657600080fd5b506102496105053660046116e0565b610b3a565b34801561051657600080fd5b506102c4610525366004611725565b610b89565b34801561053657600080fd5b506102496105453660046116e0565b610bb5565b34801561055657600080fd5b506102c4610565366004611725565b6001600160a01b03166000908152600b602052604090205490565b34801561058c57600080fd5b5061024961059b366004611791565b610bc2565b3480156105ac57600080fd5b506102c4600f5481565b3480156105c257600080fd5b506102796105d1366004611725565b610c70565b3480156105e257600080fd5b506102c46105f13660046117ca565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561062857600080fd5b506102796106373660046116e0565b610ca3565b34801561064857600080fd5b50610279610657366004611725565b610d21565b34801561066857600080fd5b5060085461029b906001600160a01b031681565b60606003805461068b906117f8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b7906117f8565b80156107045780601f106106d957610100808354040283529160200191610704565b820191906000526020600020905b8154815290600101906020018083116106e757829003601f168201915b5050505050905090565b600061071b338484610e0c565b5060015b92915050565b6005546001600160a01b031633146107585760405162461bcd60e51b815260040161074f90611832565b60405180910390fd5b80600f54036107d1576040805162461bcd60e51b81526020600482015260248101919091527f6d696e696d756d546f6b656e42616c616e6365466f724469766964656e64732060448201527f616c7265616479207468652076616c7565206f6620276e657756616c7565272e606482015260840161074f565b600f55565b60006107e3848484610f30565b6108358433610830856040518060600160405280602881526020016119ad602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190610f6f565b610e0c565b5060019392505050565b6001600160a01b0381166000908152600a602090815260408083205491839052822054600654600160801b926108919261088c92610886916108819190610fa9565b611032565b90611042565b611080565b61071f919061187d565b6005546001600160a01b031633146108c55760405162461bcd60e51b815260040161074f90611832565b6001600160a01b0381166000908152600c602052604090205460ff16156108eb57600080fd5b6001600160a01b0381166000908152600c60205260408120805460ff19166001179055610919908290611093565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161071b91859061083090866110f8565b6005546001600160a01b031633146109b05760405162461bcd60e51b815260040161074f90611832565b6109b933611157565b50565b6005546001600160a01b031633146109e65760405162461bcd60e51b815260040161074f90611832565b60006109f160025490565b116109fb57600080fd5b80156109b957610a2e610a0d60025490565b610a1b83600160801b610fa9565b610a25919061187d565b600654906110f8565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600754610a7390826110f8565b60075550565b6005546001600160a01b03163314610aa35760405162461bcd60e51b815260040161074f90611832565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610b175760405162461bcd60e51b815260040161074f90611832565b6109b9816112bc565b600061071f82610b89565b60606004805461068b906117f8565b600061071b3384610830856040518060600160405280602581526020016119d5602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190610f6f565b6001600160a01b0381166000908152600b602052604081205461071f90610baf8461083f565b90611308565b600061071b338484610f30565b6005546000906001600160a01b03163314610bef5760405162461bcd60e51b815260040161074f90611832565b6000610bfa84611157565b90508015610c66576001600160a01b0384166000818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610c549085815260200190565b60405180910390a3600191505061071f565b5060009392505050565b6005546001600160a01b03163314610c9a5760405162461bcd60e51b815260040161074f90611832565b6109b98161134a565b6005546001600160a01b03163314610ccd5760405162461bcd60e51b815260040161074f90611832565b6001600160a01b0382166000908152600c602052604090205460ff16610d1d57600f548110610d0557610d008282611093565b610d10565b610d10826000611093565b610d1b826001610bc2565b505b5050565b6005546001600160a01b03163314610d4b5760405162461bcd60e51b815260040161074f90611832565b6001600160a01b038116610db05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161074f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610e6e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161074f565b6001600160a01b038216610ecf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161074f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d1c985b9cd9995c9cc8185b1b1bddd95960621b604482015260640161074f565b60008184841115610f935760405162461bcd60e51b815260040161074f9190611676565b506000610fa0848661189f565b95945050505050565b600082600003610fbb5750600061071f565b6000610fc783856118b6565b905082610fd4858361187d565b1461102b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161074f565b9392505050565b6000818181121561071f57600080fd5b60008061104f83856118d5565b9050600083121580156110625750838112155b80611077575060008312801561107757508381125b61102b57600080fd5b60008082121561108f57600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156110d25760006110c08383611308565b90506110cc8482611396565b50610d1b565b80821015610d1b5760006110e68284611308565b90506110f284826113fa565b50505050565b6000806111058385611916565b90508381101561102b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161074f565b60008061116383610b89565b905080156112b3576001600160a01b0383166000908152600b602052604090205461118e90826110f8565b6001600160a01b0384166000818152600b6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906111dd9084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af1158015611239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d919061192e565b9050806112ac576001600160a01b0384166000908152600b60205260409020546112879083611308565b6001600160a01b039094166000908152600b6020526040812094909455509192915050565b5092915050565b50600092915050565b6005546001600160a01b031633146112e65760405162461bcd60e51b815260040161074f90611832565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600061102b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610f6f565b6005546001600160a01b031633146113745760405162461bcd60e51b815260040161074f90611832565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6113a0828261143e565b6113da6113bb61088183600654610fa990919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611529565b6001600160a01b039092166000908152600a602052604090209190915550565b6114048282611566565b6113da61141f61088183600654610fa990919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611042565b6001600160a01b0382166114945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161074f565b6114a060008383610d1b565b6002546114ad90826110f8565b6002556001600160a01b0382166000908152602081905260409020546114d390826110f8565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b600080611536838561194b565b9050600083121580156115495750838113155b806110775750600083128015611077575083811361102b57600080fd5b6001600160a01b0382166115c65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161074f565b6115d282600083610d1b565b61160f8160405180606001604052806022815260200161198b602291396001600160a01b0385166000908152602081905260409020549190610f6f565b6001600160a01b0383166000908152602081905260409020556002546116359082611308565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161151d565b600060208083528351808285015260005b818110156116a357858101830151858201604001528201611687565b818111156116b5576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146109b957600080fd5b600080604083850312156116f357600080fd5b82356116fe816116cb565b946020939093013593505050565b60006020828403121561171e57600080fd5b5035919050565b60006020828403121561173757600080fd5b813561102b816116cb565b60008060006060848603121561175757600080fd5b8335611762816116cb565b92506020840135611772816116cb565b929592945050506040919091013590565b80151581146109b957600080fd5b600080604083850312156117a457600080fd5b82356117af816116cb565b915060208301356117bf81611783565b809150509250929050565b600080604083850312156117dd57600080fd5b82356117e8816116cb565b915060208301356117bf816116cb565b600181811c9082168061180c57607f821691505b60208210810361182c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008261189a57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156118b1576118b1611867565b500390565b60008160001904831182151516156118d0576118d0611867565b500290565b600080821280156001600160ff1b03849003851316156118f7576118f7611867565b600160ff1b839003841281161561191057611910611867565b50500190565b6000821982111561192957611929611867565b500190565b60006020828403121561194057600080fd5b815161102b81611783565b60008083128015600160ff1b85018412161561196957611969611867565b6001600160ff1b038401831381161561198457611984611867565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ad8a4e679892986de6208f5f50544e089cb36cf49949f3b702f57e42defc44fb64736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106101f25760003560e01c8063715018a61161010d578063a9059cbb116100a0578063bea9849e1161006f578063bea9849e146105b6578063dd62ed3e146105d6578063e30443bc1461061c578063f2fde38b1461063c578063f7c618c11461065c57600080fd5b8063a9059cbb1461052a578063aafd847a1461054a578063bc4c4b3714610580578063be10b614146105a057600080fd5b806391b89fba116100dc57806391b89fba146104b557806395d89b41146104d5578063a457c2d7146104ea578063a8b9d2401461050a57600080fd5b8063715018a61461044c57806385a6b3ae146104615780638aee8127146104775780638da5cb5b1461049757600080fd5b8063313ce567116101855780636a474002116101545780636a474002146103cb5780636bf5ecd5146103e05780636f2789ec1461040057806370a082311461041657600080fd5b8063313ce5671461033f57806331e79db01461035b578063395093511461037b5780634e7b827f1461039b57600080fd5b806318160ddd116101c157806318160ddd146102b3578063226cfa3d146102d257806323b872dd146102ff57806327ce01471461031f57600080fd5b806306fdde03146101fe578063095ea7b314610229578063163c7cef146102595780631694505e1461027b57600080fd5b366101f957005b600080fd5b34801561020a57600080fd5b5061021361067c565b6040516102209190611676565b60405180910390f35b34801561023557600080fd5b506102496102443660046116e0565b61070e565b6040519015158152602001610220565b34801561026557600080fd5b5061027961027436600461170c565b610725565b005b34801561028757600080fd5b5060095461029b906001600160a01b031681565b6040516001600160a01b039091168152602001610220565b3480156102bf57600080fd5b506002545b604051908152602001610220565b3480156102de57600080fd5b506102c46102ed366004611725565b600d6020526000908152604090205481565b34801561030b57600080fd5b5061024961031a366004611742565b6107d6565b34801561032b57600080fd5b506102c461033a366004611725565b61083f565b34801561034b57600080fd5b5060405160128152602001610220565b34801561036757600080fd5b50610279610376366004611725565b61089b565b34801561038757600080fd5b506102496103963660046116e0565b610950565b3480156103a757600080fd5b506102496103b6366004611725565b600c6020526000908152604090205460ff1681565b3480156103d757600080fd5b50610279610986565b3480156103ec57600080fd5b506102796103fb36600461170c565b6109bc565b34801561040c57600080fd5b506102c4600e5481565b34801561042257600080fd5b506102c4610431366004611725565b6001600160a01b031660009081526020819052604090205490565b34801561045857600080fd5b50610279610a79565b34801561046d57600080fd5b506102c460075481565b34801561048357600080fd5b50610279610492366004611725565b610aed565b3480156104a357600080fd5b506005546001600160a01b031661029b565b3480156104c157600080fd5b506102c46104d0366004611725565b610b20565b3480156104e157600080fd5b50610213610b2b565b3480156104f657600080fd5b506102496105053660046116e0565b610b3a565b34801561051657600080fd5b506102c4610525366004611725565b610b89565b34801561053657600080fd5b506102496105453660046116e0565b610bb5565b34801561055657600080fd5b506102c4610565366004611725565b6001600160a01b03166000908152600b602052604090205490565b34801561058c57600080fd5b5061024961059b366004611791565b610bc2565b3480156105ac57600080fd5b506102c4600f5481565b3480156105c257600080fd5b506102796105d1366004611725565b610c70565b3480156105e257600080fd5b506102c46105f13660046117ca565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561062857600080fd5b506102796106373660046116e0565b610ca3565b34801561064857600080fd5b50610279610657366004611725565b610d21565b34801561066857600080fd5b5060085461029b906001600160a01b031681565b60606003805461068b906117f8565b80601f01602080910402602001604051908101604052809291908181526020018280546106b7906117f8565b80156107045780601f106106d957610100808354040283529160200191610704565b820191906000526020600020905b8154815290600101906020018083116106e757829003601f168201915b5050505050905090565b600061071b338484610e0c565b5060015b92915050565b6005546001600160a01b031633146107585760405162461bcd60e51b815260040161074f90611832565b60405180910390fd5b80600f54036107d1576040805162461bcd60e51b81526020600482015260248101919091527f6d696e696d756d546f6b656e42616c616e6365466f724469766964656e64732060448201527f616c7265616479207468652076616c7565206f6620276e657756616c7565272e606482015260840161074f565b600f55565b60006107e3848484610f30565b6108358433610830856040518060600160405280602881526020016119ad602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190610f6f565b610e0c565b5060019392505050565b6001600160a01b0381166000908152600a602090815260408083205491839052822054600654600160801b926108919261088c92610886916108819190610fa9565b611032565b90611042565b611080565b61071f919061187d565b6005546001600160a01b031633146108c55760405162461bcd60e51b815260040161074f90611832565b6001600160a01b0381166000908152600c602052604090205460ff16156108eb57600080fd5b6001600160a01b0381166000908152600c60205260408120805460ff19166001179055610919908290611093565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161071b91859061083090866110f8565b6005546001600160a01b031633146109b05760405162461bcd60e51b815260040161074f90611832565b6109b933611157565b50565b6005546001600160a01b031633146109e65760405162461bcd60e51b815260040161074f90611832565b60006109f160025490565b116109fb57600080fd5b80156109b957610a2e610a0d60025490565b610a1b83600160801b610fa9565b610a25919061187d565b600654906110f8565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600754610a7390826110f8565b60075550565b6005546001600160a01b03163314610aa35760405162461bcd60e51b815260040161074f90611832565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610b175760405162461bcd60e51b815260040161074f90611832565b6109b9816112bc565b600061071f82610b89565b60606004805461068b906117f8565b600061071b3384610830856040518060600160405280602581526020016119d5602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190610f6f565b6001600160a01b0381166000908152600b602052604081205461071f90610baf8461083f565b90611308565b600061071b338484610f30565b6005546000906001600160a01b03163314610bef5760405162461bcd60e51b815260040161074f90611832565b6000610bfa84611157565b90508015610c66576001600160a01b0384166000818152600d6020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610c549085815260200190565b60405180910390a3600191505061071f565b5060009392505050565b6005546001600160a01b03163314610c9a5760405162461bcd60e51b815260040161074f90611832565b6109b98161134a565b6005546001600160a01b03163314610ccd5760405162461bcd60e51b815260040161074f90611832565b6001600160a01b0382166000908152600c602052604090205460ff16610d1d57600f548110610d0557610d008282611093565b610d10565b610d10826000611093565b610d1b826001610bc2565b505b5050565b6005546001600160a01b03163314610d4b5760405162461bcd60e51b815260040161074f90611832565b6001600160a01b038116610db05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161074f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610e6e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161074f565b6001600160a01b038216610ecf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161074f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d1c985b9cd9995c9cc8185b1b1bddd95960621b604482015260640161074f565b60008184841115610f935760405162461bcd60e51b815260040161074f9190611676565b506000610fa0848661189f565b95945050505050565b600082600003610fbb5750600061071f565b6000610fc783856118b6565b905082610fd4858361187d565b1461102b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161074f565b9392505050565b6000818181121561071f57600080fd5b60008061104f83856118d5565b9050600083121580156110625750838112155b80611077575060008312801561107757508381125b61102b57600080fd5b60008082121561108f57600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156110d25760006110c08383611308565b90506110cc8482611396565b50610d1b565b80821015610d1b5760006110e68284611308565b90506110f284826113fa565b50505050565b6000806111058385611916565b90508381101561102b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161074f565b60008061116383610b89565b905080156112b3576001600160a01b0383166000908152600b602052604090205461118e90826110f8565b6001600160a01b0384166000818152600b6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906111dd9084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af1158015611239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d919061192e565b9050806112ac576001600160a01b0384166000908152600b60205260409020546112879083611308565b6001600160a01b039094166000908152600b6020526040812094909455509192915050565b5092915050565b50600092915050565b6005546001600160a01b031633146112e65760405162461bcd60e51b815260040161074f90611832565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600061102b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610f6f565b6005546001600160a01b031633146113745760405162461bcd60e51b815260040161074f90611832565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6113a0828261143e565b6113da6113bb61088183600654610fa990919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611529565b6001600160a01b039092166000908152600a602052604090209190915550565b6114048282611566565b6113da61141f61088183600654610fa990919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611042565b6001600160a01b0382166114945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161074f565b6114a060008383610d1b565b6002546114ad90826110f8565b6002556001600160a01b0382166000908152602081905260409020546114d390826110f8565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b600080611536838561194b565b9050600083121580156115495750838113155b806110775750600083128015611077575083811361102b57600080fd5b6001600160a01b0382166115c65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161074f565b6115d282600083610d1b565b61160f8160405180606001604052806022815260200161198b602291396001600160a01b0385166000908152602081905260409020549190610f6f565b6001600160a01b0383166000908152602081905260409020556002546116359082611308565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161151d565b600060208083528351808285015260005b818110156116a357858101830151858201604001528201611687565b818111156116b5576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146109b957600080fd5b600080604083850312156116f357600080fd5b82356116fe816116cb565b946020939093013593505050565b60006020828403121561171e57600080fd5b5035919050565b60006020828403121561173757600080fd5b813561102b816116cb565b60008060006060848603121561175757600080fd5b8335611762816116cb565b92506020840135611772816116cb565b929592945050506040919091013590565b80151581146109b957600080fd5b600080604083850312156117a457600080fd5b82356117af816116cb565b915060208301356117bf81611783565b809150509250929050565b600080604083850312156117dd57600080fd5b82356117e8816116cb565b915060208301356117bf816116cb565b600181811c9082168061180c57607f821691505b60208210810361182c57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008261189a57634e487b7160e01b600052601260045260246000fd5b500490565b6000828210156118b1576118b1611867565b500390565b60008160001904831182151516156118d0576118d0611867565b500290565b600080821280156001600160ff1b03849003851316156118f7576118f7611867565b600160ff1b839003841281161561191057611910611867565b50500190565b6000821982111561192957611929611867565b500190565b60006020828403121561194057600080fd5b815161102b81611783565b60008083128015600160ff1b85018412161561196957611969611867565b6001600160ff1b038401831381161561198457611984611867565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ad8a4e679892986de6208f5f50544e089cb36cf49949f3b702f57e42defc44fb64736f6c634300080f0033

Deployed Bytecode Sourcemap

42272:2506:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8263:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9318:210;;;;;;;;;;-1:-1:-1;9318:210:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;9318:210:0;1072:187:1;43653:303:0;;;;;;;;;;-1:-1:-1;43653:303:0;;;;;:::i;:::-;;:::i;:::-;;13099:30;;;;;;;;;;-1:-1:-1;13099:30:0;;;;-1:-1:-1;;;;;13099:30:0;;;;;;-1:-1:-1;;;;;1628:32:1;;;1610:51;;1598:2;1583:18;13099:30:0;1449:218:1;8584:108:0;;;;;;;;;;-1:-1:-1;8672:12:0;;8584:108;;;1818:25:1;;;1806:2;1791:18;8584:108:0;1672:177:1;42444:49:0;;;;;;;;;;-1:-1:-1;42444:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;9536:454;;;;;;;;;;-1:-1:-1;9536:454:0;;;;;:::i;:::-;;:::i;15384:372::-;;;;;;;;;;-1:-1:-1;15384:372:0;;;;;:::i;:::-;;:::i;8483:93::-;;;;;;;;;;-1:-1:-1;8483:93:0;;8566:2;2709:36:1;;2697:2;2682:18;8483:93:0;2567:184:1;43393:252:0;;;;;;;;;;-1:-1:-1;43393:252:0;;;;;:::i;:::-;;:::i;9998:300::-;;;;;;;;;;-1:-1:-1;9998:300:0;;;;;:::i;:::-;;:::i;42384:53::-;;;;;;;;;;-1:-1:-1;42384:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;13861:125;;;;;;;;;;;;;:::i;13412:441::-;;;;;;;;;;-1:-1:-1;13412:441:0;;;;;:::i;:::-;;:::i;42500:24::-;;;;;;;;;;;;;;;;8700:177;;;;;;;;;;-1:-1:-1;8700:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;8851:18:0;8819:7;8851:18;;;;;;;;;;;;8700:177;7382:148;;;;;;;;;;;;;:::i;13019:40::-;;;;;;;;;;;;;;;;43005:99;;;;;;;;;;-1:-1:-1;43005:99:0;;;;;:::i;:::-;;:::i;7168:79::-;;;;;;;;;;-1:-1:-1;7233:6:0;;-1:-1:-1;;;;;7233:6:0;7168:79;;14836:131;;;;;;;;;;-1:-1:-1;14836:131:0;;;;;:::i;:::-;;:::i;8371:104::-;;;;;;;;;;;;;:::i;10306:400::-;;;;;;;;;;-1:-1:-1;10306:400:0;;;;;:::i;:::-;;:::i;14975:216::-;;;;;;;;;;-1:-1:-1;14975:216:0;;;;;:::i;:::-;;:::i;8885:::-;;;;;;;;;;-1:-1:-1;8885:216:0;;;;;:::i;:::-;;:::i;15199:177::-;;;;;;;;;;-1:-1:-1;15199:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;15342:26:0;15310:7;15342:26;;;:18;:26;;;;;;;15199:177;44382:393;;;;;;;;;;-1:-1:-1;44382:393:0;;;;;:::i;:::-;;:::i;42531:46::-;;;;;;;;;;;;;;;;43112:105;;;;;;;;;;-1:-1:-1;43112:105:0;;;;;:::i;:::-;;:::i;9109:201::-;;;;;;;;;;-1:-1:-1;9109:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;9275:18:0;;;9243:7;9275:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9109:201;43964:410;;;;;;;;;;-1:-1:-1;43964:410:0;;;;;:::i;:::-;;:::i;7538:281::-;;;;;;;;;;-1:-1:-1;7538:281:0;;;;;:::i;:::-;;:::i;13066:26::-;;;;;;;;;;-1:-1:-1;13066:26:0;;;;-1:-1:-1;;;;;13066:26:0;;;8263:100;8317:13;8350:5;8343:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8263:100;:::o;9318:210::-;9437:4;9459:39;6556:10;9482:7;9491:6;9459:8;:39::i;:::-;-1:-1:-1;9516:4:0;9318:210;;;;;:::o;43653:303::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;;;;;;;;;43795:8:::1;43760:31;;:43:::0;43738:157:::1;;;::::0;;-1:-1:-1;;;43738:157:0;;5151:2:1;43738:157:0::1;::::0;::::1;5133:21:1::0;5170:18;;;5163:30;;;;5229:34;5209:18;;;5202:62;5300:34;5280:18;;;5273:62;5352:19;;43738:157:0::1;4949:428:1::0;43738:157:0::1;43906:31;:42:::0;43653:303::o;9536:454::-;9676:4;9693:36;9703:6;9711:9;9722:6;9693:9;:36::i;:::-;9740:220;9763:6;6556:10;9811:138;9867:6;9811:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9811:19:0;;;;;;:11;:19;;;;;;;;6556:10;9811:33;;;;;;;;;;:37;:138::i;:::-;9740:8;:220::i;:::-;-1:-1:-1;9978:4:0;9536:454;;;;;:::o;15384:372::-;-1:-1:-1;;;;;15665:36:0;;15498:7;15665:36;;;:28;:36;;;;;;;;;8851:18;;;;;;;15543:25;;-1:-1:-1;;;12957:6:0;15543:193;;:159;;:99;;:66;;:25;:47;:66::i;:::-;:97;:99::i;:::-;:121;;:159::i;:::-;:191;:193::i;:::-;:205;;;;:::i;43393:252::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43479:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;43478:31;43470:40;;;::::0;::::1;;-1:-1:-1::0;;;;;43521:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;:37;;-1:-1:-1;;43521:37:0::1;43554:4;43521:37;::::0;;43569:23:::1;::::0;43543:7;;43569:11:::1;:23::i;:::-;43608:29;::::0;-1:-1:-1;;;;;43608:29:0;::::1;::::0;::::1;::::0;;;::::1;43393:252:::0;:::o;9998:300::-;6556:10;10113:4;10207:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10207:34:0;;;;;;;;;;10113:4;;10135:133;;10185:7;;10207:50;;10246:10;10207:38;:50::i;13861:125::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;13934:44:::1;13966:10;13934:23;:44::i;:::-;;13861:125::o:0;13412:441::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;13520:1:::1;13504:13;8672:12:::0;;;8584:108;13504:13:::1;:17;13496:26;;;::::0;::::1;;13537:10:::0;;13533:313:::1;;13592:102;13666:13;8672:12:::0;;;8584:108;13666:13:::1;13640:23;13641:6:::0;-1:-1:-1;;;13640:12:0::1;:23::i;:::-;:39;;;;:::i;:::-;13592:25;::::0;;:29:::1;:102::i;:::-;13564:25;:130:::0;13714:40:::1;::::0;1818:25:1;;;13735:10:0::1;::::0;13714:40:::1;::::0;1806:2:1;1791:18;13714:40:0::1;;;;;;;13797:25;::::0;:37:::1;::::0;13827:6;13797:29:::1;:37::i;:::-;13769:25;:65:::0;13412:441;:::o;7382:148::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;7473:6:::1;::::0;7452:40:::1;::::0;7489:1:::1;::::0;-1:-1:-1;;;;;7473:6:0::1;::::0;7452:40:::1;::::0;7489:1;;7452:40:::1;7503:6;:19:::0;;-1:-1:-1;;;;;;7503:19:0::1;::::0;;7382:148::o;43005:99::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;43074:22:::1;43090:5;43074:15;:22::i;14836:131::-:0;14902:7;14929:30;14952:6;14929:22;:30::i;8371:104::-;8427:13;8460:7;8453:14;;;;;:::i;10306:400::-;10426:4;10448:228;6556:10;10498:7;10520:145;10577:15;10520:145;;;;;;;;;;;;;;;;;6556:10;10520:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10520:34:0;;;;;;;;;;;;:38;:145::i;14975:216::-;-1:-1:-1;;;;;15156:26:0;;15089:7;15156:26;;;:18;:26;;;;;;15121:62;;:30;15175:6;15121:22;:30::i;:::-;:34;;:62::i;8885:216::-;9007:4;9029:42;6556:10;9053:9;9064:6;9029:9;:42::i;44382:393::-;7295:6;;44500:4;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;44522:14:::1;44539:32;44563:7;44539:23;:32::i;:::-;44522:49:::0;-1:-1:-1;44586:10:0;;44582:163:::1;;-1:-1:-1::0;;;;;44613:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;44639:15:::1;44613:41:::0;;44674:33;;::::1;;::::0;44613:23;44674:33:::1;::::0;::::1;::::0;44689:6;1818:25:1;;1806:2;1791:18;;1672:177;44674:33:0::1;;;;;;;;44729:4;44722:11;;;;;44582:163;-1:-1:-1::0;44762:5:0::1;::::0;44382:393;-1:-1:-1;;;44382:393:0:o;43112:105::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;43184:25:::1;43202:6;43184:17;:25::i;43964:410::-:0;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44086:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;44133:7;44082:69;44179:31;;44165:10;:45;44161:166;;44227:32;44239:7;44248:10;44227:11;:32::i;:::-;44161:166;;;44292:23;44304:7;44313:1;44292:11;:23::i;:::-;44337:29;44352:7;44361:4;44337:14;:29::i;:::-;;7365:1;43964:410:::0;;:::o;7538:281::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7641:22:0;::::1;7619:110;;;::::0;-1:-1:-1;;;7619:110:0;;5938:2:1;7619:110:0::1;::::0;::::1;5920:21:1::0;5977:2;5957:18;;;5950:30;6016:34;5996:18;;;5989:62;-1:-1:-1;;;6067:18:1;;;6060:36;6113:19;;7619:110:0::1;5736:402:1::0;7619:110:0::1;7766:6;::::0;7745:38:::1;::::0;-1:-1:-1;;;;;7745:38:0;;::::1;::::0;7766:6:::1;::::0;7745:38:::1;::::0;7766:6:::1;::::0;7745:38:::1;7794:6;:17:::0;;-1:-1:-1;;;;;;7794:17:0::1;-1:-1:-1::0;;;;;7794:17:0;;;::::1;::::0;;;::::1;::::0;;7538:281::o;12169:378::-;-1:-1:-1;;;;;12305:19:0;;12297:68;;;;-1:-1:-1;;;12297:68:0;;6345:2:1;12297:68:0;;;6327:21:1;6384:2;6364:18;;;6357:30;6423:34;6403:18;;;6396:62;-1:-1:-1;;;6474:18:1;;;6467:34;6518:19;;12297:68:0;6143:400:1;12297:68:0;-1:-1:-1;;;;;12384:21:0;;12376:68;;;;-1:-1:-1;;;12376:68:0;;6750:2:1;12376:68:0;;;6732:21:1;6789:2;6769:18;;;6762:30;6828:34;6808:18;;;6801:62;-1:-1:-1;;;6879:18:1;;;6872:32;6921:19;;12376:68:0;6548:398:1;12376:68:0;-1:-1:-1;;;;;12455:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12507:32;;1818:25:1;;;12507:32:0;;1791:18:1;12507:32:0;;;;;;;12169:378;;;:::o;43225:160::-;43339:38;;-1:-1:-1;;;43339:38:0;;7153:2:1;43339:38:0;;;7135:21:1;7192:2;7172:18;;;7165:30;-1:-1:-1;;;7211:18:1;;;7204:50;7271:18;;43339:38:0;6951:344:1;3375:226:0;3495:7;3531:12;3523:6;;;;3515:29;;;;-1:-1:-1;;;3515:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3555:9:0;3567:5;3571:1;3567;:5;:::i;:::-;3555:17;3375:226;-1:-1:-1;;;;;3375:226:0:o;3609:471::-;3667:7;3912:1;3917;3912:6;3908:47;;-1:-1:-1;3942:1:0;3935:8;;3908:47;3967:9;3979:5;3983:1;3979;:5;:::i;:::-;3967:17;-1:-1:-1;4012:1:0;4003:5;4007:1;3967:17;4003:5;:::i;:::-;:10;3995:56;;;;-1:-1:-1;;;3995:56:0;;7805:2:1;3995:56:0;;;7787:21:1;7844:2;7824:18;;;7817:30;7883:34;7863:18;;;7856:62;-1:-1:-1;;;7934:18:1;;;7927:31;7975:19;;3995:56:0;7603:397:1;3995:56:0;4071:1;3609:471;-1:-1:-1;;;3609:471:0:o;6288:148::-;6344:6;6381:1;6402:6;;;;6394:15;;;;;5805:176;5861:6;;5891:5;5895:1;5891;:5;:::i;:::-;5880:16;;5921:1;5916;:6;;:16;;;;;5931:1;5926;:6;;5916:16;5915:38;;;;5942:1;5938;:5;:14;;;;;5951:1;5947;:5;5938:14;5907:47;;;;;6126:127;6182:7;6215:1;6210;:6;;6202:15;;;;;;-1:-1:-1;6243:1:0;6126:127::o;16857:449::-;-1:-1:-1;;;;;8851:18:0;;16935:22;8851:18;;;;;;;;;;;16993:27;;;16989:310;;;17037:18;17058:30;:10;17073:14;17058;:30::i;:::-;17037:51;;17103:26;17109:7;17118:10;17103:5;:26::i;:::-;17022:119;16989:310;;;17164:14;17151:10;:27;17147:152;;;17195:18;17216:30;:14;17235:10;17216:18;:30::i;:::-;17195:51;;17261:26;17267:7;17276:10;17261:5;:26::i;:::-;17180:119;16924:382;16857:449;;:::o;3042:181::-;3100:7;;3132:5;3136:1;3132;:5;:::i;:::-;3120:17;;3161:1;3156;:6;;3148:46;;;;-1:-1:-1;;;3148:46:0;;8610:2:1;3148:46:0;;;8592:21:1;8649:2;8629:18;;;8622:30;8688:29;8668:18;;;8661:57;8735:18;;3148:46:0;8408:351:1;13994:834:0;14085:7;14110:29;14142:28;14165:4;14142:22;:28::i;:::-;14110:60;-1:-1:-1;14185:25:0;;14181:621;;-1:-1:-1;;;;;14254:24:0;;;;;;:18;:24;;;;;;:83;;14301:21;14254:28;:83::i;:::-;-1:-1:-1;;;;;14227:24:0;;;;;;:18;:24;;;;;;;:110;;;;14357:46;;;;;;14381:21;1818:25:1;;1806:2;1791:18;;1672:177;14357:46:0;;;;;;;;14440:11;;14433:106;;-1:-1:-1;;;14433:106:0;;-1:-1:-1;;;;;8964:32:1;;;14433:106:0;;;8946:51:1;9013:18;;;9006:34;;;14418:12:0;;14440:11;;14433:28;;8919:18:1;;14433:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14418:121;;14559:7;14554:194;;-1:-1:-1;;;;;14614:24:0;;;;;;:18;:24;;;;;;:91;;14665:21;14614:28;:91::i;:::-;-1:-1:-1;;;;;14587:24:0;;;;;;;:18;:24;;;;;:118;;;;-1:-1:-1;14587:24:0;;13994:834;-1:-1:-1;;13994:834:0:o;14554:194::-;-1:-1:-1;14769:21:0;13994:834;-1:-1:-1;;13994:834:0:o;14181:621::-;-1:-1:-1;14819:1:0;;13994:834;-1:-1:-1;;13994:834:0:o;17314:97::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;17384:11:::1;:19:::0;;-1:-1:-1;;;;;;17384:19:0::1;-1:-1:-1::0;;;;;17384:19:0;;;::::1;::::0;;;::::1;::::0;;17314:97::o;3231:136::-;3289:7;3316:43;3320:1;3323;3316:43;;;;;;;;;;;;;;;;;:3;:43::i;17419:114::-;7295:6;;-1:-1:-1;;;;;7295:6:0;6556:10;7295:22;7287:67;;;;-1:-1:-1;;;7287:67:0;;;;;;;:::i;:::-;17492:15:::1;:33:::0;;-1:-1:-1;;;;;;17492:33:0::1;-1:-1:-1::0;;;;;17492:33:0;;;::::1;::::0;;;::::1;::::0;;17419:114::o;16277:282::-;16353:27;16365:7;16374:5;16353:11;:27::i;:::-;16431:120;16497:53;16498:36;16528:5;16498:25;;:29;;:36;;;;:::i;16497:53::-;-1:-1:-1;;;;;16431:61:0;;;;;;:28;:61;;;;;;;:65;:120::i;:::-;-1:-1:-1;;;;;16391:37:0;;;;;;;:28;:37;;;;;:160;;;;-1:-1:-1;16277:282:0:o;16567:::-;16643:27;16655:7;16664:5;16643:11;:27::i;:::-;16721:120;16787:53;16788:36;16818:5;16788:25;;:29;;:36;;;;:::i;16787:53::-;-1:-1:-1;;;;;16721:61:0;;;;;;:28;:61;;;;;;;:65;:120::i;11328:374::-;-1:-1:-1;;;;;11412:21:0;;11404:65;;;;-1:-1:-1;;;11404:65:0;;9503:2:1;11404:65:0;;;9485:21:1;9542:2;9522:18;;;9515:30;9581:33;9561:18;;;9554:61;9632:18;;11404:65:0;9301:355:1;11404:65:0;11480:49;11509:1;11513:7;11522:6;11480:20;:49::i;:::-;11555:12;;:24;;11572:6;11555:16;:24::i;:::-;11540:12;:39;-1:-1:-1;;;;;11611:18:0;;:9;:18;;;;;;;;;;;:30;;11634:6;11611:22;:30::i;:::-;-1:-1:-1;;;;;11590:18:0;;:9;:18;;;;;;;;;;;:51;;;;11657:37;;1818:25:1;;;11590:18:0;;:9;;11657:37;;1791:18:1;11657:37:0;;;;;;;;11328:374;;:::o;5621:176::-;5677:6;;5707:5;5711:1;5707;:5;:::i;:::-;5696:16;;5737:1;5732;:6;;:16;;;;;5747:1;5742;:6;;5732:16;5731:38;;;;5758:1;5754;:5;:14;;;;;5767:1;5763;:5;5723:47;;;;;11710:451;-1:-1:-1;;;;;11794:21:0;;11786:67;;;;-1:-1:-1;;;11786:67:0;;10135:2:1;11786:67:0;;;10117:21:1;10174:2;10154:18;;;10147:30;10213:34;10193:18;;;10186:62;-1:-1:-1;;;10264:18:1;;;10257:31;10305:19;;11786:67:0;9933:397:1;11786:67:0;11864:49;11885:7;11902:1;11906:6;11864:20;:49::i;:::-;11945:105;11982:6;11945:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11945:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;11924:18:0;;:9;:18;;;;;;;;;;:126;12076:12;;:24;;12093:6;12076:16;:24::i;:::-;12061:12;:39;12116:37;;1818:25:1;;;12142:1:0;;-1:-1:-1;;;;;12116:37:0;;;;;1806:2:1;1791:18;12116:37:0;1672:177:1;14:597;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1264:180::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;-1:-1:-1;1415:23:1;;1264:180;-1:-1:-1;1264:180:1:o;1854:247::-;1913:6;1966:2;1954:9;1945:7;1941:23;1937:32;1934:52;;;1982:1;1979;1972:12;1934:52;2021:9;2008:23;2040:31;2065:5;2040:31;:::i;2106:456::-;2183:6;2191;2199;2252:2;2240:9;2231:7;2227:23;2223:32;2220:52;;;2268:1;2265;2258:12;2220:52;2307:9;2294:23;2326:31;2351:5;2326:31;:::i;:::-;2376:5;-1:-1:-1;2433:2:1;2418:18;;2405:32;2446:33;2405:32;2446:33;:::i;:::-;2106:456;;2498:7;;-1:-1:-1;;;2552:2:1;2537:18;;;;2524:32;;2106:456::o;2964:118::-;3050:5;3043:13;3036:21;3029:5;3026:32;3016:60;;3072:1;3069;3062:12;3087:390;3160:6;3168;3221:2;3209:9;3200:7;3196:23;3192:32;3189:52;;;3237:1;3234;3227:12;3189:52;3276:9;3263:23;3295:31;3320:5;3295:31;:::i;:::-;3345:5;-1:-1:-1;3402:2:1;3387:18;;3374:32;3415:30;3374:32;3415:30;:::i;:::-;3464:7;3454:17;;;3087:390;;;;;:::o;3482:388::-;3550:6;3558;3611:2;3599:9;3590:7;3586:23;3582:32;3579:52;;;3627:1;3624;3617:12;3579:52;3666:9;3653:23;3685:31;3710:5;3685:31;:::i;:::-;3735:5;-1:-1:-1;3792:2:1;3777:18;;3764:32;3805:33;3764:32;3805:33;:::i;4203:380::-;4282:1;4278:12;;;;4325;;;4346:61;;4400:4;4392:6;4388:17;4378:27;;4346:61;4453:2;4445:6;4442:14;4422:18;4419:38;4416:161;;4499:10;4494:3;4490:20;4487:1;4480:31;4534:4;4531:1;4524:15;4562:4;4559:1;4552:15;4416:161;;4203:380;;;:::o;4588:356::-;4790:2;4772:21;;;4809:18;;;4802:30;4868:34;4863:2;4848:18;;4841:62;4935:2;4920:18;;4588:356::o;5382:127::-;5443:10;5438:3;5434:20;5431:1;5424:31;5474:4;5471:1;5464:15;5498:4;5495:1;5488:15;5514:217;5554:1;5580;5570:132;;5624:10;5619:3;5615:20;5612:1;5605:31;5659:4;5656:1;5649:15;5687:4;5684:1;5677:15;5570:132;-1:-1:-1;5716:9:1;;5514:217::o;7300:125::-;7340:4;7368:1;7365;7362:8;7359:34;;;7373:18;;:::i;:::-;-1:-1:-1;7410:9:1;;7300:125::o;7430:168::-;7470:7;7536:1;7532;7528:6;7524:14;7521:1;7518:21;7513:1;7506:9;7499:17;7495:45;7492:71;;;7543:18;;:::i;:::-;-1:-1:-1;7583:9:1;;7430:168::o;8005:265::-;8044:3;8072:9;;;8097:10;;-1:-1:-1;;;;;8116:27:1;;;8109:35;;8093:52;8090:78;;;8148:18;;:::i;:::-;-1:-1:-1;;;8195:19:1;;;8188:27;;8180:36;;8177:62;;;8219:18;;:::i;:::-;-1:-1:-1;;8255:9:1;;8005:265::o;8275:128::-;8315:3;8346:1;8342:6;8339:1;8336:13;8333:39;;;8352:18;;:::i;:::-;-1:-1:-1;8388:9:1;;8275:128::o;9051:245::-;9118:6;9171:2;9159:9;9150:7;9146:23;9142:32;9139:52;;;9187:1;9184;9177:12;9139:52;9219:9;9213:16;9238:28;9260:5;9238:28;:::i;9661:267::-;9700:4;9729:9;;;9754:10;;-1:-1:-1;;;9773:19:1;;9766:27;;9750:44;9747:70;;;9797:18;;:::i;:::-;-1:-1:-1;;;;;9844:27:1;;9837:35;;9829:44;;9826:70;;;9876:18;;:::i;:::-;-1:-1:-1;;9913:9:1;;9661:267::o

Swarm Source

ipfs://ad8a4e679892986de6208f5f50544e089cb36cf49949f3b702f57e42defc44fb
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.