ETH Price: $3,383.79 (-1.75%)
Gas: 2 Gwei

Token

Marshall Fighting Championship (MFC)
 

Overview

Max Total Supply

1,000,000,000 MFC

Holders

1,855

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
30.857909196090802605 MFC

Value
$0.00
0x55f2e85fd0c6fb9f6ccfbd9294c08c9171df13f7
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:
MarshallFightingChampionship

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 2 of 5 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 5 : IUniswapV2Factory.sol
pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 4 of 5 : IUniswapV2Pair.sol
pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 5 of 5 : MFC.sol
// SPDX-License-Identifier: UNLICENSED

/**
 * 
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMX0NMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKKMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWNXKKKKKXXNMMMMMMMMMMMMMMMMMMM
MMMMMMk';kNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0l.oWMMMMMMMMMMMMW0l:::;::;;::::::::::::::::::::l0MMMMMMMMMMMMMMMMMMMMMMWKOdl:,'........';cox0NMMMMMMMMMMMMM
MMMMMMk.  ;kNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0l.  lWMMMMMMMMMMMMMWO:.                          .xMMMMMMMMMMMMMMMMMMMXOl,.                   .':xKWMMMMMMMMM
MMMMMMk.    ;kNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0l.    lWMMMMMMMMMMMMMMMWO:.                        .kMMMMMMMMMMMMMMMMMMNd.                          .;xNMMMMMMM
MMMMMMk.      ;kNMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0l.      lWMMMMMMMMMMMMMMMMMWO:.                      .kMMMMMMMMMMMMMMMMMMMNk;                            'xNMMMMM
MMMMMMk.        ;kNMMMMMMMMMMMMMMMMMMMMMMMMW0c.        lWMMMMMMMMMMMMMMMMMMMWO:.....................,OMMMMMMMMMMMMMMMMMMMMMNk;     .,;:cc::,..          'xNMMMMM
MMMMMMO.          ;kNMMMMMMMMMMMMMMMMMMMMW0c.          lWMMMMMMMMMMMMMMMMMMMMMWNXXXXXXXXXXXXXXXXXXXXXWMMMMMMMMMMMWKXMMMMMMMMMNk:cx0XWMMMMMMWNKkl,     ,xNMMMMMMM
MMMMMMWO:.          ;kNMMMMMMMMMMMMMMMMW0c.            lWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWx..oXWMMMMMMMMMMMMMMMMMMMMMMMMMNOc.,xNMMMMMMMMM
MMMMMMMMWO:.          ;kNMMMMMMMMMMMMW0c.              lWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMk.   .oKMMMMMMMMMMMMMMMMMMMMMMMMMMWXNMMMMMMMMMMM
MMMMMMMMMMWO:.          ;kNMMMMMMMMW0c.                lWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK;      .oKWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMWO:.          ;kNMMMMW0c.                  lWMMMMMMMMMMMMXkddddddddddddddddddddddddddddKMMMMMMMMMMMx.        ,KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMWO:.          ;kNW0c.                    lWMMMMMMMMMMMMk.                            oMMMMMMMMMMWl         ;XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMWO:.          ,:.          ,xl.        lWMMMMMMMMMMMMk.                            oMMMMMMMMMMN:         cWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMKd0WMMMMMMMMWO:.                   ,xNMd         lWMMMMMMMMMMMMk.                            oMMMMMMMMMMN:         cWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMk..c0WMMMMMMMMWO:.               ,xNMMMd         lWMMMMMMMMMMMMk.                           .dMMMMMMMMMMWo         ,KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMk.  .c0WMMMMMMMMWO:.           ,xNMMMMMd         lWMMMMMMMMMMMMk.        .,oOOOOOOOOOOOOOOOOOXMMMMMMMMMMMk.         oWMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMk.    .c0WMMMMMMMMWO:.       ,xNMMMMMMMd         lWMMMMMMMMMMMMk.        .cOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNc         .oNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMk.      .c0WMMMMMMMMWO:.   ,xNMMMMMMMMMd         lWMMMMMMMMMMMMk.        .cOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK,          ;OWMMMMMMMMMMMMMMMMMMWKdkNMMMMMMMMMM
MMMMMMk.        cNMMMMMMMMMMWOc;xNMMMMMMMMMMMd         lWMMMMMMMMMMMMk.        .cOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0,          .:xXWMMMMMMMMMMMMMNOc.  ,xNMMMMMMMM
MMMMMMk.        :NMMMMMMMMMMMMWWMMMMMMMMMMMMMd         lWMMMMMMMMMMMMk.        .cOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXc.           .;lxO0KKKK0Oxo:'       ,xNMMMMMM
MMMMMMk.        :NMMMMMMMMMMMMMMMMMMMMMMMMMMMd         lWMMMMMMMMMMMMk.        .cOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNk,               ......              lXMMMMM
MMMMMMk.        :NMMMMMMMMMMMMMMMMMMMMMMMMMMMd         lWMMMMMMMMMMMMk.        .cOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNx;.                              .oKWMMMMM
MMMMMMk.        :NMMMMMMMMMMMMMMMMMMMMMMMMMMMd         lWMMMMMMMMMMMMk.        .cOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMW0o,.                        .:xXMMMMMMMM
MMMMMMk.        :NMMMMMMMMMMMMMMMMMMMMMMMMMMMd.        lWMMMMMMMMMMMMk.        .cOMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN0dc,.               ..;lkXWMMMMMMMMMM
MMMMMMXOxxxxxxxx0WMMMMMMMMMMMMMMMMMMMMMMMMMMMXkxxxxxxxxKMMMMMMMMMMMMMXkxxxxxxxxOKNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWXOxdolc::::clodk0NWMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM                               


Telegram: https://t.me/MFCworld 
Website: https://mfc.com

*/

pragma solidity 0.8.18;



import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";
import "@openzeppelin/contracts/access/Ownable.sol";



interface IUniswapV2Router02 {
    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 swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

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

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

    function decimals() external view returns (uint8);

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

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

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

contract MarshallFightingChampionship is IERC20, Ownable {
    ////////////////////////// address //////////////////////////

    address[] private _excluded; // addresses excluded from rewards

    address public lpPair;
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;

    ////////////////////////// uint //////////////////////////

    uint256 private constant _tTotal = 1_000_000_000 * 10**_decimals;
    uint256 private constant MAX = ~uint256(0);
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 constant taxDivisor = 1000;
    uint256 public swapThreshold;
    uint256 public launchedAt;
    uint256 public deadBlocks;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForMarketing;
    uint256 private _tokensForStaking;

    ////////////////////////// mappings //////////////////////////

    mapping(address => uint256) public _rOwned; // balance of  holders getting reflections
    mapping(address => uint256) _tOwned; // tokens owned if excluded from rewards
    mapping(address => bool) private lpPairs;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _liquidityProviders;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) private _isExcludedFromRewards;
    mapping(address => bool) private _isExcludedFromLimits;
    mapping(address => bool) private isPresaler;

    ////////////////////////// bool //////////////////////////

    bool private inSwap;
    bool public swapAndLiquifyEnabled = false;
    bool public tradingStarted = false;
    bool public _hasLiqBeenAdded = false;
    bool public allowPresaleExclusion = true;

    ////////////////////////// token info //////////////////////////

    string private constant _name = "Marshall Fighting Championship";
    string private constant _symbol = "MFC";
    uint8 private constant _decimals = 18;

    ////////////////////////// router //////////////////////////

    IUniswapV2Router02 public uniswapRouter;

    ////////////////////////// struct //////////////////////////

    struct Fees {
        uint16 buyTotalFee;
        uint16 sellTotalFee;
        uint16 reflectionBuy;
        uint16 marketingBuy;
        uint16 liquidityBuy;
        uint16 stakingBuy;
        uint16 reflectionSell;
        uint16 marketingSell;
        uint16 liquiditySell;
        uint16 stakingSell;
    }

    // max wallet and max txs are in % of total supply
    struct Limits {
        uint16 buyLimit;
        uint16 sellLimit;
        uint16 maxWallet;
    }
    // Extra values for the transfer function
    struct ExtraValues {
        uint256 tTransferAmount;
        uint256 tFee;
        uint256 tSwap;
        uint256 rTransferAmount;
        uint256 rAmount;
        uint256 rFee;
        uint256 currentRate;
    }

    // receiver addresses for fees
    struct FeeReceivers {
        address payable marketing;
        address payable staking;
    }

    Fees public _taxRates =
        Fees({
            buyTotalFee: 60,
            sellTotalFee: 60,
            reflectionBuy: 10,
            marketingBuy: 30,
            liquidityBuy: 10,
            stakingBuy: 10,
            reflectionSell: 10,
            marketingSell: 30,
            liquiditySell: 10,
            stakingSell: 10
        });

    FeeReceivers public _FeeReceivers =
        FeeReceivers({marketing: payable(DEAD), staking: payable(DEAD)});

    Limits public limits =
        Limits({buyLimit: 50, sellLimit: 100, maxWallet: 50});

    ////////////////////////// errors //////////////////////////

    error InvalidContractSwapSettings(string error);
    error TradingNotActive(string error);
    error StartTradingError(string error);
    error InvalidRatioSettings(string error);
    error InvalidFeesSettings(string error);
    error InvalidLimitsSettings(string error);
    error InvalidFeeReceivers(string error);
    error MaxTxExceeded(string error);
    error MaxWalletExceeded(string error);

    ////////////////////////// events //////////////////////////

