ETH Price: $2,947.52 (-1.76%)
Gas: 31 Gwei

Contract

0x337DD23d05c27bff099d3604938BFc23A9B25820
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

Transaction Hash
Method
Block
From
To
Value
0xb640141c08fc4e5930f975b0e0506b1e9bd646d76dfee2c9b3d7a8d7feb52452Transfer(pending)2024-01-21 2:04:1531 days 23 hrs ago1705802655IN
0x337DD2...A9B25820
0 ETH(Pending)(Pending)
Transfer192726642024-02-21 1:05:111 day 10 mins ago1708477511IN
0x337DD2...A9B25820
0 ETH0.0107523443.88498677
Transfer192682512024-02-20 10:13:231 day 15 hrs ago1708424003IN
0x337DD2...A9B25820
0 ETH0.0086704836.09406933
Transfer192295122024-02-14 23:37:357 days 1 hr ago1707953855IN
0x337DD2...A9B25820
0 ETH0.0050539922.1775427
Transfer192212502024-02-13 19:46:598 days 5 hrs ago1707853619IN
0x337DD2...A9B25820
0 ETH0.0063575527.89772496
Transfer191721022024-02-06 22:16:4715 days 2 hrs ago1707257807IN
0x337DD2...A9B25820
0 ETH0.00533123.39063753
Approve191716582024-02-06 20:46:1115 days 4 hrs ago1707252371IN
0x337DD2...A9B25820
0 ETH0.0014811431.76240388
Transfer191497622024-02-03 18:59:2318 days 6 hrs ago1706986763IN
0x337DD2...A9B25820
0 ETH0.0034519215.14587203
Transfer191489662024-02-03 16:17:5918 days 8 hrs ago1706977079IN
0x337DD2...A9B25820
0 ETH0.0059002525.88968342
Transfer191467622024-02-03 8:52:3518 days 16 hrs ago1706950355IN
0x337DD2...A9B25820
0 ETH0.0041355418.14533742
Transfer191323962024-02-01 8:27:5920 days 16 hrs ago1706776079IN
0x337DD2...A9B25820
0 ETH0.0039738117.4375806
Transfer191312612024-02-01 4:37:4720 days 20 hrs ago1706762267IN
0x337DD2...A9B25820
0 ETH0.004541319.9257073
Transfer191288012024-01-31 20:20:1121 days 4 hrs ago1706732411IN
0x337DD2...A9B25820
0 ETH0.0067055629.42172538
Transfer191253922024-01-31 8:52:2321 days 16 hrs ago1706691143IN
0x337DD2...A9B25820
0 ETH0.0040849917.92451041
Approve191228452024-01-31 0:17:1122 days 58 mins ago1706660231IN
0x337DD2...A9B25820
0 ETH0.0008384318.07747881
Approve191210492024-01-30 18:15:4722 days 7 hrs ago1706638547IN
0x337DD2...A9B25820
0 ETH0.0012492426.78947012
Approve191196752024-01-30 13:38:3522 days 11 hrs ago1706621915IN
0x337DD2...A9B25820
0 ETH0.0012773627.39248542
Approve191194342024-01-30 12:50:1122 days 12 hrs ago1706619011IN
0x337DD2...A9B25820
0 ETH0.0014757131.82609136
Transfer191170532024-01-30 4:51:4722 days 20 hrs ago1706590307IN
0x337DD2...A9B25820
0 ETH0.0022972110.07994103
Transfer191146432024-01-29 20:44:2323 days 4 hrs ago1706561063IN
0x337DD2...A9B25820
0 ETH0.0030084813.20089842
Transfer191137292024-01-29 17:39:4723 days 7 hrs ago1706549987IN
0x337DD2...A9B25820
0 ETH0.004857621.3124094
Transfer191136312024-01-29 17:20:1123 days 7 hrs ago1706548811IN
0x337DD2...A9B25820
0 ETH0.0053944523.66900914
Transfer191134122024-01-29 16:36:2323 days 8 hrs ago1706546183IN
0x337DD2...A9B25820
0 ETH0.0068153829.90356391
Transfer191105722024-01-29 7:03:2323 days 18 hrs ago1706511803IN
0x337DD2...A9B25820
0 ETH0.00241410.59128793
Approve191091042024-01-29 2:08:1123 days 23 hrs ago1706494091IN
0x337DD2...A9B25820
0 ETH0.000442239.48355604
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
174509462023-06-10 16:26:35256 days 8 hrs ago1686414395
0x337DD2...A9B25820
0.00647633 ETH
174509462023-06-10 16:26:35256 days 8 hrs ago1686414395
0x337DD2...A9B25820
0.00647633 ETH
172777542023-05-17 7:02:59280 days 18 hrs ago1684306979
0x337DD2...A9B25820
0.0406581 ETH
172777542023-05-17 7:02:59280 days 18 hrs ago1684306979
0x337DD2...A9B25820
0.0406581 ETH
172604742023-05-14 20:30:47283 days 4 hrs ago1684096247
0x337DD2...A9B25820
0.10732682 ETH
172604742023-05-14 20:30:47283 days 4 hrs ago1684096247
0x337DD2...A9B25820
0.10732682 ETH
172570092023-05-14 8:42:35283 days 16 hrs ago1684053755
0x337DD2...A9B25820
0.10605988 ETH
172570092023-05-14 8:42:35283 days 16 hrs ago1684053755
0x337DD2...A9B25820
0.10605988 ETH
172524032023-05-13 17:02:47284 days 8 hrs ago1683997367
0x337DD2...A9B25820
0.10232961 ETH
172524032023-05-13 17:02:47284 days 8 hrs ago1683997367
0x337DD2...A9B25820
0.10232961 ETH
172508522023-05-13 11:47:23284 days 13 hrs ago1683978443
0x337DD2...A9B25820
0.10301557 ETH
172508522023-05-13 11:47:23284 days 13 hrs ago1683978443
0x337DD2...A9B25820
0.10301557 ETH
172508082023-05-13 11:38:35284 days 13 hrs ago1683977915
0x337DD2...A9B25820
0.10792949 ETH
172508082023-05-13 11:38:35284 days 13 hrs ago1683977915
0x337DD2...A9B25820
0.10792949 ETH
172489362023-05-13 5:17:23284 days 19 hrs ago1683955043
0x337DD2...A9B25820
0.11101087 ETH
172489362023-05-13 5:17:23284 days 19 hrs ago1683955043
0x337DD2...A9B25820
0.11101087 ETH
172467092023-05-12 21:45:35285 days 3 hrs ago1683927935
0x337DD2...A9B25820
0.1118507 ETH
172467092023-05-12 21:45:35285 days 3 hrs ago1683927935
0x337DD2...A9B25820
0.1118507 ETH
172419322023-05-12 5:00:59285 days 20 hrs ago1683867659
0x337DD2...A9B25820
0.08834852 ETH
172419322023-05-12 5:00:59285 days 20 hrs ago1683867659
0x337DD2...A9B25820
0.08834852 ETH
172392212023-05-11 19:39:23286 days 5 hrs ago1683833963
0x337DD2...A9B25820
0.07973425 ETH
172392212023-05-11 19:39:23286 days 5 hrs ago1683833963
0x337DD2...A9B25820
0.07973425 ETH
172222972023-05-09 10:27:59288 days 14 hrs ago1683628079
0x337DD2...A9B25820
0.08367982 ETH
172222972023-05-09 10:27:59288 days 14 hrs ago1683628079
0x337DD2...A9B25820
0.08367982 ETH
172210522023-05-09 6:15:47288 days 19 hrs ago1683612947
0x337DD2...A9B25820
0.08536323 ETH
View All Internal Transactions
Loading...
Loading

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

File 2 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 3 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 4 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 5 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;
}

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.