    event AutoLiquify(uint256 amountCurrency, uint256 amountTokens);
    event TradingStarted(bool tradingStarted);
    event LpPairsUpdated(address lpPair, bool isLpPair);
    event TaxesUpdated(
        uint16 buyTotalFee,
        uint16 sellTotalFee,
        uint16 reflectionBuy,
        uint16 marketingBuy,
        uint16 liquidityBuy,
        uint16 stakingBuy,
        uint16 reflectionSell,
        uint16 marketingSell,
        uint16 liquiditySell,
        uint16 stakingSell
    );
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 liquidityBalance,
        uint256 marketingBalance
    );
    event AutoLiquidityAdd(uint256 tokenAmount, uint256 currencyAmount);
    event ContractSwapSettingsUpdated(bool enabled, uint256 swapThreshold);
    event FeeReceiversUpdated(
        address payable marketing,
        address payable staking
    );
    event LimitsUpdated(uint16 buyLimit, uint16 sellLimit, uint16 maxWallet);
    event ExcludedFromRewardUpdated(address account, bool isExcluded);
    event ExcludedFromFeesUpdated(address account, bool isExcluded);
    event ExcludedFromLimitsUpdated(address account, bool isExcluded);
    event PresaleSet(address presale);
    event TokensSentToNFTStaking(address nftStakingPool, uint256 amount);

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

    constructor() payable {
        // Set the owner.
        _rOwned[owner()] = _rTotal;
        emit Transfer(address(0), owner(), _tTotal);

        uniswapRouter = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        lpPair = IUniswapV2Factory(uniswapRouter.factory()).createPair(
            uniswapRouter.WETH(),
            address(this)
        );

        lpPairs[lpPair] = true;

        _approve(owner(), address(uniswapRouter), type(uint256).max);
        _allowances[address(this)][address(uniswapRouter)] = type(uint256).max;
        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[DEAD] = true;
        _isExcludedFromLimits[owner()] = true;
        _isExcludedFromLimits[address(this)] = true;
        _isExcludedFromLimits[DEAD] = true;
        _isExcludedFromLimits[address(uniswapRouter)] = true;
        _liquidityProviders[owner()] = true;
    }

    receive() external payable {}

    ////////////////////////// trading functions //////////////////////////

    /**
     * @dev Transfer tokens to a specified address.
     * @param recipient The address to transfer to.
     * @param amount The amount of tokens to be transferred.
     */
    function transfer(address recipient, uint256 amount)
        public
        override
        returns (bool)
    {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev Overrides the ERC20 approve function tokens to a specified address.
     * @param spender Address of the spender allowed to spend the tokens.
     * @param amount The amount of tokens to be approved.
     */
    function approve(address spender, uint256 amount)
        external
        override
        returns (bool)
    {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev Overrides the ERC20 transferFrom function to transfer tokens from one address to another.
     * @param sender The address which you want to send tokens from.
     * @param recipient The address which you want to transfer to.
     * @param amount The amount of tokens to be transferred.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        if (_allowances[sender][msg.sender] != type(uint256).max) {
            _allowances[sender][msg.sender] -= amount;
        }

        return _transfer(sender, recipient, amount);
    }

    ////////////////////////// internal functions //////////////////////////

    /**
     * @dev Internal function to transfer tokens from one address to another.
     * This includes any fee or swap logic.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param amount The amount of tokens to be transferred.
     * @return A boolean that indicates if the operation was successful.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        bool buy = false;
        bool sell = false;
        bool other = false;

        if (lpPairs[from]) {
            buy = true;

            if (!_isExcludedFromLimits[to]) {
                if (amount > _tTotal / limits.buyLimit)
                    revert MaxTxExceeded("Max buy amount exceeded.");

                if (balanceOf(to) + amount > _tTotal / limits.maxWallet) {
                    revert MaxWalletExceeded("Max wallet amount exceeded.");
                }
            }
        } else if (lpPairs[to]) {
            sell = true;
            if (
                !_isExcludedFromLimits[from] &&
                amount > _tTotal / limits.sellLimit
            ) {
                revert MaxTxExceeded("Max sell amount exceeded.");
            }
        } else {
            if (
                balanceOf(to) + amount > _tTotal / limits.maxWallet &&
                !_isExcludedFromLimits[to]
            ) {
                revert MaxWalletExceeded("Max wallet amount exceeded.");
            }

            other = true;
        }
        if (_isLimited(from, to)) {
            if (!tradingStarted) {
                revert TradingNotActive("Trading not enabled!");
            }
        }

        if (sell) {
            if (!inSwap) {
                if (swapAndLiquifyEnabled) {
                    if (
                        balanceOf(address(this)) >= swapThreshold &&
                        (_tokensForLiquidity + _tokensForMarketing) >= swapThreshold
                    ) {
                        swapAndLiquify(swapThreshold);
                    }
                }
            }
        }

        return finalizeTransfer(from, to, amount, buy, sell, other);
    }

    /**
     * @dev Internal function, called during a transfer, to check wether liquidity has been added.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     */
    function _checkLiquidityAdd(address from, address to) internal {
        require(!_hasLiqBeenAdded, "Liquidity already added and marked.");
        if (!_isLimited(from, to) && to == lpPair) {
            _liquidityProviders[from] = true;
            _isExcludedFromFees[from] = true;
            _hasLiqBeenAdded = true;
        }
    }

    /**
     * @dev Internal function, called during a transfer, to check wether the sender or the recipient is limited.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     */
    function _isLimited(address from, address to) internal view returns (bool) {
        return
            from != owner() &&
            to != owner() &&
            tx.origin != owner() &&
            !_liquidityProviders[to] &&
            !_liquidityProviders[from] &&
            to != DEAD &&
            to != address(0) &&
            !isPresaler[from] &&
            !isPresaler[to] &&
            from != address(this);
    }

    /**
     * @dev Internal function, called during a sell transaction to activate a contract swap if the swapThreshold has been reached.
     * @param tokensToSwap amount of tokens to be swapped
     * emits SwapAndLiquify event
     */
    function swapAndLiquify(uint256 tokensToSwap) internal inSwapFlag {

        uint256 totalTokens = _tokensForLiquidity + _tokensForMarketing;

        if (tokensToSwap == 0 || totalTokens == 0) {
            return;
        }
        // portion of _tokensForLiquidity that must be paired up with eth
        uint256 amountToLiquify = ((tokensToSwap * _tokensForLiquidity) /
            totalTokens) / 2;

        //portion of tokens that must be swapped for eth
        uint256 amountToSwapForETH = tokensToSwap - amountToLiquify;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();

        uint256 beforeContractBalance = address(this).balance;

        try
            uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
                amountToSwapForETH,
                0,
                path,
                address(this),
                block.timestamp
            )
        {} catch {
            return;
        }

        bool success;
        // subtract eth previously present in the contract
        uint256 amtBalance = address(this).balance - beforeContractBalance;
        
        // calculate eth for marketing and liquidity
        uint256 marketingBalance = (amtBalance * _tokensForMarketing) / totalTokens;
        uint256 liquidityBalance = (amtBalance * _tokensForLiquidity) / totalTokens;

        // decreate the amount of tokens for liquidity and marketing based on the sold amount
        _tokensForLiquidity -= (tokensToSwap * _tokensForLiquidity) / totalTokens;
        _tokensForMarketing -= (tokensToSwap * _tokensForMarketing) / totalTokens;

        if (liquidityBalance > 0) {
            try
                uniswapRouter.addLiquidityETH{value: liquidityBalance}(
                    address(this),
                    amountToLiquify,
                    0,
                    0,
                    owner(),
                    block.timestamp
                )
            {
                emit AutoLiquidityAdd(amountToLiquify, liquidityBalance);
            } catch {}
        }

        if (
            _FeeReceivers.marketing == address(0) ||
            _FeeReceivers.marketing == DEAD ||
            _FeeReceivers.staking == address(0) ||
            _FeeReceivers.staking == DEAD
        ) {
            revert();
        }
        if (address(this).balance > 0) {
            (success, ) = _FeeReceivers.marketing.call{
                value: address(this).balance,
                gas: 35000
            }("");
        }

        emit SwapAndLiquify(tokensToSwap, liquidityBalance, marketingBalance);
    }

    /**
     * @dev Internal function, called to approve an address to spend tokens on behalf of the sender.
     * emits Approval event
     */
    function _approve(
        address sender,
        address spender,
        uint256 amount
    ) internal {
        require(sender != address(0), "ERC20: Zero Address");
        require(spender != address(0), "ERC20: Zero Address");

        _allowances[sender][spender] = amount;
        emit Approval(sender, spender, amount);
    }

    /**
     * @dev Internal function, called during a transfer, to update the amount of reflections owned by each address and finalize the transfer.
     * @param from The address which you want to send tokens from.
     * @param to The address which you want to transfer to.
     * @param tAmount The amount of tokens to be transferred.
     * @param buy Boolean to check if the transaction is a buy.
     * @param sell Boolean to check if the transaction is a sell.
     * @param other Boolean to check if the transaction is a wallet-to-wallet transfer.
     * emits Transfer event
     */
    function finalizeTransfer(
        address from,
        address to,
        uint256 tAmount,
        bool buy,
        bool sell,
        bool other
    ) internal returns (bool) {
        bool takeFee = true;
        if (
            _isExcludedFromFees[from] ||
            _isExcludedFromFees[to] ||
            other == true
        ) {
            takeFee = false;
        }

        ExtraValues memory values = takeTaxes(
            from,
            tAmount,
            takeFee,
            buy,
            sell
        );

        _rOwned[from] -= values.rAmount;
        _rOwned[to] += values.rTransferAmount;

        if (_isExcludedFromRewards[from]) {
            _tOwned[from] = _tOwned[from] - tAmount;
        }
        if (_isExcludedFromRewards[to]) {
            _tOwned[to] = _tOwned[to] + values.tTransferAmount;
        }

        if (values.rFee > 0 || values.tFee > 0) {
            _rTotal -= values.rFee;
        }
        emit Transfer(from, to, values.tTransferAmount);

        if (!_hasLiqBeenAdded) {
            _checkLiquidityAdd(from, to);
            if (!_hasLiqBeenAdded && _isLimited(from, to) && !other) {
                revert TradingNotActive("Pre-liquidity transfer protection.");
            }
        }

        return true;
    }

    /**
     * @dev Internal function, called during a transfer, to calculate the amount of tokens to be transferred, and the amount of tokens to be taxed.
     * @param from The address which you want to send tokens from.
     * @param tAmount The amount of tokens to be transferred.
     * @param takeFee Boolean to check if the transaction is a wallet-to-wallet transfer.
     * @param buy Boolean to check if the transaction is a buy.
     * @param sell Boolean to check if the transaction is a sell.
     * @return values Struct containing the amount of tokens to be transferred,
     *  the amount of tokens to be taxed,
     *  the amount of reflections to be transferred,
     *  the amount of reflections to be taxed,
     *  the current rate,
     *  and the amount of reflections to be added to the total supply.
     * emits Transfer event
     */
    function takeTaxes(
        address from,
        uint256 tAmount,
        bool takeFee,
        bool buy,
        bool sell
    ) internal returns (ExtraValues memory) {
        ExtraValues memory values;
        Fees memory fees = _taxRates;
        values.currentRate = _getRate();
        values.rAmount = tAmount * values.currentRate;

        if (takeFee) {
            uint256 feeAmount;
            if (buy && fees.buyTotalFee > 0) {
                if (launchedAt + deadBlocks >= block.number) {
                    // antiSnipe fee : 99% if sniped in the first deadBlocks
                    feeAmount = (tAmount * 99) / 100;
                } else {
                    feeAmount = (tAmount * fees.buyTotalFee) / taxDivisor;
                }

                // track the number tokens collected in the contract
                _tokensForLiquidity += (feeAmount * fees.liquidityBuy) / fees.buyTotalFee;
                _tokensForMarketing += (feeAmount * fees.marketingBuy) / fees.buyTotalFee;
                _tokensForStaking += (feeAmount * fees.stakingBuy) / fees.buyTotalFee;

                values.tFee = (feeAmount * fees.reflectionBuy) / fees.buyTotalFee;

            } else if (sell && fees.sellTotalFee > 0) {

                feeAmount = (tAmount * fees.sellTotalFee) / taxDivisor;
                values.tFee = (feeAmount * fees.reflectionSell) / fees.sellTotalFee;

                // track the number tokens collected in the contract
                _tokensForLiquidity += (feeAmount * fees.liquiditySell) / fees.sellTotalFee;
                _tokensForMarketing += (feeAmount * fees.marketingSell) / fees.sellTotalFee;
                _tokensForStaking += (feeAmount * fees.stakingSell) / fees.sellTotalFee;
            }

            values.tSwap = feeAmount - values.tFee;

            // if zero tax tTransfer = tAmount
            values.tTransferAmount = tAmount - (values.tFee + values.tSwap);
            values.rFee = values.tFee * values.currentRate;
        } else {
            values.tTransferAmount = tAmount;
        }

        if (values.tSwap > 0) {
            _rOwned[address(this)] += values.tSwap * values.currentRate;

            if (_isExcludedFromRewards[address(this)]) {
                _tOwned[address(this)] += values.tSwap;
            }
            emit Transfer(from, address(this), values.tSwap);
        }

        values.rTransferAmount =
            values.rAmount -
            (values.rFee + (values.tSwap * values.currentRate));

        return values;
    }

    /**
     * @dev Internal function returns the current rate of reflections to total tokens supply.
     */
    function _getRate() internal view returns (uint256) {
        uint256 rTotal = _rTotal;
        uint256 tTotal = _tTotal;
        uint256 rSupply = rTotal;
        uint256 tSupply = tTotal;

        if (_isExcludedFromRewards[lpPair]) {
            // Get the reflection and token amounts of the lpPair
            uint256 rLPOwned = _rOwned[lpPair];
            uint256 tLPOwned = _tOwned[lpPair];

            if (rLPOwned > rSupply || tLPOwned > tSupply)
                return rTotal / tTotal;

            rSupply -= rLPOwned;
            tSupply -= tLPOwned;
        }
        if (_excluded.length > 0) {
            for (uint8 i = 0; i < _excluded.length; i++) {
                uint256 rOwned = _rOwned[_excluded[i]];
                uint256 tOwned = _tOwned[_excluded[i]];

                if (rOwned > rSupply || tOwned > tSupply)
                    return rTotal / tTotal;

                rSupply = rSupply - rOwned;
                tSupply = tSupply - tOwned;
            }
        }

        if (rSupply < rTotal / tTotal) return rTotal / tTotal;
        return rSupply / tSupply;
    }

    ////////////////////////// external functions //////////////////////////

    /**
     * @dev Start trading if liquidity has been already added.
     * @notice This function can only be called by the contract owner, once.
     */
    function startTrading(uint256 _deadBlocks) external onlyOwner {
        if (tradingStarted)
            revert StartTradingError("Trading already enabled!");
        if (!_hasLiqBeenAdded)
            revert StartTradingError("Liquidity must be added.");

        if (_deadBlocks < 5) {
            deadBlocks = _deadBlocks;
        } else {
            revert StartTradingError("Dead blocks must be less than 5.");
        }

        swapAndLiquifyEnabled = true;
        tradingStarted = true;
        swapThreshold = (balanceOf(lpPair) * 10) / 1000;
        launchedAt = block.number;
        allowPresaleExclusion = false;
        emit TradingStarted(tradingStarted);
    }

    /**
     * @dev Transfer tokens stucked inside the contract to the marketing wallet.
     * @param amount : amount of tokens being transfered from the contract
     * @param token: contract of the token being transfered from the contract
     */
    function sweepTokens(uint256 amount, address token) external onlyOwner {
        IERC20 tokenContract = IERC20(token);
        if (
            _FeeReceivers.marketing == address(0) ||
            _FeeReceivers.marketing == DEAD
        ) revert();
        if (tokenContract.balanceOf(address(this)) < amount) revert();
        // if transfering MFC tokens
        if (token == address(this)) {
            uint256 contractTokens = _tokensForLiquidity + _tokensForMarketing + _tokensForStaking;
            if (balanceOf(address(this)) > contractTokens) {
                tokenContract.transfer(
                    _FeeReceivers.marketing,
                    balanceOf(address(this)) - contractTokens
                );
            }
        } else {
            tokenContract.transfer(_FeeReceivers.marketing, amount);
        }
    }

    /**
     * @dev Transfer ETH stucked inside the contract to the marketing wallet.
     */
    function sweep() external onlyOwner {
        uint256 balance = address(this).balance;
        if (
            _FeeReceivers.marketing == address(0) ||
            _FeeReceivers.marketing == DEAD
        ) revert();

        _FeeReceivers.marketing.transfer(balance);
    }

    ////////////////////////// external setters //////////////////////////

    /**
     * @dev Set the new uniswap router address.
     * @notice This function can only be called by the contract owner.
     * @param newRouter The address of the new uniswap router.
     */
    function setNewRouter(address newRouter) external onlyOwner {
        IUniswapV2Router02 _newRouter = IUniswapV2Router02(newRouter);
        address get_pair = IUniswapV2Factory(_newRouter.factory()).getPair(
            address(this),
            _newRouter.WETH()
        );
        if (get_pair == address(0)) {
            lpPair = IUniswapV2Factory(_newRouter.factory()).createPair(
                address(this),
                _newRouter.WETH()
            );
        } else {
            lpPair = get_pair;
        }
        uniswapRouter = _newRouter;

        _approve(address(this), address(uniswapRouter), type(uint256).max);
    }

    /**
     * @dev Set a new Liquidity pool Pair
     * @notice This function can only be called by the contract owner.
     * @param pair The address of the new pair.
     * @param enabled True if the pair is enabled, false otherwise.
     * emits LpPairsUpdated.
     */
    function setLpPair(address pair, bool enabled) external onlyOwner {
        lpPairs[pair] = enabled;
        emit LpPairsUpdated(pair, enabled);
    }

    /**
     * @dev Set the fee exclusion for an holder.
     * @notice This function can only be called by the contract owner.
     * @param account The address of the holder.
     * @param enabled True if the holder is excluded, false otherwise.
     * emits ExcludedFromFeesUpdated.
     */
    function setExcludedFromFees(address account, bool enabled)
        external
        onlyOwner
    {
        _isExcludedFromFees[account] = enabled;
        emit ExcludedFromFeesUpdated(account, enabled);
    }

    /**
     * @dev Set the max wallets and max transaciton limits.
     * @notice This function can only be called by the contract owner.
     * @param maxBuy The max buy limit divisor.
     * @param maxSell The max sell limit divisor.
     * @param maxWallet The max wallet limit divisor.
     * emits LimitsUpdated.
     */
    function setLimits(
        uint16 maxBuy,
        uint16 maxSell,
        uint16 maxWallet
    ) external onlyOwner {
        if (
            maxSell > 200 ||
            maxSell < 100 ||
            maxBuy > 200 ||
            maxBuy < 50 ||
            maxWallet > 200 ||
            maxWallet < 50
        )
            revert InvalidLimitsSettings(
                "Cannot exceed 2% or be lower than 0.5%"
            );

        limits.buyLimit = maxBuy;
        limits.sellLimit = maxSell;
        limits.maxWallet = maxWallet;
        emit LimitsUpdated(maxBuy, maxSell, maxWallet);
    }

    /**
     * @dev Set the presale address
     * @notice This function can only be called by the contract owner.
     * @param presale The address of the presale contract.
     * emit PresaleSet.
     */
    function setPresale(address presale) external onlyOwner {
        if (!allowPresaleExclusion) {
            revert();
        }
        _liquidityProviders[presale] = true;
        isPresaler[presale] = true;
        _isExcludedFromFees[presale] = true;
        _isExcludedFromLimits[presale] = true;
        setExcludedFromReward(presale, true);
        isPresaler[address(uniswapRouter)] = true;
        setExcludedFromReward(address(uniswapRouter), true);
        emit PresaleSet(presale);
    }

    /**
     * @dev exclude a wallet from max wallet limits
     * @notice This function can only be called by the contract owner.
     * @param account The address of the wallet.
     * @param isExcluded True if the wallet is excluded, false otherwise.
     * emits ExcludedFromLimitsUpdated.
     */
    function excludeFromLimits(address account, bool isExcluded)
        external
        onlyOwner
    {
        _isExcludedFromLimits[account] = isExcluded;
        emit ExcludedFromLimitsUpdated(account, isExcluded);
    }

    /**
     * @dev Set the fees for buy and sell transactions.
     * @notice This function can only be called by the contract owner.
     * @param reflectionBuy The reflection fee for buy transactions.
     * @param liquidityBuy The liquidity fee for buy transactions.
     * @param stakingBuy The staking fee for buy transactions.
     * @param marketingBuy The marketing fee for buy transactions.
     * @param reflectionSell The reflection fee for sell transactions.
     * @param liquiditySell The liquidity fee for sell transactions.
     * @param stakingSell The staking fee for sell transactions.
     * @param marketingSell The marketing fee for sell transactions.
     * emits TaxesUpdated event.
     */
    function setFees(
        uint16 reflectionBuy,
        uint16 liquidityBuy,
        uint16 stakingBuy,
        uint16 marketingBuy,
        uint16 reflectionSell,
        uint16 liquiditySell,
        uint16 stakingSell,
        uint16 marketingSell
    ) external onlyOwner {
        _taxRates.reflectionBuy = reflectionBuy;
        _taxRates.marketingBuy = marketingBuy;
        _taxRates.liquidityBuy = liquidityBuy;
        _taxRates.stakingBuy = stakingBuy;
        _taxRates.reflectionSell = reflectionSell;
        _taxRates.marketingSell = marketingSell;
        _taxRates.liquiditySell = liquiditySell;
        _taxRates.stakingSell = stakingSell;
        _taxRates.buyTotalFee = liquidityBuy + marketingBuy + stakingBuy;
        _taxRates.sellTotalFee = liquiditySell + marketingSell + stakingSell;
        if (_taxRates.buyTotalFee > 80 || _taxRates.sellTotalFee > 80)
            revert InvalidFeesSettings("Fees cannot exceed 8%.");

        emit TaxesUpdated(
            _taxRates.buyTotalFee,
            _taxRates.sellTotalFee,
            reflectionBuy,
            liquidityBuy,
            stakingBuy,
            marketingBuy,
            reflectionSell,
            liquiditySell,
            stakingSell,
            marketingSell
        );
    }

    /**
     * @dev Set the fee receivers.
     * @dev The marketing and staking addresses cannot be the zero address.
     * @notice This function can only be called by the contract owner.
     * @param marketing The address of the marketing wallet.
     * @param staking The address of the staking wallet.
     * emits FeeReceiversUpdated event.
     */
    function setFeeReceivers(address payable marketing, address payable staking)
        external
        onlyOwner
    {
        if (
            marketing == address(0) ||
            staking == address(0) ||
            marketing == DEAD ||
            staking == DEAD
        ) revert InvalidFeeReceivers("Fee receivers cannot be zero address.");
        _FeeReceivers.marketing = payable(marketing);
        _FeeReceivers.staking = payable(staking);
        emit FeeReceiversUpdated(marketing, staking);
    }

    /**
     * @dev Set the contract swap settings.
     * @notice This function can only be called by the contract owner.
     * @param _swapAndLiquifyEnabled True if the contract is allowed to swap and add liquidity, false otherwise.
     * @param thresholdPercent The percentage of the total supply that triggers the swap.
     * @param thresholdDivisor The divisor of the total supply that triggers the swap.
     * emits ContractSwapSettingsUpdated event.
     */
    function setContractSwapSettings(
        bool _swapAndLiquifyEnabled,
        uint256 thresholdPercent,
        uint256 thresholdDivisor
    ) external onlyOwner {
        swapAndLiquifyEnabled = _swapAndLiquifyEnabled;

        if (_swapAndLiquifyEnabled) {
            swapThreshold = (_tTotal * thresholdPercent) / thresholdDivisor;

            if (
                swapThreshold < _tTotal / 100_000 ||
                swapThreshold > _tTotal / 100
            )
                revert InvalidContractSwapSettings(
                    "SwapThreshold must be between 0.0001% and 1% of total supply."
                );
        }
        emit ContractSwapSettingsUpdated(_swapAndLiquifyEnabled, swapThreshold);
    }

    /**
     * @dev Set the reward exclusion for an holder.
     * @notice This function can only be called by the contract owner.
     * @param account The address of the holder.
     * @param enabled True if the holder is excluded, false otherwise.
     */
    function setExcludedFromReward(address account, bool enabled)
        public
        onlyOwner
    {
        if (enabled) {
            require(
                !_isExcludedFromRewards[account],
                "Account is already excluded."
            );
            if (_rOwned[account] > 0) {
                _tOwned[account] = tokenFromReflection(_rOwned[account]);
            }
            _isExcludedFromRewards[account] = true;
            if (account != lpPair) {
                _excluded.push(account);
            }
        } else if (!enabled) {
            require(
                _isExcludedFromRewards[account],
                "Account is already included."
            );
            if (account == lpPair) {
                _rOwned[account] = _tOwned[account] * _getRate();
                _tOwned[account] = 0;
                _isExcludedFromRewards[account] = false;
            } else if (_excluded.length == 1) {
                _rOwned[account] = _tOwned[account] * _getRate();
                _tOwned[account] = 0;
                _isExcludedFromRewards[account] = false;
                _excluded.pop();
            } else {
                for (uint256 i = 0; i < _excluded.length; i++) {
                    if (_excluded[i] == account) {
                        _excluded[i] = _excluded[_excluded.length - 1];
                        _rOwned[account] = _tOwned[account] * _getRate();
                        _tOwned[account] = 0;
                        _isExcludedFromRewards[account] = false;
                        _excluded.pop();
                        break;
                    }
                }
            }
        }
        emit ExcludedFromRewardUpdated(account, enabled);
    }

    /**
     * @dev Distribute the tokens collected from fees to the nft staking pool.
     * @notice This function can only be called by the contract owner.
     */
    function sendNFTStakingRewards() external onlyOwner {
        if (
            _FeeReceivers.staking == address(0) || _FeeReceivers.staking == DEAD
        ) revert();

        if (
            _tokensForStaking > 0 &&
            _tokensForStaking <= balanceOf(address(this))
        ) {
            bool success = _transfer(
                address(this),
                _FeeReceivers.staking,
                _tokensForStaking
            );
            if (success) _tokensForStaking = 0;

            emit TokensSentToNFTStaking(
                _FeeReceivers.staking,
                _tokensForStaking
            );
        }
    }

    ////////////////////////////////// External getters  ///////////////////////////////////////
    /**
     * @dev Check whether the holder is excluded from rewards.
     * @param account The holder address.
     */
    function isExcludedFromReward(address account)
        external
        view
        returns (bool)
    {
        return _isExcludedFromRewards[account];
    }

    /**
     * @dev Check whether the holder is excluded from free.
     * @param account The holder address.
     */
    function isExcludedFromFees(address account) external view returns (bool) {
        return _isExcludedFromFees[account];
    }

    /**
     * @dev Check whether the holder is excluded from limits.
     * @param account The holder address.
     */
    function isExcludedFromLimits(address account)
        external
        view
        returns (bool)
    {
        return _isExcludedFromLimits[account];
    }

    /**
     * @dev Returns the maximum amount of tokens that can be bought, sold or held by a wallet.
     */
    function getLimits()
        external
        view
        returns (
            uint256 maxBuy,
            uint256 maxSell,
            uint256 maxWallet
        )
    {
        return (
            _tTotal / limits.buyLimit,
            _tTotal / limits.sellLimit,
            _tTotal / limits.maxWallet
        );
    }

    /**
     * @dev Returns if the fees struct.
     */
    function getFees() external view returns (Fees memory) {
        return _taxRates;
    }

    /**
     * @dev Returns the amount of contarct tokens allocated to liquidity, marketing, staking
     */
    function getContractTokens()
        external
        view
        returns (
            uint256 tokensForLiqudity,
            uint256 tokensForMarketing,
            uint256 tokensForStaking,
            uint256 totalTokens
        )
    {
        return (
        _tokensForLiquidity, _tokensForMarketing, _tokensForStaking,
        _tokensForLiquidity + _tokensForMarketing + _tokensForStaking
        );
    }

    ////////////////////////// public functions //////////////////////////
    /**
     * @dev Returns the total circulating supply.
     */
    function getCirculatingSupply() public view returns (uint256) {
        return (_tTotal - (balanceOf(DEAD) + balanceOf(address(0))));
    }

    /**
     * @dev Returns the amount token plus the reflection collected.
     * @param rAmount The holder balance
     */
    function tokenFromReflection(uint256 rAmount)
        public
        view
        returns (uint256)
    {
        require(
            rAmount <= _rTotal,
            "Amount must be less than total reflections"
        );
        uint256 currentRate = _getRate();
        return rAmount / currentRate;
    }

    ///////////////////////////////// ERC20 utility functions /////////////////////////////////
    /**
     * @dev Returns the token total supply.
     */
    function totalSupply() external pure override returns (uint256) {
        if (_tTotal == 0) {
            revert();
        }
        return _tTotal;
    }

    /**
     * @dev Returns the token number of decimals.
     */
    function decimals() external pure override returns (uint8) {
        if (_tTotal == 0) {
            revert();
        }
        return _decimals;
    }

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external pure override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the token name.
     */
    function name() external pure override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the allowance of the spender for the holder.
     * @param holder The address of the holder.
     * @param spender The address of the spender.
     */
    function allowance(address holder, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[holder][spender];
    }

    /**
     * @dev Returns the token balance of the holder.
     * @param account The address of the holder.
     */
    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcludedFromRewards[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"string","name":"error","type":"string"}],"name":"InvalidContractSwapSettings","type":"error"},{"inputs":[{"internalType":"string","name":"error","type":"string"}],"name":"InvalidFeeReceivers","type":"error"},{"inputs":[{"internalType":"string","name":"error","type":"string"}],"name":"InvalidFeesSettings","type":"error"},{"inputs":[{"internalType":"string","name":"error","type":"string"}],"name":"InvalidLimitsSettings","type":"error"},{"inputs":[{"internalType":"string","name":"error","type":"string"}],"name":"InvalidRatioSettings","type":"error"},{"inputs":[{"internalType":"string","name":"error","type":"string"}],"name":"MaxTxExceeded","type":"error"},{"inputs":[{"internalType":"string","name":"error","type":"string"}],"name":"MaxWalletExceeded","type":"error"},{"inputs":[{"internalType":"string","name":"error","type":"string"}],"name":"StartTradingError","type":"error"},{"inputs":[{"internalType":"string","name":"error","type":"string"}],"name":"TradingNotActive","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currencyAmount","type":"uint256"}],"name":"AutoLiquidityAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountCurrency","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"swapThreshold","type":"uint256"}],"name":"ContractSwapSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromRewardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"marketing","type":"address"},{"indexed":false,"internalType":"address payable","name":"staking","type":"address"}],"name":"FeeReceiversUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"buyLimit","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"sellLimit","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxWallet","type":"uint16"}],"name":"LimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lpPair","type":"address"},{"indexed":false,"internalType":"bool","name":"isLpPair","type":"bool"}],"name":"LpPairsUpdated","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":false,"internalType":"address","name":"presale","type":"address"}],"name":"PresaleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidityBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketingBalance","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"buyTotalFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"sellTotalFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"reflectionBuy","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"marketingBuy","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"liquidityBuy","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"stakingBuy","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"reflectionSell","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"marketingSell","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"liquiditySell","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"stakingSell","type":"uint16"}],"name":"TaxesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nftStakingPool","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensSentToNFTStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"tradingStarted","type":"bool"}],"name":"TradingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_FeeReceivers","outputs":[{"internalType":"address payable","name":"marketing","type":"address"},{"internalType":"address payable","name":"staking","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiqBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_rOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRates","outputs":[{"internalType":"uint16","name":"buyTotalFee","type":"uint16"},{"internalType":"uint16","name":"sellTotalFee","type":"uint16"},{"internalType":"uint16","name":"reflectionBuy","type":"uint16"},{"internalType":"uint16","name":"marketingBuy","type":"uint16"},{"internalType":"uint16","name":"liquidityBuy","type":"uint16"},{"internalType":"uint16","name":"stakingBuy","type":"uint16"},{"internalType":"uint16","name":"reflectionSell","type":"uint16"},{"internalType":"uint16","name":"marketingSell","type":"uint16"},{"internalType":"uint16","name":"liquiditySell","type":"uint16"},{"internalType":"uint16","name":"stakingSell","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowPresaleExclusion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"deadBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractTokens","outputs":[{"internalType":"uint256","name":"tokensForLiqudity","type":"uint256"},{"internalType":"uint256","name":"tokensForMarketing","type":"uint256"},{"internalType":"uint256","name":"tokensForStaking","type":"uint256"},{"internalType":"uint256","name":"totalTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFees","outputs":[{"components":[{"internalType":"uint16","name":"buyTotalFee","type":"uint16"},{"internalType":"uint16","name":"sellTotalFee","type":"uint16"},{"internalType":"uint16","name":"reflectionBuy","type":"uint16"},{"internalType":"uint16","name":"marketingBuy","type":"uint16"},{"internalType":"uint16","name":"liquidityBuy","type":"uint16"},{"internalType":"uint16","name":"stakingBuy","type":"uint16"},{"internalType":"uint16","name":"reflectionSell","type":"uint16"},{"internalType":"uint16","name":"marketingSell","type":"uint16"},{"internalType":"uint16","name":"liquiditySell","type":"uint16"},{"internalType":"uint16","name":"stakingSell","type":"uint16"}],"internalType":"struct MarshallFightingChampionship.Fees","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"maxBuy","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limits","outputs":[{"internalType":"uint16","name":"buyLimit","type":"uint16"},{"internalType":"uint16","name":"sellLimit","type":"uint16"},{"internalType":"uint16","name":"maxWallet","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sendNFTStakingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapAndLiquifyEnabled","type":"bool"},{"internalType":"uint256","name":"thresholdPercent","type":"uint256"},{"internalType":"uint256","name":"thresholdDivisor","type":"uint256"}],"name":"setContractSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"marketing","type":"address"},{"internalType":"address payable","name":"staking","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"reflectionBuy","type":"uint16"},{"internalType":"uint16","name":"liquidityBuy","type":"uint16"},{"internalType":"uint16","name":"stakingBuy","type":"uint16"},{"internalType":"uint16","name":"marketingBuy","type":"uint16"},{"internalType":"uint16","name":"reflectionSell","type":"uint16"},{"internalType":"uint16","name":"liquiditySell","type":"uint16"},{"internalType":"uint16","name":"stakingSell","type":"uint16"},{"internalType":"uint16","name":"marketingSell","type":"uint16"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maxBuy","type":"uint16"},{"internalType":"uint16","name":"maxSell","type":"uint16"},{"internalType":"uint16","name":"maxWallet","type":"uint16"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"presale","type":"address"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_deadBlocks","type":"uint256"}],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"sweepTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"tradingStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126012600a620007e3565b6200002290633b9aca00620007fb565b620000309060001962000815565b6200003e9060001962000838565b6003556013805464ffffffff0019166401000000001790556040805161014081018252603c808252602080830191909152600a828401819052601e60608085018290526080850183905260a0850183905260c0850183905260e085019190915261010084018290526101209093015260148054720a000a001e000a000a000a001e000a003c003c6001600160a01b0319918216179091558351808501855261dead80825290830181905260158054831682179055601680549092161790558251918201835260328083526064918301919091529101526017805464320064003265ffffffffffff1990911617905562000137336200057d565b600354600a6000620001516000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020556200017e6000546001600160a01b031690565b6001600160a01b031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620001b86012600a620007e3565b620001c890633b9aca00620007fb565b60405190815260200160405180910390a360138054787a250d5630b4cf539739df2c5dacb4c659f2488d0000000000600160281b600160c81b031990911617908190556040805163c45a015560e01b81529051650100000000009092046001600160a01b03169163c45a0155916004808201926020929091908290030181865afa1580156200025b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028191906200084e565b6001600160a01b031663c9c65396601360059054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200030991906200084e565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af115801562000356573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037c91906200084e565b600280546001600160a01b0319166001600160a01b039283169081179091556000908152600c60205260408120805460ff1916600117905554620003d991166013546501000000000090046001600160a01b0316600019620005cd565b306000908152600d602090815260408083206013546501000000000090046001600160a01b0316845290915281206000199055600190600f90620004256000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff19958616179055308152600f909252812080548316600190811790915561dead82527f99629f56119585bf27511b6b7d295dffb54757453fcc3dabcf51d92028301f1080549093168117909255601190620004ad6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260119093528183208054851660019081179091557f97847ee99463795296047093514439c3127772df3715e628aa85601cf85417168054861682179055601354650100000000009004909116835290822080549093168117909255600e906200054f6000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905562000879565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0383166200061f5760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b60448201526064015b60405180910390fd5b6001600160a01b0382166200066d5760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b604482015260640162000616565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000725578160001904821115620007095762000709620006ce565b808516156200071757918102915b93841c9390800290620006e9565b509250929050565b6000826200073e57506001620007dd565b816200074d57506000620007dd565b8160018114620007665760028114620007715762000791565b6001915050620007dd565b60ff841115620007855762000785620006ce565b50506001821b620007dd565b5060208310610133831016604e8410600b8410161715620007b6575081810a620007dd565b620007c28383620006e4565b8060001904821115620007d957620007d9620006ce565b0290505b92915050565b6000620007f460ff8416836200072d565b9392505050565b8082028115828204841417620007dd57620007dd620006ce565b6000826200083357634e487b7160e01b600052601260045260246000fd5b500690565b81810381811115620007dd57620007dd620006ce565b6000602082840312156200086157600080fd5b81516001600160a01b0381168114620007f457600080fd5b6140f280620008896000396000f3fe6080604052600436106102975760003560e01c80636d651d2c1161015a578063a9059cbb116100c1578063dd62ed3e1161007a578063dd62ed3e14610a41578063e10b9db714610a87578063eafb5a3c14610aa7578063f2fde38b14610ac7578063f562c60014610ae7578063fabb0b4f14610b0757600080fd5b8063a9059cbb1461088c578063bf56b371146108ac578063c0a904a2146108c2578063c3ffb884146108e2578063d5fcc7b614610917578063db8d55f11461093757600080fd5b8063860aefcf11610113578063860aefcf1461077457806388f82020146107c95780638da5cb5b1461080257806395d89b41146108205780639f5bf4251461084c578063a4b45c001461086c57600080fd5b80636d651d2c146106815780636f89e409146106c857806370a08231146106f8578063715018a614610718578063735de9f71461072d57806380c581d11461075457600080fd5b80632d838119116101fe5780634fbee193116101b75780634fbee1931461059957806350a8e016146105d257806354370d26146105f3578063590ffdce146106085780635b4f472a146106285780635cce86cd1461064857600080fd5b80632d838119146104de578063313ce567146104fe57806335faa41614610525578063452ed4f11461053a57806346a96b201461055a5780634a74bb021461057a57600080fd5b80630cfc15f9116102505780630cfc15f9146104265780630f4f10131461045357806313e461921461047457806318160ddd1461049457806323b872dd146104a95780632b112e49146104c957600080fd5b806303fd2a45146102a35780630445b667146102d6578063069d955f146102fa57806306a1409f1461038557806306fdde03146103a7578063095ea7b3146103f657600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b961dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102e257600080fd5b506102ec60045481565b6040519081526020016102cd565b34801561030657600080fd5b5060145461036f9061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b8204811691600160701b8104821691600160801b8204811691600160901b9004168a565b6040516102cd9a999897969594939291906139f2565b34801561039157600080fd5b506103a56103a0366004613a48565b610b1d565b005b3480156103b357600080fd5b5060408051808201909152601e81527f4d61727368616c6c204669676874696e67204368616d70696f6e73686970000060208201525b6040516102cd9190613a61565b34801561040257600080fd5b50610416610411366004613ac4565b610cd8565b60405190151581526020016102cd565b34801561043257600080fd5b506102ec610441366004613af0565b600a6020526000908152604090205481565b34801561045f57600080fd5b5060135461041690600160201b900460ff1681565b34801561048057600080fd5b506103a561048f366004613b1b565b610cef565b3480156104a057600080fd5b506102ec61117d565b3480156104b557600080fd5b506104166104c4366004613b54565b6111c4565b3480156104d557600080fd5b506102ec61123c565b3480156104ea57600080fd5b506102ec6104f9366004613a48565b611281565b34801561050a57600080fd5b50610513611305565b60405160ff90911681526020016102cd565b34801561053157600080fd5b506103a5611333565b34801561054657600080fd5b506002546102b9906001600160a01b031681565b34801561056657600080fd5b506103a5610575366004613bac565b6113a9565b34801561058657600080fd5b5060135461041690610100900460ff1681565b3480156105a557600080fd5b506104166105b4366004613af0565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156105de57600080fd5b50601354610416906301000000900460ff1681565b3480156105ff57600080fd5b506103a56114e4565b34801561061457600080fd5b506103a5610623366004613b1b565b6115b0565b34801561063457600080fd5b506013546104169062010000900460ff1681565b34801561065457600080fd5b50610416610663366004613af0565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561068d57600080fd5b506015546016546106a8916001600160a01b03908116911682565b604080516001600160a01b039384168152929091166020830152016102cd565b3480156106d457600080fd5b506106dd611614565b604080519384526020840192909252908201526060016102cd565b34801561070457600080fd5b506102ec610713366004613af0565b6116b4565b34801561072457600080fd5b506103a5611713565b34801561073957600080fd5b506013546102b990600160281b90046001600160a01b031681565b34801561076057600080fd5b506103a561076f366004613b1b565b611725565b34801561078057600080fd5b506017546107a49061ffff80821691620100008104821691600160201b9091041683565b6040805161ffff948516815292841660208401529216918101919091526060016102cd565b3480156107d557600080fd5b506104166107e4366004613af0565b6001600160a01b031660009081526010602052604090205460ff1690565b34801561080e57600080fd5b506000546001600160a01b03166102b9565b34801561082c57600080fd5b506040805180820190915260038152624d464360e81b60208201526103e9565b34801561085857600080fd5b506103a5610867366004613bef565b611789565b34801561087857600080fd5b506103a5610887366004613c14565b611994565b34801561089857600080fd5b506104166108a7366004613ac4565b611aa6565b3480156108b857600080fd5b506102ec60055481565b3480156108ce57600080fd5b506103a56108dd366004613b1b565b611abd565b3480156108ee57600080fd5b506108f7611b21565b6040805194855260208501939093529183015260608201526080016102cd565b34801561092357600080fd5b506103a5610932366004613af0565b611b5b565b34801561094357600080fd5b50610a346040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915250604080516101408101825260145461ffff808216835262010000820481166020840152600160201b8204811693830193909352600160301b810483166060830152600160401b810483166080830152600160501b8104831660a0830152600160601b8104831660c0830152600160701b8104831660e0830152600160801b81048316610100830152600160901b900490911661012082015290565b6040516102cd9190613c42565b348015610a4d57600080fd5b506102ec610a5c366004613c14565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b348015610a9357600080fd5b506103a5610aa2366004613d10565b611c58565b348015610ab357600080fd5b506103a5610ac2366004613af0565b611dbe565b348015610ad357600080fd5b506103a5610ae2366004613af0565b6120e3565b348015610af357600080fd5b506103a5610b02366004613d45565b61215c565b348015610b1357600080fd5b506102ec60065481565b610b2561238f565b60135462010000900460ff1615610b84576040516329ce02f160e01b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c656421000000000000000060448201526064015b60405180910390fd5b6013546301000000900460ff16610bde576040516329ce02f160e01b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401610b7b565b6005811015610bf1576006819055610c3a565b6040516329ce02f160e01b815260206004820181905260248201527f4465616420626c6f636b73206d757374206265206c657373207468616e20352e6044820152606401610b7b565b6013805462ffff001916620101001790556002546103e890610c64906001600160a01b03166116b4565b610c6f90600a613df2565b610c799190613e09565b600455436005556013805464ff000000001916908190556040517ff789dd0d6d54bc0d9b7a5955aac4c052f81fb39e63f533a8d4820f6e862c78a391610ccd916201000090910460ff161515815260200190565b60405180910390a150565b6000610ce53384846123e9565b5060015b92915050565b610cf761238f565b8015610e3f576001600160a01b03821660009081526010602052604090205460ff1615610d665760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610b7b565b6001600160a01b0382166000908152600a602052604090205415610dc0576001600160a01b0382166000908152600a6020526040902054610da690611281565b6001600160a01b0383166000908152600b60205260409020555b6001600160a01b038083166000818152601060205260409020805460ff1916600117905560025490911614610e3a576001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b611135565b80611135576001600160a01b03821660009081526010602052604090205460ff16610eac5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610b7b565b6002546001600160a01b0390811690831603610f2857610eca6124e2565b6001600160a01b0383166000908152600b6020526040902054610eed9190613df2565b6001600160a01b0383166000908152600a6020908152604080832093909355600b81528282208290556010905220805460ff19169055611135565b600180549003610fcb57610f3a6124e2565b6001600160a01b0383166000908152600b6020526040902054610f5d9190613df2565b6001600160a01b0383166000908152600a6020908152604080832093909355600b81528282208290556010905220805460ff191690556001805480610fa457610fa4613e2b565b600082815260209020810160001990810180546001600160a01b0319169055019055611135565b60005b60015481101561113357826001600160a01b031660018281548110610ff557610ff5613e41565b6000918252602090912001546001600160a01b031603611121576001805461101e908290613e57565b8154811061102e5761102e613e41565b600091825260209091200154600180546001600160a01b03909216918390811061105a5761105a613e41565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506110906124e2565b6001600160a01b0384166000908152600b60205260409020546110b39190613df2565b6001600160a01b0384166000908152600a6020908152604080832093909355600b81528282208290556010905220805460ff1916905560018054806110fa576110fa613e2b565b600082815260209020810160001990810180546001600160a01b0319169055019055611133565b8061112b81613e6a565b915050610fce565b505b604080516001600160a01b038416815282151560208201527f0dc781e42e059225a276eb2acec6114dc6b8806a2fb68f4780326c2dcd1aec7391015b60405180910390a15050565b600061118b6012600a613f67565b61119990633b9aca00613df2565b6000036111a557600080fd5b6111b16012600a613f67565b6111bf90633b9aca00613df2565b905090565b6001600160a01b0383166000908152600d6020908152604080832033845290915281205460001914611229576001600160a01b0384166000908152600d6020908152604080832033845290915281208054849290611223908490613e57565b90915550505b6112348484846126bb565b949350505050565b600061124860006116b4565b61125361dead6116b4565b61125d9190613f76565b6112696012600a613f67565b61127790633b9aca00613df2565b6111bf9190613e57565b60006003548211156112e85760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b7b565b60006112f26124e2565b90506112fe8184613e09565b9392505050565b60006113136012600a613f67565b61132190633b9aca00613df2565b60000361132d57600080fd5b50601290565b61133b61238f565b60155447906001600160a01b0316158061136157506015546001600160a01b031661dead145b1561136b57600080fd5b6015546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156113a5573d6000803e3d6000fd5b5050565b6113b161238f565b60c88261ffff1611806113c8575060648261ffff16105b806113d7575060c88361ffff16115b806113e6575060328361ffff16105b806113f5575060c88161ffff16115b80611404575060328161ffff16105b156114615760405163790e0dcb60e11b815260206004820152602660248201527f43616e6e6f7420657863656564203225206f72206265206c6f776572207468616044820152656e20302e352560d01b6064820152608401610b7b565b6017805461ffff838116600160201b810265ffff000000001987841662010000810263ffffffff19909616948a16948517959095171617909355604080519182526020820192909252908101919091527f4c669b5f339f6682739ab8c348d57e146ef3821dec19fb8a6cf7ded998607cd1906060015b60405180910390a1505050565b6114ec61238f565b6016546001600160a01b0316158061151057506016546001600160a01b031661dead145b1561151a57600080fd5b60006009541180156115365750611530306116b4565b60095411155b156115ae576016546009546000916115599130916001600160a01b0316906126bb565b905080156115675760006009555b601654600954604080516001600160a01b03909316835260208301919091527feb2faa2644c3d13ec78e58b18af1129c0112b936f20f9eaaf6513dae2bf0e3559101610ccd565b565b6115b861238f565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527fe4cbcfb1a60e2c589f335f74c6c57b0be57eb6c50eb56442d8a67735dba70cad9101611171565b6017546000908190819061ffff1661162e6012600a613f67565b61163c90633b9aca00613df2565b6116469190613e09565b60175462010000900461ffff1661165f6012600a613f67565b61166d90633b9aca00613df2565b6116779190613e09565b601754600160201b900461ffff166116916012600a613f67565b61169f90633b9aca00613df2565b6116a99190613e09565b925092509250909192565b6001600160a01b03811660009081526010602052604081205460ff16156116f157506001600160a01b03166000908152600b602052604090205490565b6001600160a01b0382166000908152600a6020526040902054610ce990611281565b61171b61238f565b6115ae6000612b3d565b61172d61238f565b6001600160a01b0382166000818152600c6020908152604091829020805460ff19168515159081179091558251938452908301527f9275848620775c1d80b27df21b269b20e3040d2fd33ebf6a514850b17fc949589101611171565b61179161238f565b60155481906001600160a01b031615806117b757506015546001600160a01b031661dead145b156117c157600080fd5b6040516370a0823160e01b815230600482015283906001600160a01b038316906370a0823190602401602060405180830381865afa158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182b9190613f89565b101561183657600080fd5b306001600160a01b0383160361191857600060095460085460075461185b9190613f76565b6118659190613f76565b905080611871306116b4565b1115611912576015546001600160a01b038084169163a9059cbb911683611897306116b4565b6118a19190613e57565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119109190613fa2565b505b50505050565b60155460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018590529082169063a9059cbb906044016020604051808303816000875af115801561196b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119129190613fa2565b505050565b61199c61238f565b6001600160a01b03821615806119b957506001600160a01b038116155b806119ce57506001600160a01b03821661dead145b806119e357506001600160a01b03811661dead145b15611a3f57604051637d4d5cd760e11b815260206004820152602560248201527f466565207265636569766572732063616e6e6f74206265207a65726f206164646044820152643932b9b99760d91b6064820152608401610b7b565b601580546001600160a01b038481166001600160a01b03199283168117909355601680549185169190921681179091556040805192835260208301919091527f9fba4a27b77afdf6c68deb1d99abfd909cb0c2bfa6a148fae3c6b8414e58aef99101611171565b6000611ab33384846126bb565b5060019392505050565b611ac561238f565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527fca5110fa8124e5b4dfaf023291185d46c42971706526a6d3d3c7be7a3322772f9101611171565b600080600080600754600854600954600954600854600754611b439190613f76565b611b4d9190613f76565b935093509350935090919293565b611b6361238f565b601354600160201b900460ff16611b7957600080fd5b6001600160a01b0381166000908152600e602090815260408083208054600160ff199182168117909255601284528285208054821683179055600f8452828520805482168317905560119093529220805490911682179055611bdc908290610cef565b601380546001600160a01b03600160281b9182900481166000908152601260205260409020805460ff191660019081179091559254611c1f939290041690610cef565b6040516001600160a01b03821681527fb18b3dcffb4f0709b15fd073af710076e9afafb9c2bbfb6b1115e0d7cbbae73a90602001610ccd565b611c6061238f565b60138054841580156101000261ff001990921691909117909155611d82578082611c8c6012600a613f67565b611c9a90633b9aca00613df2565b611ca49190613df2565b611cae9190613e09565b600455620186a0611cc16012600a613f67565b611ccf90633b9aca00613df2565b611cd99190613e09565b6004541080611d0e57506064611cf16012600a613f67565b611cff90633b9aca00613df2565b611d099190613e09565b600454115b15611d82576040516328f5666d60e21b815260206004820152603d60248201527f537761705468726573686f6c64206d757374206265206265747765656e20302e60448201527f303030312520616e64203125206f6620746f74616c20737570706c792e0000006064820152608401610b7b565b60045460408051851515815260208101929092527fb0a2a58670abffcc2e4851e058340dd3e013b3b29bf9a1f9adc0fc20078e912e91016114d7565b611dc661238f565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2f9190613fbf565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea09190613fbf565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611eeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0f9190613fbf565b90506001600160a01b03811661208857816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f819190613fbf565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff29190613fbf565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801561203f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120639190613fbf565b600280546001600160a01b0319166001600160a01b03929092169190911790556120a4565b600280546001600160a01b0319166001600160a01b0383161790555b6013805465010000000000600160c81b031916600160281b6001600160a01b038581168202929092179283905561198f923092919004166000196123e9565b6120eb61238f565b6001600160a01b0381166121505760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7b565b61215981612b3d565b50565b61216461238f565b87601460000160046101000a81548161ffff021916908361ffff16021790555084601460000160066101000a81548161ffff021916908361ffff16021790555086601460000160086101000a81548161ffff021916908361ffff160217905550856014600001600a6101000a81548161ffff021916908361ffff160217905550836014600001600c6101000a81548161ffff021916908361ffff160217905550806014600001600e6101000a81548161ffff021916908361ffff16021790555082601460000160106101000a81548161ffff021916908361ffff16021790555081601460000160126101000a81548161ffff021916908361ffff1602179055508585886122719190613fdc565b61227b9190613fdc565b6014805461ffff191661ffff929092169190911790558161229c8285613fdc565b6122a69190613fdc565b6014805461ffff928316620100000263ffff00001982168117909255605091831692169190911711806122e6575060145460506201000090910461ffff16115b1561232d5760405163015bf8a960e61b81526020600482015260166024820152752332b2b99031b0b73737ba1032bc31b2b2b2101c129760511b6044820152606401610b7b565b6014546040517f2dfd00b4306a0e1a0fa38131b25d9de12d8a1780f0e39f4d542e38edd859b9eb9161237d9161ffff8083169262010000900416908c908c908c908c908c908c908c908c906139f2565b60405180910390a15050505050505050565b6000546001600160a01b031633146115ae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b7b565b6001600160a01b0383166124355760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401610b7b565b6001600160a01b0382166124815760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401610b7b565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600354600090816124f56012600a613f67565b61250390633b9aca00613df2565b6002546001600160a01b03166000908152601060205260409020549091508290829060ff1615612596576002546001600160a01b03166000908152600a6020908152604080832054600b909252909120548382118061256157508281115b1561257b576125708587613e09565b965050505050505090565b6125858285613e57565b93506125918184613e57565b925050505b6001541561268d5760005b60015460ff8216101561268b576000600a600060018460ff16815481106125ca576125ca613e41565b60009182526020808320909101546001600160a01b0316835282019290925260400181205460018054919350600b9183919060ff871690811061260f5761260f613e41565b60009182526020808320909101546001600160a01b0316835282019290925260400190205490508482118061264357508381115b1561265e576126528688613e09565b97505050505050505090565b6126688286613e57565b94506126748185613e57565b93505050808061268390613ffe565b9150506125a1565b505b6126978385613e09565b8210156126b1576126a88385613e09565b94505050505090565b6126a88183613e09565b60006001600160a01b0384166127215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b7b565b600082116127835760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b7b565b6001600160a01b0384166000908152600c60205260408120548190819060ff16156128e1576001600160a01b0386166000908152601160205260409020546001935060ff166128dc5760175461ffff166127df6012600a613f67565b6127ed90633b9aca00613df2565b6127f79190613e09565b85111561284757604051634367bae960e11b815260206004820152601860248201527f4d61782062757920616d6f756e742065786365656465642e00000000000000006044820152606401610b7b565b601754600160201b900461ffff166128616012600a613f67565b61286f90633b9aca00613df2565b6128799190613e09565b85612883886116b4565b61288d9190613f76565b11156128dc57604051632d7fb5f360e01b815260206004820152601b60248201527f4d61782077616c6c657420616d6f756e742065786365656465642e00000000006044820152606401610b7b565b612a6a565b6001600160a01b0386166000908152600c602052604090205460ff16156129ac576001600160a01b0387166000908152601160205260409020546001925060ff1615801561295e575060175462010000900461ffff166129436012600a613f67565b61295190633b9aca00613df2565b61295b9190613e09565b85115b156128dc57604051634367bae960e11b815260206004820152601960248201527f4d61782073656c6c20616d6f756e742065786365656465642e000000000000006044820152606401610b7b565b601754600160201b900461ffff166129c66012600a613f67565b6129d490633b9aca00613df2565b6129de9190613e09565b856129e8886116b4565b6129f29190613f76565b118015612a1857506001600160a01b03861660009081526011602052604090205460ff16155b15612a6657604051632d7fb5f360e01b815260206004820152601b60248201527f4d61782077616c6c657420616d6f756e742065786365656465642e00000000006044820152606401610b7b565b5060015b612a748787612b8d565b15612ac95760135462010000900460ff16612ac95760405163efc80f7560e01b815260206004820152601460248201527354726164696e67206e6f7420656e61626c65642160601b6044820152606401610b7b565b8115612b245760135460ff16612b2457601354610100900460ff1615612b2457600454612af5306116b4565b10158015612b145750600454600854600754612b119190613f76565b10155b15612b2457612b24600454612cab565b612b3287878786868661313e565b979650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080546001600160a01b03848116911614801590612bba57506000546001600160a01b03838116911614155b8015612bd157506000546001600160a01b03163214155b8015612bf657506001600160a01b0382166000908152600e602052604090205460ff16155b8015612c1b57506001600160a01b0383166000908152600e602052604090205460ff16155b8015612c3257506001600160a01b03821661dead14155b8015612c4657506001600160a01b03821615155b8015612c6b57506001600160a01b03831660009081526012602052604090205460ff16155b8015612c9057506001600160a01b03821660009081526012602052604090205460ff16155b80156112fe57506001600160a01b0383163014159392505050565b6013805460ff19166001179055600854600754600091612cca91613f76565b9050811580612cd7575080155b15612ce25750613131565b600060028260075485612cf59190613df2565b612cff9190613e09565b612d099190613e09565b90506000612d178285613e57565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110612d5157612d51613e41565b60200260200101906001600160a01b031690816001600160a01b031681525050601360059054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de89190613fbf565b81600181518110612dfb57612dfb613e41565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b81524792600160281b9092049091169063791ac94790612e4c90869060009087903090429060040161401d565b600060405180830381600087803b158015612e6657600080fd5b505af1925050508015612e77575060015b612e85575050505050613131565b600080612e928347613e57565b905060008760085483612ea59190613df2565b612eaf9190613e09565b905060008860075484612ec29190613df2565b612ecc9190613e09565b9050886007548b612edd9190613df2565b612ee79190613e09565b60076000828254612ef89190613e57565b90915550506008548990612f0c908c613df2565b612f169190613e09565b60086000828254612f279190613e57565b9091555050801561302a576013546001600160a01b03600160281b9091041663f305d71982308b600080612f636000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af193505050508015612fe8575060408051601f3d908101601f19168201909252612fe59181019061408e565b60015b1561302a575050604080518a8152602081018490527fb640d6c53f8bdcc19cb283d094325eae71e53d418509bc3583d00bbd7e15aec692500160405180910390a15b6015546001600160a01b0316158061304e57506015546001600160a01b031661dead145b8061306257506016546001600160a01b0316155b8061307957506016546001600160a01b031661dead145b1561308357600080fd5b47156130e6576015546040516001600160a01b03909116906188b89047906000818181858888f193505050503d80600081146130db576040519150601f19603f3d011682016040523d82523d6000602084013e6130e0565b606091505b50909450505b604080518b8152602081018390529081018390527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050505050505b506013805460ff19169055565b6001600160a01b0386166000908152600f602052604081205460019060ff168061318057506001600160a01b0387166000908152600f602052604090205460ff165b8061318d57506001831515145b15613196575060005b60006131a589888489896133ff565b60808101516001600160a01b038b166000908152600a60205260408120805493945091926131d4908490613e57565b909155505060608101516001600160a01b0389166000908152600a602052604081208054909190613206908490613f76565b90915550506001600160a01b03891660009081526010602052604090205460ff161561326a576001600160a01b0389166000908152600b6020526040902054613250908890613e57565b6001600160a01b038a166000908152600b60205260409020555b6001600160a01b03881660009081526010602052604090205460ff16156132ca5780516001600160a01b0389166000908152600b60205260409020546132b09190613f76565b6001600160a01b0389166000908152600b60205260409020555b60008160a0015111806132e1575060008160200151115b15613302578060a00151600360008282546132fc9190613e57565b90915550505b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836000015160405161334b91815260200190565b60405180910390a36013546301000000900460ff166133f05761336e8989613912565b6013546301000000900460ff1615801561338d575061338d8989612b8d565b8015613397575083155b156133f05760405163efc80f7560e01b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f604482015261371760f11b6064820152608401610b7b565b50600198975050505050505050565b61343f6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b61347f6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101408101825260145461ffff808216835262010000820481166020840152600160201b8204811693830193909352600160301b810483166060830152600160401b810483166080830152600160501b8104831660a0830152600160601b8104831660c0830152600160701b8104831660e0830152600160801b81048316610100830152600160901b900490911661012082015261351f6124e2565b60c083018190526135309088613df2565b608083015285156137f557600085801561354e5750815161ffff1615155b1561368057436006546005546135649190613f76565b10613587576064613576896063613df2565b6135809190613e09565b90506135a8565b81516103e89061359b9061ffff168a613df2565b6135a59190613e09565b90505b8151608083015161ffff918216916135c1911683613df2565b6135cb9190613e09565b600760008282546135dc9190613f76565b90915550508151606083015161ffff918216916135fa911683613df2565b6136049190613e09565b600860008282546136159190613f76565b9091555050815160a083015161ffff91821691613633911683613df2565b61363d9190613e09565b6009600082825461364e9190613f76565b90915550508151604083015161ffff9182169161366c911683613df2565b6136769190613e09565b60208401526137a5565b84801561369557506000826020015161ffff16115b156137a5576103e8826020015161ffff16896136b19190613df2565b6136bb9190613e09565b9050816020015161ffff168260c0015161ffff16826136da9190613df2565b6136e49190613e09565b836020018181525050816020015161ffff1682610100015161ffff168261370b9190613df2565b6137159190613e09565b600760008282546137269190613f76565b9091555050602082015160e083015161ffff91821691613747911683613df2565b6137519190613e09565b600860008282546137629190613f76565b9091555050602082015161012083015161ffff91821691613784911683613df2565b61378e9190613e09565b6009600082825461379f9190613f76565b90915550505b60208301516137b49082613e57565b6040840181905260208401516137ca9190613f76565b6137d49089613e57565b835260c083015160208401516137ea9190613df2565b60a0840152506137f9565b8682525b6040820151156138d0578160c0015182604001516138179190613df2565b306000908152600a602052604081208054909190613836908490613f76565b90915550503060009081526010602052604090205460ff161561387e57604080830151306000908152600b602052918220805491929091613878908490613f76565b90915550505b306001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604001516040516138c791815260200190565b60405180910390a35b8160c0015182604001516138e49190613df2565b8260a001516138f39190613f76565b82608001516139029190613e57565b6060830152509695505050505050565b6013546301000000900460ff16156139785760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610b7b565b6139828282612b8d565b15801561399c57506002546001600160a01b038281169116145b156113a557506001600160a01b03166000908152600e60209081526040808320805460ff199081166001908117909255600f9093529220805490911690911790556013805463ff00000019166301000000179055565b61ffff9a8b168152988a1660208a015296891660408901529488166060880152928716608087015290861660a0860152851660c0850152841660e084015283166101008301529091166101208201526101400190565b600060208284031215613a5a57600080fd5b5035919050565b600060208083528351808285015260005b81811015613a8e57858101830151858201604001528201613a72565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461215957600080fd5b60008060408385031215613ad757600080fd5b8235613ae281613aaf565b946020939093013593505050565b600060208284031215613b0257600080fd5b81356112fe81613aaf565b801515811461215957600080fd5b60008060408385031215613b2e57600080fd5b8235613b3981613aaf565b91506020830135613b4981613b0d565b809150509250929050565b600080600060608486031215613b6957600080fd5b8335613b7481613aaf565b92506020840135613b8481613aaf565b929592945050506040919091013590565b803561ffff81168114613ba757600080fd5b919050565b600080600060608486031215613bc157600080fd5b613bca84613b95565b9250613bd860208501613b95565b9150613be660408501613b95565b90509250925092565b60008060408385031215613c0257600080fd5b823591506020830135613b4981613aaf565b60008060408385031215613c2757600080fd5b8235613c3281613aaf565b91506020830135613b4981613aaf565b815161ffff16815261014081016020830151613c64602084018261ffff169052565b506040830151613c7a604084018261ffff169052565b506060830151613c90606084018261ffff169052565b506080830151613ca6608084018261ffff169052565b5060a0830151613cbc60a084018261ffff169052565b5060c0830151613cd260c084018261ffff169052565b5060e0830151613ce860e084018261ffff169052565b506101008381015161ffff908116918401919091526101209384015116929091019190915290565b600080600060608486031215613d2557600080fd5b8335613d3081613b0d565b95602085013595506040909401359392505050565b600080600080600080600080610100898b031215613d6257600080fd5b613d6b89613b95565b9750613d7960208a01613b95565b9650613d8760408a01613b95565b9550613d9560608a01613b95565b9450613da360808a01613b95565b9350613db160a08a01613b95565b9250613dbf60c08a01613b95565b9150613dcd60e08a01613b95565b90509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ce957610ce9613ddc565b600082613e2657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b81810381811115610ce957610ce9613ddc565b600060018201613e7c57613e7c613ddc565b5060010190565b600181815b80851115613ebe578160001904821115613ea457613ea4613ddc565b80851615613eb157918102915b93841c9390800290613e88565b509250929050565b600082613ed557506001610ce9565b81613ee257506000610ce9565b8160018114613ef85760028114613f0257613f1e565b6001915050610ce9565b60ff841115613f1357613f13613ddc565b50506001821b610ce9565b5060208310610133831016604e8410600b8410161715613f41575081810a610ce9565b613f4b8383613e83565b8060001904821115613f5f57613f5f613ddc565b029392505050565b60006112fe60ff841683613ec6565b80820180821115610ce957610ce9613ddc565b600060208284031215613f9b57600080fd5b5051919050565b600060208284031215613fb457600080fd5b81516112fe81613b0d565b600060208284031215613fd157600080fd5b81516112fe81613aaf565b61ffff818116838216019080821115613ff757613ff7613ddc565b5092915050565b600060ff821660ff810361401457614014613ddc565b60010192915050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561406d5784516001600160a01b031683529383019391830191600101614048565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156140a357600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212202810f883ef5f8ad5c97792b394b25ea2e7f9ad04c80e08ace9d28078778a45ba64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102975760003560e01c80636d651d2c1161015a578063a9059cbb116100c1578063dd62ed3e1161007a578063dd62ed3e14610a41578063e10b9db714610a87578063eafb5a3c14610aa7578063f2fde38b14610ac7578063f562c60014610ae7578063fabb0b4f14610b0757600080fd5b8063a9059cbb1461088c578063bf56b371146108ac578063c0a904a2146108c2578063c3ffb884146108e2578063d5fcc7b614610917578063db8d55f11461093757600080fd5b8063860aefcf11610113578063860aefcf1461077457806388f82020146107c95780638da5cb5b1461080257806395d89b41146108205780639f5bf4251461084c578063a4b45c001461086c57600080fd5b80636d651d2c146106815780636f89e409146106c857806370a08231146106f8578063715018a614610718578063735de9f71461072d57806380c581d11461075457600080fd5b80632d838119116101fe5780634fbee193116101b75780634fbee1931461059957806350a8e016146105d257806354370d26146105f3578063590ffdce146106085780635b4f472a146106285780635cce86cd1461064857600080fd5b80632d838119146104de578063313ce567146104fe57806335faa41614610525578063452ed4f11461053a57806346a96b201461055a5780634a74bb021461057a57600080fd5b80630cfc15f9116102505780630cfc15f9146104265780630f4f10131461045357806313e461921461047457806318160ddd1461049457806323b872dd146104a95780632b112e49146104c957600080fd5b806303fd2a45146102a35780630445b667146102d6578063069d955f146102fa57806306a1409f1461038557806306fdde03146103a7578063095ea7b3146103f657600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b961dead81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102e257600080fd5b506102ec60045481565b6040519081526020016102cd565b34801561030657600080fd5b5060145461036f9061ffff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b8204811691600160501b8104821691600160601b8204811691600160701b8104821691600160801b8204811691600160901b9004168a565b6040516102cd9a999897969594939291906139f2565b34801561039157600080fd5b506103a56103a0366004613a48565b610b1d565b005b3480156103b357600080fd5b5060408051808201909152601e81527f4d61727368616c6c204669676874696e67204368616d70696f6e73686970000060208201525b6040516102cd9190613a61565b34801561040257600080fd5b50610416610411366004613ac4565b610cd8565b60405190151581526020016102cd565b34801561043257600080fd5b506102ec610441366004613af0565b600a6020526000908152604090205481565b34801561045f57600080fd5b5060135461041690600160201b900460ff1681565b34801561048057600080fd5b506103a561048f366004613b1b565b610cef565b3480156104a057600080fd5b506102ec61117d565b3480156104b557600080fd5b506104166104c4366004613b54565b6111c4565b3480156104d557600080fd5b506102ec61123c565b3480156104ea57600080fd5b506102ec6104f9366004613a48565b611281565b34801561050a57600080fd5b50610513611305565b60405160ff90911681526020016102cd565b34801561053157600080fd5b506103a5611333565b34801561054657600080fd5b506002546102b9906001600160a01b031681565b34801561056657600080fd5b506103a5610575366004613bac565b6113a9565b34801561058657600080fd5b5060135461041690610100900460ff1681565b3480156105a557600080fd5b506104166105b4366004613af0565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156105de57600080fd5b50601354610416906301000000900460ff1681565b3480156105ff57600080fd5b506103a56114e4565b34801561061457600080fd5b506103a5610623366004613b1b565b6115b0565b34801561063457600080fd5b506013546104169062010000900460ff1681565b34801561065457600080fd5b50610416610663366004613af0565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561068d57600080fd5b506015546016546106a8916001600160a01b03908116911682565b604080516001600160a01b039384168152929091166020830152016102cd565b3480156106d457600080fd5b506106dd611614565b604080519384526020840192909252908201526060016102cd565b34801561070457600080fd5b506102ec610713366004613af0565b6116b4565b34801561072457600080fd5b506103a5611713565b34801561073957600080fd5b506013546102b990600160281b90046001600160a01b031681565b34801561076057600080fd5b506103a561076f366004613b1b565b611725565b34801561078057600080fd5b506017546107a49061ffff80821691620100008104821691600160201b9091041683565b6040805161ffff948516815292841660208401529216918101919091526060016102cd565b3480156107d557600080fd5b506104166107e4366004613af0565b6001600160a01b031660009081526010602052604090205460ff1690565b34801561080e57600080fd5b506000546001600160a01b03166102b9565b34801561082c57600080fd5b506040805180820190915260038152624d464360e81b60208201526103e9565b34801561085857600080fd5b506103a5610867366004613bef565b611789565b34801561087857600080fd5b506103a5610887366004613c14565b611994565b34801561089857600080fd5b506104166108a7366004613ac4565b611aa6565b3480156108b857600080fd5b506102ec60055481565b3480156108ce57600080fd5b506103a56108dd366004613b1b565b611abd565b3480156108ee57600080fd5b506108f7611b21565b6040805194855260208501939093529183015260608201526080016102cd565b34801561092357600080fd5b506103a5610932366004613af0565b611b5b565b34801561094357600080fd5b50610a346040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915250604080516101408101825260145461ffff808216835262010000820481166020840152600160201b8204811693830193909352600160301b810483166060830152600160401b810483166080830152600160501b8104831660a0830152600160601b8104831660c0830152600160701b8104831660e0830152600160801b81048316610100830152600160901b900490911661012082015290565b6040516102cd9190613c42565b348015610a4d57600080fd5b506102ec610a5c366004613c14565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b348015610a9357600080fd5b506103a5610aa2366004613d10565b611c58565b348015610ab357600080fd5b506103a5610ac2366004613af0565b611dbe565b348015610ad357600080fd5b506103a5610ae2366004613af0565b6120e3565b348015610af357600080fd5b506103a5610b02366004613d45565b61215c565b348015610b1357600080fd5b506102ec60065481565b610b2561238f565b60135462010000900460ff1615610b84576040516329ce02f160e01b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c656421000000000000000060448201526064015b60405180910390fd5b6013546301000000900460ff16610bde576040516329ce02f160e01b815260206004820152601860248201527f4c6971756964697479206d7573742062652061646465642e00000000000000006044820152606401610b7b565b6005811015610bf1576006819055610c3a565b6040516329ce02f160e01b815260206004820181905260248201527f4465616420626c6f636b73206d757374206265206c657373207468616e20352e6044820152606401610b7b565b6013805462ffff001916620101001790556002546103e890610c64906001600160a01b03166116b4565b610c6f90600a613df2565b610c799190613e09565b600455436005556013805464ff000000001916908190556040517ff789dd0d6d54bc0d9b7a5955aac4c052f81fb39e63f533a8d4820f6e862c78a391610ccd916201000090910460ff161515815260200190565b60405180910390a150565b6000610ce53384846123e9565b5060015b92915050565b610cf761238f565b8015610e3f576001600160a01b03821660009081526010602052604090205460ff1615610d665760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c7265616479206578636c756465642e000000006044820152606401610b7b565b6001600160a01b0382166000908152600a602052604090205415610dc0576001600160a01b0382166000908152600a6020526040902054610da690611281565b6001600160a01b0383166000908152600b60205260409020555b6001600160a01b038083166000818152601060205260409020805460ff1916600117905560025490911614610e3a576001805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b611135565b80611135576001600160a01b03821660009081526010602052604090205460ff16610eac5760405162461bcd60e51b815260206004820152601c60248201527f4163636f756e7420697320616c726561647920696e636c756465642e000000006044820152606401610b7b565b6002546001600160a01b0390811690831603610f2857610eca6124e2565b6001600160a01b0383166000908152600b6020526040902054610eed9190613df2565b6001600160a01b0383166000908152600a6020908152604080832093909355600b81528282208290556010905220805460ff19169055611135565b600180549003610fcb57610f3a6124e2565b6001600160a01b0383166000908152600b6020526040902054610f5d9190613df2565b6001600160a01b0383166000908152600a6020908152604080832093909355600b81528282208290556010905220805460ff191690556001805480610fa457610fa4613e2b565b600082815260209020810160001990810180546001600160a01b0319169055019055611135565b60005b60015481101561113357826001600160a01b031660018281548110610ff557610ff5613e41565b6000918252602090912001546001600160a01b031603611121576001805461101e908290613e57565b8154811061102e5761102e613e41565b600091825260209091200154600180546001600160a01b03909216918390811061105a5761105a613e41565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506110906124e2565b6001600160a01b0384166000908152600b60205260409020546110b39190613df2565b6001600160a01b0384166000908152600a6020908152604080832093909355600b81528282208290556010905220805460ff1916905560018054806110fa576110fa613e2b565b600082815260209020810160001990810180546001600160a01b0319169055019055611133565b8061112b81613e6a565b915050610fce565b505b604080516001600160a01b038416815282151560208201527f0dc781e42e059225a276eb2acec6114dc6b8806a2fb68f4780326c2dcd1aec7391015b60405180910390a15050565b600061118b6012600a613f67565b61119990633b9aca00613df2565b6000036111a557600080fd5b6111b16012600a613f67565b6111bf90633b9aca00613df2565b905090565b6001600160a01b0383166000908152600d6020908152604080832033845290915281205460001914611229576001600160a01b0384166000908152600d6020908152604080832033845290915281208054849290611223908490613e57565b90915550505b6112348484846126bb565b949350505050565b600061124860006116b4565b61125361dead6116b4565b61125d9190613f76565b6112696012600a613f67565b61127790633b9aca00613df2565b6111bf9190613e57565b60006003548211156112e85760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610b7b565b60006112f26124e2565b90506112fe8184613e09565b9392505050565b60006113136012600a613f67565b61132190633b9aca00613df2565b60000361132d57600080fd5b50601290565b61133b61238f565b60155447906001600160a01b0316158061136157506015546001600160a01b031661dead145b1561136b57600080fd5b6015546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156113a5573d6000803e3d6000fd5b5050565b6113b161238f565b60c88261ffff1611806113c8575060648261ffff16105b806113d7575060c88361ffff16115b806113e6575060328361ffff16105b806113f5575060c88161ffff16115b80611404575060328161ffff16105b156114615760405163790e0dcb60e11b815260206004820152602660248201527f43616e6e6f7420657863656564203225206f72206265206c6f776572207468616044820152656e20302e352560d01b6064820152608401610b7b565b6017805461ffff838116600160201b810265ffff000000001987841662010000810263ffffffff19909616948a16948517959095171617909355604080519182526020820192909252908101919091527f4c669b5f339f6682739ab8c348d57e146ef3821dec19fb8a6cf7ded998607cd1906060015b60405180910390a1505050565b6114ec61238f565b6016546001600160a01b0316158061151057506016546001600160a01b031661dead145b1561151a57600080fd5b60006009541180156115365750611530306116b4565b60095411155b156115ae576016546009546000916115599130916001600160a01b0316906126bb565b905080156115675760006009555b601654600954604080516001600160a01b03909316835260208301919091527feb2faa2644c3d13ec78e58b18af1129c0112b936f20f9eaaf6513dae2bf0e3559101610ccd565b565b6115b861238f565b6001600160a01b0382166000818152600f6020908152604091829020805460ff19168515159081179091558251938452908301527fe4cbcfb1a60e2c589f335f74c6c57b0be57eb6c50eb56442d8a67735dba70cad9101611171565b6017546000908190819061ffff1661162e6012600a613f67565b61163c90633b9aca00613df2565b6116469190613e09565b60175462010000900461ffff1661165f6012600a613f67565b61166d90633b9aca00613df2565b6116779190613e09565b601754600160201b900461ffff166116916012600a613f67565b61169f90633b9aca00613df2565b6116a99190613e09565b925092509250909192565b6001600160a01b03811660009081526010602052604081205460ff16156116f157506001600160a01b03166000908152600b602052604090205490565b6001600160a01b0382166000908152600a6020526040902054610ce990611281565b61171b61238f565b6115ae6000612b3d565b61172d61238f565b6001600160a01b0382166000818152600c6020908152604091829020805460ff19168515159081179091558251938452908301527f9275848620775c1d80b27df21b269b20e3040d2fd33ebf6a514850b17fc949589101611171565b61179161238f565b60155481906001600160a01b031615806117b757506015546001600160a01b031661dead145b156117c157600080fd5b6040516370a0823160e01b815230600482015283906001600160a01b038316906370a0823190602401602060405180830381865afa158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182b9190613f89565b101561183657600080fd5b306001600160a01b0383160361191857600060095460085460075461185b9190613f76565b6118659190613f76565b905080611871306116b4565b1115611912576015546001600160a01b038084169163a9059cbb911683611897306116b4565b6118a19190613e57565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119109190613fa2565b505b50505050565b60155460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018590529082169063a9059cbb906044016020604051808303816000875af115801561196b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119129190613fa2565b505050565b61199c61238f565b6001600160a01b03821615806119b957506001600160a01b038116155b806119ce57506001600160a01b03821661dead145b806119e357506001600160a01b03811661dead145b15611a3f57604051637d4d5cd760e11b815260206004820152602560248201527f466565207265636569766572732063616e6e6f74206265207a65726f206164646044820152643932b9b99760d91b6064820152608401610b7b565b601580546001600160a01b038481166001600160a01b03199283168117909355601680549185169190921681179091556040805192835260208301919091527f9fba4a27b77afdf6c68deb1d99abfd909cb0c2bfa6a148fae3c6b8414e58aef99101611171565b6000611ab33384846126bb565b5060019392505050565b611ac561238f565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527fca5110fa8124e5b4dfaf023291185d46c42971706526a6d3d3c7be7a3322772f9101611171565b600080600080600754600854600954600954600854600754611b439190613f76565b611b4d9190613f76565b935093509350935090919293565b611b6361238f565b601354600160201b900460ff16611b7957600080fd5b6001600160a01b0381166000908152600e602090815260408083208054600160ff199182168117909255601284528285208054821683179055600f8452828520805482168317905560119093529220805490911682179055611bdc908290610cef565b601380546001600160a01b03600160281b9182900481166000908152601260205260409020805460ff191660019081179091559254611c1f939290041690610cef565b6040516001600160a01b03821681527fb18b3dcffb4f0709b15fd073af710076e9afafb9c2bbfb6b1115e0d7cbbae73a90602001610ccd565b611c6061238f565b60138054841580156101000261ff001990921691909117909155611d82578082611c8c6012600a613f67565b611c9a90633b9aca00613df2565b611ca49190613df2565b611cae9190613e09565b600455620186a0611cc16012600a613f67565b611ccf90633b9aca00613df2565b611cd99190613e09565b6004541080611d0e57506064611cf16012600a613f67565b611cff90633b9aca00613df2565b611d099190613e09565b600454115b15611d82576040516328f5666d60e21b815260206004820152603d60248201527f537761705468726573686f6c64206d757374206265206265747765656e20302e60448201527f303030312520616e64203125206f6620746f74616c20737570706c792e0000006064820152608401610b7b565b60045460408051851515815260208101929092527fb0a2a58670abffcc2e4851e058340dd3e013b3b29bf9a1f9adc0fc20078e912e91016114d7565b611dc661238f565b60008190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2f9190613fbf565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea09190613fbf565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611eeb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0f9190613fbf565b90506001600160a01b03811661208857816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f819190613fbf565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff29190613fbf565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801561203f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120639190613fbf565b600280546001600160a01b0319166001600160a01b03929092169190911790556120a4565b600280546001600160a01b0319166001600160a01b0383161790555b6013805465010000000000600160c81b031916600160281b6001600160a01b038581168202929092179283905561198f923092919004166000196123e9565b6120eb61238f565b6001600160a01b0381166121505760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b7b565b61215981612b3d565b50565b61216461238f565b87601460000160046101000a81548161ffff021916908361ffff16021790555084601460000160066101000a81548161ffff021916908361ffff16021790555086601460000160086101000a81548161ffff021916908361ffff160217905550856014600001600a6101000a81548161ffff021916908361ffff160217905550836014600001600c6101000a81548161ffff021916908361ffff160217905550806014600001600e6101000a81548161ffff021916908361ffff16021790555082601460000160106101000a81548161ffff021916908361ffff16021790555081601460000160126101000a81548161ffff021916908361ffff1602179055508585886122719190613fdc565b61227b9190613fdc565b6014805461ffff191661ffff929092169190911790558161229c8285613fdc565b6122a69190613fdc565b6014805461ffff928316620100000263ffff00001982168117909255605091831692169190911711806122e6575060145460506201000090910461ffff16115b1561232d5760405163015bf8a960e61b81526020600482015260166024820152752332b2b99031b0b73737ba1032bc31b2b2b2101c129760511b6044820152606401610b7b565b6014546040517f2dfd00b4306a0e1a0fa38131b25d9de12d8a1780f0e39f4d542e38edd859b9eb9161237d9161ffff8083169262010000900416908c908c908c908c908c908c908c908c906139f2565b60405180910390a15050505050505050565b6000546001600160a01b031633146115ae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b7b565b6001600160a01b0383166124355760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401610b7b565b6001600160a01b0382166124815760405162461bcd60e51b815260206004820152601360248201527245524332303a205a65726f204164647265737360681b6044820152606401610b7b565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600354600090816124f56012600a613f67565b61250390633b9aca00613df2565b6002546001600160a01b03166000908152601060205260409020549091508290829060ff1615612596576002546001600160a01b03166000908152600a6020908152604080832054600b909252909120548382118061256157508281115b1561257b576125708587613e09565b965050505050505090565b6125858285613e57565b93506125918184613e57565b925050505b6001541561268d5760005b60015460ff8216101561268b576000600a600060018460ff16815481106125ca576125ca613e41565b60009182526020808320909101546001600160a01b0316835282019290925260400181205460018054919350600b9183919060ff871690811061260f5761260f613e41565b60009182526020808320909101546001600160a01b0316835282019290925260400190205490508482118061264357508381115b1561265e576126528688613e09565b97505050505050505090565b6126688286613e57565b94506126748185613e57565b93505050808061268390613ffe565b9150506125a1565b505b6126978385613e09565b8210156126b1576126a88385613e09565b94505050505090565b6126a88183613e09565b60006001600160a01b0384166127215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b7b565b600082116127835760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610b7b565b6001600160a01b0384166000908152600c60205260408120548190819060ff16156128e1576001600160a01b0386166000908152601160205260409020546001935060ff166128dc5760175461ffff166127df6012600a613f67565b6127ed90633b9aca00613df2565b6127f79190613e09565b85111561284757604051634367bae960e11b815260206004820152601860248201527f4d61782062757920616d6f756e742065786365656465642e00000000000000006044820152606401610b7b565b601754600160201b900461ffff166128616012600a613f67565b61286f90633b9aca00613df2565b6128799190613e09565b85612883886116b4565b61288d9190613f76565b11156128dc57604051632d7fb5f360e01b815260206004820152601b60248201527f4d61782077616c6c657420616d6f756e742065786365656465642e00000000006044820152606401610b7b565b612a6a565b6001600160a01b0386166000908152600c602052604090205460ff16156129ac576001600160a01b0387166000908152601160205260409020546001925060ff1615801561295e575060175462010000900461ffff166129436012600a613f67565b61295190633b9aca00613df2565b61295b9190613e09565b85115b156128dc57604051634367bae960e11b815260206004820152601960248201527f4d61782073656c6c20616d6f756e742065786365656465642e000000000000006044820152606401610b7b565b601754600160201b900461ffff166129c66012600a613f67565b6129d490633b9aca00613df2565b6129de9190613e09565b856129e8886116b4565b6129f29190613f76565b118015612a1857506001600160a01b03861660009081526011602052604090205460ff16155b15612a6657604051632d7fb5f360e01b815260206004820152601b60248201527f4d61782077616c6c657420616d6f756e742065786365656465642e00000000006044820152606401610b7b565b5060015b612a748787612b8d565b15612ac95760135462010000900460ff16612ac95760405163efc80f7560e01b815260206004820152601460248201527354726164696e67206e6f7420656e61626c65642160601b6044820152606401610b7b565b8115612b245760135460ff16612b2457601354610100900460ff1615612b2457600454612af5306116b4565b10158015612b145750600454600854600754612b119190613f76565b10155b15612b2457612b24600454612cab565b612b3287878786868661313e565b979650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080546001600160a01b03848116911614801590612bba57506000546001600160a01b03838116911614155b8015612bd157506000546001600160a01b03163214155b8015612bf657506001600160a01b0382166000908152600e602052604090205460ff16155b8015612c1b57506001600160a01b0383166000908152600e602052604090205460ff16155b8015612c3257506001600160a01b03821661dead14155b8015612c4657506001600160a01b03821615155b8015612c6b57506001600160a01b03831660009081526012602052604090205460ff16155b8015612c9057506001600160a01b03821660009081526012602052604090205460ff16155b80156112fe57506001600160a01b0383163014159392505050565b6013805460ff19166001179055600854600754600091612cca91613f76565b9050811580612cd7575080155b15612ce25750613131565b600060028260075485612cf59190613df2565b612cff9190613e09565b612d099190613e09565b90506000612d178285613e57565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110612d5157612d51613e41565b60200260200101906001600160a01b031690816001600160a01b031681525050601360059054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612dc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612de89190613fbf565b81600181518110612dfb57612dfb613e41565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b81524792600160281b9092049091169063791ac94790612e4c90869060009087903090429060040161401d565b600060405180830381600087803b158015612e6657600080fd5b505af1925050508015612e77575060015b612e85575050505050613131565b600080612e928347613e57565b905060008760085483612ea59190613df2565b612eaf9190613e09565b905060008860075484612ec29190613df2565b612ecc9190613e09565b9050886007548b612edd9190613df2565b612ee79190613e09565b60076000828254612ef89190613e57565b90915550506008548990612f0c908c613df2565b612f169190613e09565b60086000828254612f279190613e57565b9091555050801561302a576013546001600160a01b03600160281b9091041663f305d71982308b600080612f636000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af193505050508015612fe8575060408051601f3d908101601f19168201909252612fe59181019061408e565b60015b1561302a575050604080518a8152602081018490527fb640d6c53f8bdcc19cb283d094325eae71e53d418509bc3583d00bbd7e15aec692500160405180910390a15b6015546001600160a01b0316158061304e57506015546001600160a01b031661dead145b8061306257506016546001600160a01b0316155b8061307957506016546001600160a01b031661dead145b1561308357600080fd5b47156130e6576015546040516001600160a01b03909116906188b89047906000818181858888f193505050503d80600081146130db576040519150601f19603f3d011682016040523d82523d6000602084013e6130e0565b606091505b50909450505b604080518b8152602081018390529081018390527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050505050505b506013805460ff19169055565b6001600160a01b0386166000908152600f602052604081205460019060ff168061318057506001600160a01b0387166000908152600f602052604090205460ff165b8061318d57506001831515145b15613196575060005b60006131a589888489896133ff565b60808101516001600160a01b038b166000908152600a60205260408120805493945091926131d4908490613e57565b909155505060608101516001600160a01b0389166000908152600a602052604081208054909190613206908490613f76565b90915550506001600160a01b03891660009081526010602052604090205460ff161561326a576001600160a01b0389166000908152600b6020526040902054613250908890613e57565b6001600160a01b038a166000908152600b60205260409020555b6001600160a01b03881660009081526010602052604090205460ff16156132ca5780516001600160a01b0389166000908152600b60205260409020546132b09190613f76565b6001600160a01b0389166000908152600b60205260409020555b60008160a0015111806132e1575060008160200151115b15613302578060a00151600360008282546132fc9190613e57565b90915550505b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836000015160405161334b91815260200190565b60405180910390a36013546301000000900460ff166133f05761336e8989613912565b6013546301000000900460ff1615801561338d575061338d8989612b8d565b8015613397575083155b156133f05760405163efc80f7560e01b815260206004820152602260248201527f5072652d6c6971756964697479207472616e736665722070726f74656374696f604482015261371760f11b6064820152608401610b7b565b50600198975050505050505050565b61343f6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b61347f6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101408101825260145461ffff808216835262010000820481166020840152600160201b8204811693830193909352600160301b810483166060830152600160401b810483166080830152600160501b8104831660a0830152600160601b8104831660c0830152600160701b8104831660e0830152600160801b81048316610100830152600160901b900490911661012082015261351f6124e2565b60c083018190526135309088613df2565b608083015285156137f557600085801561354e5750815161ffff1615155b1561368057436006546005546135649190613f76565b10613587576064613576896063613df2565b6135809190613e09565b90506135a8565b81516103e89061359b9061ffff168a613df2565b6135a59190613e09565b90505b8151608083015161ffff918216916135c1911683613df2565b6135cb9190613e09565b600760008282546135dc9190613f76565b90915550508151606083015161ffff918216916135fa911683613df2565b6136049190613e09565b600860008282546136159190613f76565b9091555050815160a083015161ffff91821691613633911683613df2565b61363d9190613e09565b6009600082825461364e9190613f76565b90915550508151604083015161ffff9182169161366c911683613df2565b6136769190613e09565b60208401526137a5565b84801561369557506000826020015161ffff16115b156137a5576103e8826020015161ffff16896136b19190613df2565b6136bb9190613e09565b9050816020015161ffff168260c0015161ffff16826136da9190613df2565b6136e49190613e09565b836020018181525050816020015161ffff1682610100015161ffff168261370b9190613df2565b6137159190613e09565b600760008282546137269190613f76565b9091555050602082015160e083015161ffff91821691613747911683613df2565b6137519190613e09565b600860008282546137629190613f76565b9091555050602082015161012083015161ffff91821691613784911683613df2565b61378e9190613e09565b6009600082825461379f9190613f76565b90915550505b60208301516137b49082613e57565b6040840181905260208401516137ca9190613f76565b6137d49089613e57565b835260c083015160208401516137ea9190613df2565b60a0840152506137f9565b8682525b6040820151156138d0578160c0015182604001516138179190613df2565b306000908152600a602052604081208054909190613836908490613f76565b90915550503060009081526010602052604090205460ff161561387e57604080830151306000908152600b602052918220805491929091613878908490613f76565b90915550505b306001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604001516040516138c791815260200190565b60405180910390a35b8160c0015182604001516138e49190613df2565b8260a001516138f39190613f76565b82608001516139029190613e57565b6060830152509695505050505050565b6013546301000000900460ff16156139785760405162461bcd60e51b815260206004820152602360248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201526232b21760e91b6064820152608401610b7b565b6139828282612b8d565b15801561399c57506002546001600160a01b038281169116145b156113a557506001600160a01b03166000908152600e60209081526040808320805460ff199081166001908117909255600f9093529220805490911690911790556013805463ff00000019166301000000179055565b61ffff9a8b168152988a1660208a015296891660408901529488166060880152928716608087015290861660a0860152851660c0850152841660e084015283166101008301529091166101208201526101400190565b600060208284031215613a5a57600080fd5b5035919050565b600060208083528351808285015260005b81811015613a8e57858101830151858201604001528201613a72565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461215957600080fd5b60008060408385031215613ad757600080fd5b8235613ae281613aaf565b946020939093013593505050565b600060208284031215613b0257600080fd5b81356112fe81613aaf565b801515811461215957600080fd5b60008060408385031215613b2e57600080fd5b8235613b3981613aaf565b91506020830135613b4981613b0d565b809150509250929050565b600080600060608486031215613b6957600080fd5b8335613b7481613aaf565b92506020840135613b8481613aaf565b929592945050506040919091013590565b803561ffff81168114613ba757600080fd5b919050565b600080600060608486031215613bc157600080fd5b613bca84613b95565b9250613bd860208501613b95565b9150613be660408501613b95565b90509250925092565b60008060408385031215613c0257600080fd5b823591506020830135613b4981613aaf565b60008060408385031215613c2757600080fd5b8235613c3281613aaf565b91506020830135613b4981613aaf565b815161ffff16815261014081016020830151613c64602084018261ffff169052565b506040830151613c7a604084018261ffff169052565b506060830151613c90606084018261ffff169052565b506080830151613ca6608084018261ffff169052565b5060a0830151613cbc60a084018261ffff169052565b5060c0830151613cd260c084018261ffff169052565b5060e0830151613ce860e084018261ffff169052565b506101008381015161ffff908116918401919091526101209384015116929091019190915290565b600080600060608486031215613d2557600080fd5b8335613d3081613b0d565b95602085013595506040909401359392505050565b600080600080600080600080610100898b031215613d6257600080fd5b613d6b89613b95565b9750613d7960208a01613b95565b9650613d8760408a01613b95565b9550613d9560608a01613b95565b9450613da360808a01613b95565b9350613db160a08a01613b95565b9250613dbf60c08a01613b95565b9150613dcd60e08a01613b95565b90509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610ce957610ce9613ddc565b600082613e2657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b81810381811115610ce957610ce9613ddc565b600060018201613e7c57613e7c613ddc565b5060010190565b600181815b80851115613ebe578160001904821115613ea457613ea4613ddc565b80851615613eb157918102915b93841c9390800290613e88565b509250929050565b600082613ed557506001610ce9565b81613ee257506000610ce9565b8160018114613ef85760028114613f0257613f1e565b6001915050610ce9565b60ff841115613f1357613f13613ddc565b50506001821b610ce9565b5060208310610133831016604e8410600b8410161715613f41575081810a610ce9565b613f4b8383613e83565b8060001904821115613f5f57613f5f613ddc565b029392505050565b60006112fe60ff841683613ec6565b80820180821115610ce957610ce9613ddc565b600060208284031215613f9b57600080fd5b5051919050565b600060208284031215613fb457600080fd5b81516112fe81613b0d565b600060208284031215613fd157600080fd5b81516112fe81613aaf565b61ffff818116838216019080821115613ff757613ff7613ddc565b5092915050565b600060ff821660ff810361401457614014613ddc565b60010192915050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561406d5784516001600160a01b031683529383019391830191600101614048565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156140a357600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212202810f883ef5f8ad5c97792b394b25ea2e7f9ad04c80e08ace9d28078778a45ba64736f6c63430008120033

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.