ETH Price: $1,975.00 (+0.65%)
 

Overview

Max Total Supply

1,000,000 eMDR

Holders

3,797 (0.00%)

Market

Price

$1.90 @ 0.000962 ETH (+1.24%)

Onchain Market Cap

$1,900,000.00

Circulating Supply Market Cap

$1,547,311.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000021234314757 eMDR

Value
$0.00 ( ~0 Eth) [0.0000%]
0x9a47f3289794e9bbc6a3c571f6d96ad4e7baed16
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

eMDR is a decentralized Operating System (dOS) powering on-chain robotics and beyond. Focused on building infrastructure that enables developers to launch co-chains, deploy protocols and securly connect machines on-chain.

Market

Volume (24H):$40,112.00
Market Capitalization:$1,547,311.00
Circulating Supply:815,717.00 eMDR
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
eMDRToken

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
/*
 *  ███████╗███╗   ███╗██████╗ ██████╗ 
 *  ██╔════╝████╗ ████║██╔══██╗██╔══██╗
 *  █████╗  ██╔████╔██║██║  ██║██████╔╝
 *  ██╔══╝  ██║╚██╔╝██║██║  ██║██╔══██╗
 *  ███████╗██║ ╚═╝ ██║██████╔╝██║  ██║
 *  ╚══════╝╚═╝     ╚═╝╚═════╝ ╚═╝  ╚═╝
 * 
 *  The Etherium MDR
 *  
 *  Website: https://modulr.cloud
 *  Telegram: https://t.me/eMDRPortal
 *  X: https://x.com/modulrcloud
 *  
 *  
 */

pragma solidity ^0.8.28;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IUniswapV2Router02} from "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import {IUniswapV2Factory} from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
}

contract eMDRToken is ERC20, Ownable, ReentrancyGuard {
    uint256 public immutable MAX_SUPPLY;
    address public immutable pair;
    address public treasury;

    IUniswapV2Router02 private constant _router =
        IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

    address private immutable _weth;
    address private immutable _deployer;

    uint256 public startBlock;
    uint256 public startBlockTime;
    
    bool private inSwap;
    
    uint256 public finalTaxOverride = 400;
    
    mapping(address account => bool) public isExcludedFromFees;
    mapping(address account => bool) public isExcludedFromMaxWallet;
    
    mapping(address origin => mapping(uint256 blockNumber => uint256 txCount))
        public maxBuyTxsPerBlockPerOrigin;
    uint256 private _maxBuyTxsPerBlockPerOrigin = 10;
    mapping(uint256 blockNumber => uint256 txCount) public maxBuyTxsPerBlock;
    uint256 private _maxBuyTxsPerBlock = 100;

    event TradingEnabled(uint256 blockNumber, uint256 timestamp);
    event TreasuryUpdated(address indexed oldTreasury, address indexed newTreasury);
    event TaxTokensSwapped(uint256 tokensSwapped, uint256 ethReceived);
    event OwnershipRenounced(address indexed previousOwner, uint256 timestamp);
    event FinalTaxReduced(uint256 newTaxBps, uint256 timestamp);

    constructor(
        string memory name,
        string memory symbol,
        uint256 maxSupply,
        address _treasury,
        address _realDeployer  
    ) ERC20(name, symbol) Ownable(msg.sender) {
        require(_treasury != address(0), "Zero address");
        require(_realDeployer != address(0), "Zero deployer");
        
        MAX_SUPPLY = maxSupply;
        _weth = _router.WETH();

        pair = IUniswapV2Factory(_router.factory()).createPair(
            address(this),
            _weth
        );

        isExcludedFromFees[msg.sender] = true;
        isExcludedFromFees[address(this)] = true;
        isExcludedFromFees[pair] = true;
        isExcludedFromFees[_treasury] = true;
        isExcludedFromFees[_realDeployer] = true;  
        
        isExcludedFromMaxWallet[msg.sender] = true;
        isExcludedFromMaxWallet[address(this)] = true;
        isExcludedFromMaxWallet[pair] = true;
        isExcludedFromMaxWallet[_treasury] = true;
        isExcludedFromMaxWallet[_realDeployer] = true;  

        _mint(msg.sender, maxSupply);
        _approve(msg.sender, address(_router), type(uint256).max);
        _approve(address(this), address(_router), type(uint256).max);

        treasury = _treasury;
        _deployer = _realDeployer;  
    }

    function enableTrading() external onlyOwner {
        require(startBlock == 0, "Trading already enabled");
        startBlock = block.number;
        startBlockTime = block.timestamp;
        emit TradingEnabled(startBlock, startBlockTime);
    }

    function setTreasury(address newTreasury) external {
        require(newTreasury != address(0), "Treasury is 0");
        require(msg.sender == _deployer, "Only deployer");
        
        address oldTreasury = treasury;
        treasury = newTreasury;
        
        isExcludedFromFees[oldTreasury] = false;
        isExcludedFromMaxWallet[oldTreasury] = false;
        isExcludedFromFees[newTreasury] = true;
        isExcludedFromMaxWallet[newTreasury] = true;
        
        emit TreasuryUpdated(oldTreasury, newTreasury);
    }

    function setExcludedFromFees(address account, bool excluded) external onlyOwner {
        isExcludedFromFees[account] = excluded;
    }

    function setExcludedFromMaxWallet(address account, bool excluded) external onlyOwner {
        isExcludedFromMaxWallet[account] = excluded;
    }

    function reduceFinalTax(uint256 newTaxBps) external onlyOwner {
        require(startBlock > 0, "Trading not enabled");
        require(block.timestamp >= startBlockTime + 1200, "Can only reduce after 20 minutes");
        require(newTaxBps < finalTaxOverride, "Cannot increase tax");
        require(newTaxBps <= 400, "Cannot exceed 4%");
        
        finalTaxOverride = newTaxBps;
        
        emit FinalTaxReduced(newTaxBps, block.timestamp);
    }

    function manualSwap() external onlyOwner {
        _swapTokensForEth();
    }

    function feesAndMaxWallet() external view returns (uint256 _feeBps, uint256 _maxWallet) {
        return _feesAndMaxWallet();
    }

    function _feesAndMaxWallet() internal view returns (uint256 _feeBps, uint256 _maxWallet) {
        if (startBlockTime == 0) {
            return (0, 0);
        }
        
        uint256 _diffSeconds = block.timestamp - startBlockTime;

        if (_diffSeconds < 120) {
            _feeBps = 3500;
            _maxWallet = (MAX_SUPPLY * 10) / 10000;
            return (_feeBps, _maxWallet);
        }
        if (_diffSeconds < 240) {
            _feeBps = 3000;
            _maxWallet = (MAX_SUPPLY * 15) / 10000;
            return (_feeBps, _maxWallet);
        }
        if (_diffSeconds < 360) {
            _feeBps = 2500;
            _maxWallet = (MAX_SUPPLY * 20) / 10000;
            return (_feeBps, _maxWallet);
        }
        if (_diffSeconds < 480) {
            _feeBps = 2000;
            _maxWallet = (MAX_SUPPLY * 25) / 10000;
            return (_feeBps, _maxWallet);
        }
        if (_diffSeconds < 720) {
            _feeBps = 1500;
            _maxWallet = (MAX_SUPPLY * 30) / 10000;
            return (_feeBps, _maxWallet);
        }
        if (_diffSeconds < 960) {
            _feeBps = 1000;
            _maxWallet = (MAX_SUPPLY * 35) / 10000;
            return (_feeBps, _maxWallet);
        }
        if (_diffSeconds < 1200) {
            _feeBps = 700;
            _maxWallet = (MAX_SUPPLY * 40) / 10000;
            return (_feeBps, _maxWallet);
        }
        
        _feeBps = finalTaxOverride;
        _maxWallet = MAX_SUPPLY;
        return (_feeBps, _maxWallet);
    }

    function _update(address from, address to, uint256 value) internal override {
        if (inSwap) {
            super._update(from, to, value);
            return;
        }

        (uint256 _feeBps, uint256 _maxWallet) = _feesAndMaxWallet();

        bool isBuy = from == pair;
        bool isSell = to == pair;
        
        if (isBuy || isSell) {
            require(startBlock > 0 || isExcludedFromFees[to], "Trading not enabled");

            if (_feeBps != 0) {
                if (isBuy && !isExcludedFromFees[to]) {
                    if (startBlockTime > 0 && block.timestamp - startBlockTime < 180) {
                        require(
                            maxBuyTxsPerBlockPerOrigin[tx.origin][block.number] < _maxBuyTxsPerBlockPerOrigin,
                            "Max buy txs per block per origin exceeded"
                        );
                        maxBuyTxsPerBlockPerOrigin[tx.origin][block.number]++;

                        require(
                            maxBuyTxsPerBlock[block.number] < _maxBuyTxsPerBlock,
                            "Max buy txs per block exceeded"
                        );
                        maxBuyTxsPerBlock[block.number]++;
                    }

                    uint256 fee = (value * _feeBps) / 10000;
                    value -= fee;
                    super._update(from, address(this), fee);
                }

                if (isSell && !isExcludedFromFees[from]) {
                    uint256 fee = (value * _feeBps) / 10000;
                    value -= fee;
                    super._update(from, address(this), fee);
                    _swapTokensForEth();
                }
            } else {
                if (isSell && !isExcludedFromFees[from]) {
                    _swapTokensForEth();
                }
            }
        }

        require(
            isExcludedFromMaxWallet[to] || value + balanceOf(to) <= _maxWallet,
            "Max wallet size exceeded"
        );
        
        super._update(from, to, value);
    }

    function _swapTokensForEth() internal nonReentrant {
        uint256 startDiff = block.timestamp - startBlockTime;
        
        uint256 _tokenAmount = balanceOf(address(this));
        if (_tokenAmount == 0) {
            return;
        }

        uint256 maxEthWorth;
        if (startDiff < 480) {
            maxEthWorth = 2 ether;
        } else if (startDiff < 720) {
            maxEthWorth = 1.5 ether;
        } else {
            maxEthWorth = 1 ether;
        }

        address[] memory _path = new address[](2);
        _path[0] = address(this);
        _path[1] = _weth;

        uint256 _maxTokenAmount;
        try _router.getAmountsIn(maxEthWorth, _path) returns (uint256[] memory amounts) {
            _maxTokenAmount = amounts[0];
        } catch {
            _maxTokenAmount = _tokenAmount;
        }

        if (_tokenAmount > _maxTokenAmount) {
            _tokenAmount = _maxTokenAmount;
        }

        uint256 minTokenAmount = MAX_SUPPLY / 10000;
        if (_tokenAmount < minTokenAmount) {
            return;
        }
        
        inSwap = true;

        uint256 balanceBefore = address(treasury).balance;
        _router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _tokenAmount,
            0,
            _path,
            treasury,
            block.timestamp
        );
        uint256 balanceAfter = address(treasury).balance;
        
        inSwap = false;
        
        emit TaxTokensSwapped(_tokenAmount, balanceAfter - balanceBefore);
    }

    receive() external payable {}
    
    function renounceOwnership() public override onlyOwner {
        require(startBlock > 0, "Trading must be enabled first");
        require(block.timestamp > startBlockTime + 1200, "Must wait 20 minutes after launch");
        
        address previousOwner = owner();
        super.renounceOwnership();
        
        emit OwnershipRenounced(previousOwner, block.timestamp);
    }
    
    function isOwnershipRenounced() external view returns (bool) {
        return owner() == address(0);
    }
    
    function getContractStatus() external view returns (
        bool tradingEnabled,
        bool ownershipRenounced,
        uint256 currentTax,
        uint256 currentMaxWallet,
        uint256 timeUntilRenounceAvailable
    ) {
        tradingEnabled = startBlock > 0;
        ownershipRenounced = owner() == address(0);
        (currentTax, currentMaxWallet) = _feesAndMaxWallet();
        
        if (startBlockTime == 0) {
            timeUntilRenounceAvailable = type(uint256).max;
        } else if (block.timestamp >= startBlockTime + 1200) {
            timeUntilRenounceAvailable = 0;
        } else {
            timeUntilRenounceAvailable = (startBlockTime + 1200) - block.timestamp;
        }
        
        return (tradingEnabled, ownershipRenounced, currentTax, currentMaxWallet, timeUntilRenounceAvailable);
    }
    
    function recoverWrongToken(address token) external onlyOwner {
        require(token != address(this), "Cannot recover own token");
        uint256 balance = IERC20(token).balanceOf(address(this));
        IERC20(token).transfer(owner(), balance);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

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

pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * Both values are immutable: they can only be set once during construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /// @inheritdoc IERC20
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /// @inheritdoc IERC20
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity >=0.6.2;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)

pragma solidity >=0.4.16;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_realDeployer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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":"newTaxBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FinalTaxReduced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"OwnershipRenounced","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":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"TaxTokensSwapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldTreasury","type":"address"},{"indexed":true,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryUpdated","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesAndMaxWallet","outputs":[{"internalType":"uint256","name":"_feeBps","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalTaxOverride","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractStatus","outputs":[{"internalType":"bool","name":"tradingEnabled","type":"bool"},{"internalType":"bool","name":"ownershipRenounced","type":"bool"},{"internalType":"uint256","name":"currentTax","type":"uint256"},{"internalType":"uint256","name":"currentMaxWallet","type":"uint256"},{"internalType":"uint256","name":"timeUntilRenounceAvailable","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":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwnershipRenounced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"maxBuyTxsPerBlock","outputs":[{"internalType":"uint256","name":"txCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"maxBuyTxsPerBlockPerOrigin","outputs":[{"internalType":"uint256","name":"txCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"recoverWrongToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTaxBps","type":"uint256"}],"name":"reduceFinalTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

610100604052610190600b55600a600f556064601155348015610020575f5ffd5b506040516132af3803806132af83398101604081905261003f91610ee8565b338585600361004e8382610ffb565b50600461005b8282610ffb565b5050506001600160a01b03811661008c57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610095816103a3565b5060016006556001600160a01b0382166100e05760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610083565b6001600160a01b0381166101265760405162461bcd60e51b815260206004820152600d60248201526c2d32b937903232b83637bcb2b960991b6044820152606401610083565b82608081815250505f51602061328f5f395f51905f526001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610177573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061019b91906110b5565b6001600160a01b031660c0526040805163c45a015560e01b815290515f51602061328f5f395f51905f529163c45a01559160048083019260209291908290030181865afa1580156101ee573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061021291906110b5565b60c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303815f875af1158015610260573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061028491906110b5565b6001600160a01b0390811660a0819052335f818152600c602090815260408083208054600160ff19918216811790925530808652838620805483168417905587865283862080548316841790558a89168087528487208054841685179055988a168087528487208054841685179055878752600d9095528386208054831684179055855282852080548216831790559584528184208054871682179055958352808320805486168717905590825290208054909216909217905561034890846103f4565b610361335f51602061328f5f395f51905f525f1961042c565b61037a305f51602061328f5f395f51905f525f1961042c565b600780546001600160a01b0319166001600160a01b039384161790551660e052506112bf915050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b03821661041d5760405163ec442f0560e01b81525f6004820152602401610083565b6104285f838361043e565b5050565b61043983838360016107ef565b505050565b600a5460ff1615610454576104398383836108c2565b5f8061045e6109e8565b60a05191935091506001600160a01b0390811686821681149186161481806104835750805b15610742575f60085411806104af57506001600160a01b0386165f908152600c602052604090205460ff165b6104fb5760405162461bcd60e51b815260206004820152601360248201527f54726164696e67206e6f7420656e61626c6564000000000000000000000000006044820152606401610083565b83156107105781801561052657506001600160a01b0386165f908152600c602052604090205460ff16155b156106a6575f600954118015610549575060b46009544261054791906110e9565b105b1561067357600f54325f908152600e60209081526040808320438452909152902054106105ca5760405162461bcd60e51b815260206004820152602960248201527f4d617820627579207478732070657220626c6f636b20706572206f726967696e60448201526808195e18d95959195960ba1b6064820152608401610083565b325f908152600e6020908152604080832043845290915281208054916105ef83611102565b9091555050601154435f90815260106020526040902054106106535760405162461bcd60e51b815260206004820152601e60248201527f4d617820627579207478732070657220626c6f636b20657863656564656400006044820152606401610083565b435f90815260106020526040812080549161066d83611102565b91905055505b5f612710610681868861111a565b61068b9190611131565b905061069781876110e9565b95506106a48830836108c2565b505b8080156106cb57506001600160a01b0387165f908152600c602052604090205460ff16155b1561070b575f6127106106de868861111a565b6106e89190611131565b90506106f481876110e9565b95506107018830836108c2565b610709610b11565b505b610742565b80801561073557506001600160a01b0387165f908152600c602052604090205460ff16155b1561074257610742610b11565b6001600160a01b0386165f908152600d602052604090205460ff168061078f575082610782876001600160a01b03165f9081526020819052604090205490565b61078c9087611150565b11155b6107db5760405162461bcd60e51b815260206004820152601860248201527f4d61782077616c6c65742073697a6520657863656564656400000000000000006044820152606401610083565b6107e68787876108c2565b50505050505050565b6001600160a01b0384166108185760405163e602df0560e01b81525f6004820152602401610083565b6001600160a01b03831661084157604051634a1406b160e11b81525f6004820152602401610083565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156108bc57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516108b391815260200190565b60405180910390a35b50505050565b6001600160a01b0383166108ec578060025f8282546108e19190611150565b9091555061095c9050565b6001600160a01b0383165f908152602081905260409020548181101561093e5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610083565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661097857600280548290039055610996565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516109db91815260200190565b60405180910390a3505050565b5f5f6009545f036109fb57505f91829150565b5f60095442610a0a91906110e9565b90506078811015610a3d57610dac9250612710608051600a610a2c919061111a565b610a369190611131565b9150509091565b60f0811015610a5d57610bb89250612710608051600f610a2c919061111a565b610168811015610a7e576109c492506127106080516014610a2c919061111a565b6101e0811015610a9f576107d092506127106080516019610a2c919061111a565b6102d0811015610ac0576105dc9250612710608051601e610a2c919061111a565b6103c0811015610ae1576103e892506127106080516023610a2c919061111a565b6104b0811015610b02576102bc92506127106080516028610a2c919061111a565b600b5492506080519150509091565b610b19610dc5565b5f60095442610b2891906110e9565b305f90815260208190526040812054919250819003610b48575050610db9565b5f6101e0831015610b625750671bc16d674ec80000610b86565b6102d0831015610b7b57506714d1120d7b160000610b86565b50670de0b6b3a76400005b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110610bb957610bb9611163565b60200260200101906001600160a01b031690816001600160a01b03168152505060c05181600181518110610bef57610bef611163565b6001600160a01b03909216602092830291909101909101526040516307c0329d60e21b81525f905f51602061328f5f395f51905f5290631f00ca7490610c3b90869086906004016111ba565b5f60405180830381865afa925050508015610c7757506040513d5f823e601f3d908101601f19168201604052610c7491908101906111da565b60015b610c82575082610ca0565b805f81518110610c9457610c94611163565b60200260200101519150505b80841115610cac578093505b5f612710608051610cbd9190611131565b905080851015610cd257505050505050610db9565b600a805460ff1916600117905560075460405163791ac94760e01b81526001600160a01b039091168031915f51602061328f5f395f51905f529163791ac94791610d26918a915f918a914290600401611284565b5f604051808303815f87803b158015610d3d575f5ffd5b505af1158015610d4f573d5f5f3e3d5ffd5b5050600754600a805460ff191690556001600160a01b03163191507ff5b1caace4f27dc52b88770c86bd438f840e96d6503b0116e9f183d838320f3e905087610d9884846110e9565b6040805192835260208301919091520160405180910390a150505050505050505b610dc36001600655565b565b600260065403610e175760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610083565b6002600655565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715610e5a57610e5a610e1e565b604052919050565b5f82601f830112610e71575f5ffd5b81516001600160401b03811115610e8a57610e8a610e1e565b610e9d601f8201601f1916602001610e32565b818152846020838601011115610eb1575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b80516001600160a01b0381168114610ee3575f5ffd5b919050565b5f5f5f5f5f60a08688031215610efc575f5ffd5b85516001600160401b03811115610f11575f5ffd5b610f1d88828901610e62565b602088015190965090506001600160401b03811115610f3a575f5ffd5b610f4688828901610e62565b60408801519095509350610f5e905060608701610ecd565b9150610f6c60808701610ecd565b90509295509295909350565b600181811c90821680610f8c57607f821691505b602082108103610faa57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561043957805f5260205f20601f840160051c81016020851015610fd55750805b601f840160051c820191505b81811015610ff4575f8155600101610fe1565b5050505050565b81516001600160401b0381111561101457611014610e1e565b611028816110228454610f78565b84610fb0565b6020601f82116001811461105a575f83156110435750848201515b5f19600385901b1c1916600184901b178455610ff4565b5f84815260208120601f198516915b828110156110895787850151825560209485019460019092019101611069565b50848210156110a657868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082840312156110c5575f5ffd5b6110ce82610ecd565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156110fc576110fc6110d5565b92915050565b5f60018201611113576111136110d5565b5060010190565b80820281158282048414176110fc576110fc6110d5565b5f8261114b57634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156110fc576110fc6110d5565b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602084019350602083015f5b828110156111b05781516001600160a01b0316865260209586019590910190600101611189565b5093949350505050565b828152604060208201525f6111d26040830184611177565b949350505050565b5f602082840312156111ea575f5ffd5b81516001600160401b038111156111ff575f5ffd5b8201601f8101841361120f575f5ffd5b80516001600160401b0381111561122857611228610e1e565b8060051b61123860208201610e32565b91825260208184018101929081019087841115611253575f5ffd5b6020850194505b838510156112795784518083526020958601959093509091019061125a565b979650505050505050565b85815284602082015260a060408201525f6112a260a0830186611177565b6001600160a01b0394909416606083015250608001529392505050565b60805160a05160c05160e051611f576113385f395f610d8101525f61109401525f8181610552015261163301525f818161035b015281816111930152818161130f0152818161135c01528181611399015281816113d601528181611413015281816114500152818161148d01526114bb0152611f575ff3fe6080604052600436106101de575f3560e01c806361d027b3116100fd578063a25ba18311610092578063dd62ed3e11610062578063dd62ed3e146105d1578063e9d2813914610615578063f0f4426014610634578063f2fde38b14610653575f5ffd5b8063a25ba18314610518578063a8aa1b3114610541578063a9059cbb14610574578063c032846b14610593575f5ffd5b80638a8c523c116100cd5780638a8c523c146104bf5780638da5cb5b146104d357806395d89b41146104f05780639f023eb614610504575f5ffd5b806361d027b3146104125780636dd3d39f1461044957806370a0823114610477578063715018a6146104ab575f5ffd5b8063261fa69d1161017357806348cd4cb11161014357806348cd4cb11461039c5780634fbee193146103b157806351bc3c85146103df578063590ffdce146103f3575f5ffd5b8063261fa69d1461031a578063313ce5671461032f57806332cb6b0c1461034a578063412201041461037d575f5ffd5b80630fe3fe7d116101ae5780630fe3fe7d1461028657806318160ddd146102bc57806321b02486146102d057806323b872dd146102fb575f5ffd5b8063018bcf5c146101e957806306fdde031461020a578063095ea7b3146102345780630c18d4ce14610263575f5ffd5b366101e557005b5f5ffd5b3480156101f4575f5ffd5b50610208610203366004611b60565b610672565b005b348015610215575f5ffd5b5061021e6107d5565b60405161022b9190611b80565b60405180910390f35b34801561023f575f5ffd5b5061025361024e366004611bb5565b610865565b604051901515815260200161022b565b34801561026e575f5ffd5b5061027860095481565b60405190815260200161022b565b348015610291575f5ffd5b506102786102a0366004611bb5565b600e60209081525f928352604080842090915290825290205481565b3480156102c7575f5ffd5b50600254610278565b3480156102db575f5ffd5b506102786102ea366004611bdd565b60106020525f908152604090205481565b348015610306575f5ffd5b50610253610315366004611bf4565b61087e565b348015610325575f5ffd5b50610278600b5481565b34801561033a575f5ffd5b506040516012815260200161022b565b348015610355575f5ffd5b506102787f000000000000000000000000000000000000000000000000000000000000000081565b348015610388575f5ffd5b50610208610397366004611c3b565b6108a1565b3480156103a7575f5ffd5b5061027860085481565b3480156103bc575f5ffd5b506102536103cb366004611b60565b600c6020525f908152604090205460ff1681565b3480156103ea575f5ffd5b506102086108d3565b3480156103fe575f5ffd5b5061020861040d366004611c3b565b6108e5565b34801561041d575f5ffd5b50600754610431906001600160a01b031681565b6040516001600160a01b03909116815260200161022b565b348015610454575f5ffd5b50610253610463366004611b60565b600d6020525f908152604090205460ff1681565b348015610482575f5ffd5b50610278610491366004611b60565b6001600160a01b03165f9081526020819052604090205490565b3480156104b6575f5ffd5b50610208610917565b3480156104ca575f5ffd5b50610208610a3a565b3480156104de575f5ffd5b506005546001600160a01b0316610431565b3480156104fb575f5ffd5b5061021e610adf565b34801561050f575f5ffd5b50610253610aee565b348015610523575f5ffd5b5061052c610b11565b6040805192835260208301919091520161022b565b34801561054c575f5ffd5b506104317f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f575f5ffd5b5061025361058e366004611bb5565b610b23565b34801561059e575f5ffd5b506105a7610b30565b6040805195151586529315156020860152928401919091526060830152608082015260a00161022b565b3480156105dc575f5ffd5b506102786105eb366004611c70565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610620575f5ffd5b5061020861062f366004611bdd565b610bb7565b34801561063f575f5ffd5b5061020861064e366004611b60565b610d30565b34801561065e575f5ffd5b5061020861066d366004611b60565b610e7a565b61067a610eb7565b306001600160a01b038216036106d75760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74207265636f766572206f776e20746f6b656e000000000000000060448201526064015b60405180910390fd5b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa15801561071b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073f9190611ca1565b9050816001600160a01b031663a9059cbb6107626005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af11580156107ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d09190611cb8565b505050565b6060600380546107e490611cd3565b80601f016020809104026020016040519081016040528092919081815260200182805461081090611cd3565b801561085b5780601f106108325761010080835404028352916020019161085b565b820191905f5260205f20905b81548152906001019060200180831161083e57829003601f168201915b5050505050905090565b5f33610872818585610ee4565b60019150505b92915050565b5f3361088b858285610ef1565b610896858585610f6d565b506001949350505050565b6108a9610eb7565b6001600160a01b03919091165f908152600d60205260409020805460ff1916911515919091179055565b6108db610eb7565b6108e3610fca565b565b6108ed610eb7565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b61091f610eb7565b5f600854116109705760405162461bcd60e51b815260206004820152601d60248201527f54726164696e67206d75737420626520656e61626c656420666972737400000060448201526064016106ce565b60095461097f906104b0611d1f565b42116109d75760405162461bcd60e51b815260206004820152602160248201527f4d7573742077616974203230206d696e75746573206166746572206c61756e636044820152600d60fb1b60648201526084016106ce565b5f6109ea6005546001600160a01b031690565b90506109f46112c4565b806001600160a01b03167f656ba3c6830b11142778bbcfaff90d2ecc89186277667c2ce8700e4697ddccc242604051610a2f91815260200190565b60405180910390a250565b610a42610eb7565b60085415610a925760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c656400000000000000000060448201526064016106ce565b4360088190554260098190556040517f7920707bc1e04048b254e37287ad152443d9f95ea809f714fbee15fd3cc966d092610ad592908252602082015260400190565b60405180910390a1565b6060600480546107e490611cd3565b5f80610b026005546001600160a01b031690565b6001600160a01b031614905090565b5f5f610b1b6112d5565b915091509091565b5f33610872818585610f6d565b60085415155f80808080610b4c6005546001600160a01b031690565b6001600160a01b0316149350610b606112d5565b60095491945092505f03610b7657505f19610bb0565b600954610b85906104b0611d1f565b4210610b9257505f610bb0565b426009546104b0610ba39190611d1f565b610bad9190611d32565b90505b9091929394565b610bbf610eb7565b5f60085411610c065760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd08195b98589b1959606a1b60448201526064016106ce565b600954610c15906104b0611d1f565b421015610c645760405162461bcd60e51b815260206004820181905260248201527f43616e206f6e6c7920726564756365206166746572203230206d696e7574657360448201526064016106ce565b600b548110610cab5760405162461bcd60e51b8152602060048201526013602482015272086c2dcdcdee840d2dcc6e4cac2e6ca40e8c2f606b1b60448201526064016106ce565b610190811115610cf05760405162461bcd60e51b815260206004820152601060248201526f43616e6e6f742065786365656420342560801b60448201526064016106ce565b600b819055604080518281524260208201527ff453724d017bc8b1715852eaf72a7612c4b6de3274345de3ad4462959864311f910160405180910390a150565b6001600160a01b038116610d765760405162461bcd60e51b815260206004820152600d60248201526c05472656173757279206973203609c1b60448201526064016106ce565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610dde5760405162461bcd60e51b815260206004820152600d60248201526c27b7363c903232b83637bcb2b960991b60448201526064016106ce565b600780546001600160a01b038381166001600160a01b031983168117909355165f818152600c60208181526040808420805460ff19908116909155600d80845282862080548316905587865293835281852080548216600190811790915593909252808420805490921690921790555191929183917f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a91a35050565b610e82610eb7565b6001600160a01b038116610eab57604051631e4fbdf760e01b81525f60048201526024016106ce565b610eb4816114de565b50565b6005546001600160a01b031633146108e35760405163118cdaa760e01b81523360048201526024016106ce565b6107d0838383600161152f565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610f675781811015610f5957604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016106ce565b610f6784848484035f61152f565b50505050565b6001600160a01b038316610f9657604051634b637e8f60e11b81525f60048201526024016106ce565b6001600160a01b038216610fbf5760405163ec442f0560e01b81525f60048201526024016106ce565b6107d0838383611601565b610fd26119c6565b5f60095442610fe19190611d32565b305f908152602081905260408120549192508190036110015750506112ba565b5f6101e083101561101b5750671bc16d674ec8000061103f565b6102d083101561103457506714d1120d7b16000061103f565b50670de0b6b3a76400005b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061107257611072611d59565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106110c6576110c6611d59565b6001600160a01b03909216602092830291909101909101526040516307c0329d60e21b81525f90737a250d5630b4cf539739df2c5dacb4c659f2488d90631f00ca74906111199086908690600401611db0565b5f60405180830381865afa92505050801561115557506040513d5f823e601f3d908101601f191682016040526111529190810190611dd0565b60015b61116057508261117e565b805f8151811061117257611172611d59565b60200260200101519150505b8084111561118a578093505b5f6111b76127107f0000000000000000000000000000000000000000000000000000000000000000611e98565b9050808510156111cc575050505050506112ba565b600a805460ff1916600117905560075460405163791ac94760e01b81526001600160a01b03909116803191737a250d5630b4cf539739df2c5dacb4c659f2488d9163791ac94791611227918a915f918a914290600401611eb7565b5f604051808303815f87803b15801561123e575f5ffd5b505af1158015611250573d5f5f3e3d5ffd5b5050600754600a805460ff191690556001600160a01b03163191507ff5b1caace4f27dc52b88770c86bd438f840e96d6503b0116e9f183d838320f3e9050876112998484611d32565b6040805192835260208301919091520160405180910390a150505050505050505b6108e36001600655565b6112cc610eb7565b6108e35f6114de565b5f5f6009545f036112e857505f91829150565b5f600954426112f79190611d32565b9050607881101561134657610dac92506127106113357f0000000000000000000000000000000000000000000000000000000000000000600a611ef2565b61133f9190611e98565b9150509091565b60f081101561138257610bb892506127106113357f0000000000000000000000000000000000000000000000000000000000000000600f611ef2565b6101688110156113bf576109c492506127106113357f00000000000000000000000000000000000000000000000000000000000000006014611ef2565b6101e08110156113fc576107d092506127106113357f00000000000000000000000000000000000000000000000000000000000000006019611ef2565b6102d0811015611439576105dc92506127106113357f0000000000000000000000000000000000000000000000000000000000000000601e611ef2565b6103c0811015611476576103e892506127106113357f00000000000000000000000000000000000000000000000000000000000000006023611ef2565b6104b08110156114b3576102bc92506127106113357f00000000000000000000000000000000000000000000000000000000000000006028611ef2565b5050600b54917f00000000000000000000000000000000000000000000000000000000000000009150565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0384166115585760405163e602df0560e01b81525f60048201526024016106ce565b6001600160a01b03831661158157604051634a1406b160e11b81525f60048201526024016106ce565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610f6757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516115f391815260200190565b60405180910390a350505050565b600a5460ff1615611617576107d0838383611a1f565b5f5f6116216112d5565b90925090506001600160a01b038581167f000000000000000000000000000000000000000000000000000000000000000082169081149186161481806116645750805b15611919575f600854118061169057506001600160a01b0386165f908152600c602052604090205460ff165b6116d25760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd08195b98589b1959606a1b60448201526064016106ce565b83156118e7578180156116fd57506001600160a01b0386165f908152600c602052604090205460ff16155b1561187d575f600954118015611720575060b46009544261171e9190611d32565b105b1561184a57600f54325f908152600e60209081526040808320438452909152902054106117a15760405162461bcd60e51b815260206004820152602960248201527f4d617820627579207478732070657220626c6f636b20706572206f726967696e60448201526808195e18d95959195960ba1b60648201526084016106ce565b325f908152600e6020908152604080832043845290915281208054916117c683611f09565b9091555050601154435f908152601060205260409020541061182a5760405162461bcd60e51b815260206004820152601e60248201527f4d617820627579207478732070657220626c6f636b206578636565646564000060448201526064016106ce565b435f90815260106020526040812080549161184483611f09565b91905055505b5f6127106118588688611ef2565b6118629190611e98565b905061186e8187611d32565b955061187b883083611a1f565b505b8080156118a257506001600160a01b0387165f908152600c602052604090205460ff16155b156118e2575f6127106118b58688611ef2565b6118bf9190611e98565b90506118cb8187611d32565b95506118d8883083611a1f565b6118e0610fca565b505b611919565b80801561190c57506001600160a01b0387165f908152600c602052604090205460ff16155b1561191957611919610fca565b6001600160a01b0386165f908152600d602052604090205460ff1680611966575082611959876001600160a01b03165f9081526020819052604090205490565b6119639087611d1f565b11155b6119b25760405162461bcd60e51b815260206004820152601860248201527f4d61782077616c6c65742073697a65206578636565646564000000000000000060448201526064016106ce565b6119bd878787611a1f565b50505050505050565b600260065403611a185760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ce565b6002600655565b6001600160a01b038316611a49578060025f828254611a3e9190611d1f565b90915550611ab99050565b6001600160a01b0383165f9081526020819052604090205481811015611a9b5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016106ce565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611ad557600280548290039055611af3565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b3891815260200190565b60405180910390a3505050565b80356001600160a01b0381168114611b5b575f5ffd5b919050565b5f60208284031215611b70575f5ffd5b611b7982611b45565b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611bc6575f5ffd5b611bcf83611b45565b946020939093013593505050565b5f60208284031215611bed575f5ffd5b5035919050565b5f5f5f60608486031215611c06575f5ffd5b611c0f84611b45565b9250611c1d60208501611b45565b929592945050506040919091013590565b8015158114610eb4575f5ffd5b5f5f60408385031215611c4c575f5ffd5b611c5583611b45565b91506020830135611c6581611c2e565b809150509250929050565b5f5f60408385031215611c81575f5ffd5b611c8a83611b45565b9150611c9860208401611b45565b90509250929050565b5f60208284031215611cb1575f5ffd5b5051919050565b5f60208284031215611cc8575f5ffd5b8151611b7981611c2e565b600181811c90821680611ce757607f821691505b602082108103611d0557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561087857610878611d0b565b8181038181111561087857610878611d0b565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602084019350602083015f5b82811015611da65781516001600160a01b0316865260209586019590910190600101611d7f565b5093949350505050565b828152604060208201525f611dc86040830184611d6d565b949350505050565b5f60208284031215611de0575f5ffd5b815167ffffffffffffffff811115611df6575f5ffd5b8201601f81018413611e06575f5ffd5b805167ffffffffffffffff811115611e2057611e20611d45565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715611e4d57611e4d611d45565b604052918252602081840181019290810187841115611e6a575f5ffd5b6020850194505b83851015611e8d57845180825260209586019590935001611e71565b509695505050505050565b5f82611eb257634e487b7160e01b5f52601260045260245ffd5b500490565b85815284602082015260a060408201525f611ed560a0830186611d6d565b6001600160a01b0394909416606083015250608001529392505050565b808202811582820484141761087857610878611d0b565b5f60018201611f1a57611f1a611d0b565b506001019056fea2646970667358221220264591c85c780591cc0ed4261b64b53a73fbbf222d85df4d28b27422ebed9f0764736f6c634300081c00330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000aa25cd227afdc940156cee3d0f2e0a829c33fab6000000000000000000000000d569372a5c654ef55cf8e0e0b6240497fe1641d8000000000000000000000000000000000000000000000000000000000000000c457468657265756d204d445200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004654d445200000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101de575f3560e01c806361d027b3116100fd578063a25ba18311610092578063dd62ed3e11610062578063dd62ed3e146105d1578063e9d2813914610615578063f0f4426014610634578063f2fde38b14610653575f5ffd5b8063a25ba18314610518578063a8aa1b3114610541578063a9059cbb14610574578063c032846b14610593575f5ffd5b80638a8c523c116100cd5780638a8c523c146104bf5780638da5cb5b146104d357806395d89b41146104f05780639f023eb614610504575f5ffd5b806361d027b3146104125780636dd3d39f1461044957806370a0823114610477578063715018a6146104ab575f5ffd5b8063261fa69d1161017357806348cd4cb11161014357806348cd4cb11461039c5780634fbee193146103b157806351bc3c85146103df578063590ffdce146103f3575f5ffd5b8063261fa69d1461031a578063313ce5671461032f57806332cb6b0c1461034a578063412201041461037d575f5ffd5b80630fe3fe7d116101ae5780630fe3fe7d1461028657806318160ddd146102bc57806321b02486146102d057806323b872dd146102fb575f5ffd5b8063018bcf5c146101e957806306fdde031461020a578063095ea7b3146102345780630c18d4ce14610263575f5ffd5b366101e557005b5f5ffd5b3480156101f4575f5ffd5b50610208610203366004611b60565b610672565b005b348015610215575f5ffd5b5061021e6107d5565b60405161022b9190611b80565b60405180910390f35b34801561023f575f5ffd5b5061025361024e366004611bb5565b610865565b604051901515815260200161022b565b34801561026e575f5ffd5b5061027860095481565b60405190815260200161022b565b348015610291575f5ffd5b506102786102a0366004611bb5565b600e60209081525f928352604080842090915290825290205481565b3480156102c7575f5ffd5b50600254610278565b3480156102db575f5ffd5b506102786102ea366004611bdd565b60106020525f908152604090205481565b348015610306575f5ffd5b50610253610315366004611bf4565b61087e565b348015610325575f5ffd5b50610278600b5481565b34801561033a575f5ffd5b506040516012815260200161022b565b348015610355575f5ffd5b506102787f00000000000000000000000000000000000000000000d3c21bcecceda100000081565b348015610388575f5ffd5b50610208610397366004611c3b565b6108a1565b3480156103a7575f5ffd5b5061027860085481565b3480156103bc575f5ffd5b506102536103cb366004611b60565b600c6020525f908152604090205460ff1681565b3480156103ea575f5ffd5b506102086108d3565b3480156103fe575f5ffd5b5061020861040d366004611c3b565b6108e5565b34801561041d575f5ffd5b50600754610431906001600160a01b031681565b6040516001600160a01b03909116815260200161022b565b348015610454575f5ffd5b50610253610463366004611b60565b600d6020525f908152604090205460ff1681565b348015610482575f5ffd5b50610278610491366004611b60565b6001600160a01b03165f9081526020819052604090205490565b3480156104b6575f5ffd5b50610208610917565b3480156104ca575f5ffd5b50610208610a3a565b3480156104de575f5ffd5b506005546001600160a01b0316610431565b3480156104fb575f5ffd5b5061021e610adf565b34801561050f575f5ffd5b50610253610aee565b348015610523575f5ffd5b5061052c610b11565b6040805192835260208301919091520161022b565b34801561054c575f5ffd5b506104317f00000000000000000000000034a2a52f265042bbc91e524386a4fcaacf36a6f581565b34801561057f575f5ffd5b5061025361058e366004611bb5565b610b23565b34801561059e575f5ffd5b506105a7610b30565b6040805195151586529315156020860152928401919091526060830152608082015260a00161022b565b3480156105dc575f5ffd5b506102786105eb366004611c70565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610620575f5ffd5b5061020861062f366004611bdd565b610bb7565b34801561063f575f5ffd5b5061020861064e366004611b60565b610d30565b34801561065e575f5ffd5b5061020861066d366004611b60565b610e7a565b61067a610eb7565b306001600160a01b038216036106d75760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74207265636f766572206f776e20746f6b656e000000000000000060448201526064015b60405180910390fd5b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa15801561071b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073f9190611ca1565b9050816001600160a01b031663a9059cbb6107626005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af11580156107ac573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d09190611cb8565b505050565b6060600380546107e490611cd3565b80601f016020809104026020016040519081016040528092919081815260200182805461081090611cd3565b801561085b5780601f106108325761010080835404028352916020019161085b565b820191905f5260205f20905b81548152906001019060200180831161083e57829003601f168201915b5050505050905090565b5f33610872818585610ee4565b60019150505b92915050565b5f3361088b858285610ef1565b610896858585610f6d565b506001949350505050565b6108a9610eb7565b6001600160a01b03919091165f908152600d60205260409020805460ff1916911515919091179055565b6108db610eb7565b6108e3610fca565b565b6108ed610eb7565b6001600160a01b03919091165f908152600c60205260409020805460ff1916911515919091179055565b61091f610eb7565b5f600854116109705760405162461bcd60e51b815260206004820152601d60248201527f54726164696e67206d75737420626520656e61626c656420666972737400000060448201526064016106ce565b60095461097f906104b0611d1f565b42116109d75760405162461bcd60e51b815260206004820152602160248201527f4d7573742077616974203230206d696e75746573206166746572206c61756e636044820152600d60fb1b60648201526084016106ce565b5f6109ea6005546001600160a01b031690565b90506109f46112c4565b806001600160a01b03167f656ba3c6830b11142778bbcfaff90d2ecc89186277667c2ce8700e4697ddccc242604051610a2f91815260200190565b60405180910390a250565b610a42610eb7565b60085415610a925760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c656400000000000000000060448201526064016106ce565b4360088190554260098190556040517f7920707bc1e04048b254e37287ad152443d9f95ea809f714fbee15fd3cc966d092610ad592908252602082015260400190565b60405180910390a1565b6060600480546107e490611cd3565b5f80610b026005546001600160a01b031690565b6001600160a01b031614905090565b5f5f610b1b6112d5565b915091509091565b5f33610872818585610f6d565b60085415155f80808080610b4c6005546001600160a01b031690565b6001600160a01b0316149350610b606112d5565b60095491945092505f03610b7657505f19610bb0565b600954610b85906104b0611d1f565b4210610b9257505f610bb0565b426009546104b0610ba39190611d1f565b610bad9190611d32565b90505b9091929394565b610bbf610eb7565b5f60085411610c065760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd08195b98589b1959606a1b60448201526064016106ce565b600954610c15906104b0611d1f565b421015610c645760405162461bcd60e51b815260206004820181905260248201527f43616e206f6e6c7920726564756365206166746572203230206d696e7574657360448201526064016106ce565b600b548110610cab5760405162461bcd60e51b8152602060048201526013602482015272086c2dcdcdee840d2dcc6e4cac2e6ca40e8c2f606b1b60448201526064016106ce565b610190811115610cf05760405162461bcd60e51b815260206004820152601060248201526f43616e6e6f742065786365656420342560801b60448201526064016106ce565b600b819055604080518281524260208201527ff453724d017bc8b1715852eaf72a7612c4b6de3274345de3ad4462959864311f910160405180910390a150565b6001600160a01b038116610d765760405162461bcd60e51b815260206004820152600d60248201526c05472656173757279206973203609c1b60448201526064016106ce565b336001600160a01b037f000000000000000000000000d569372a5c654ef55cf8e0e0b6240497fe1641d81614610dde5760405162461bcd60e51b815260206004820152600d60248201526c27b7363c903232b83637bcb2b960991b60448201526064016106ce565b600780546001600160a01b038381166001600160a01b031983168117909355165f818152600c60208181526040808420805460ff19908116909155600d80845282862080548316905587865293835281852080548216600190811790915593909252808420805490921690921790555191929183917f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a91a35050565b610e82610eb7565b6001600160a01b038116610eab57604051631e4fbdf760e01b81525f60048201526024016106ce565b610eb4816114de565b50565b6005546001600160a01b031633146108e35760405163118cdaa760e01b81523360048201526024016106ce565b6107d0838383600161152f565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811015610f675781811015610f5957604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016106ce565b610f6784848484035f61152f565b50505050565b6001600160a01b038316610f9657604051634b637e8f60e11b81525f60048201526024016106ce565b6001600160a01b038216610fbf5760405163ec442f0560e01b81525f60048201526024016106ce565b6107d0838383611601565b610fd26119c6565b5f60095442610fe19190611d32565b305f908152602081905260408120549192508190036110015750506112ba565b5f6101e083101561101b5750671bc16d674ec8000061103f565b6102d083101561103457506714d1120d7b16000061103f565b50670de0b6b3a76400005b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061107257611072611d59565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106110c6576110c6611d59565b6001600160a01b03909216602092830291909101909101526040516307c0329d60e21b81525f90737a250d5630b4cf539739df2c5dacb4c659f2488d90631f00ca74906111199086908690600401611db0565b5f60405180830381865afa92505050801561115557506040513d5f823e601f3d908101601f191682016040526111529190810190611dd0565b60015b61116057508261117e565b805f8151811061117257611172611d59565b60200260200101519150505b8084111561118a578093505b5f6111b76127107f00000000000000000000000000000000000000000000d3c21bcecceda1000000611e98565b9050808510156111cc575050505050506112ba565b600a805460ff1916600117905560075460405163791ac94760e01b81526001600160a01b03909116803191737a250d5630b4cf539739df2c5dacb4c659f2488d9163791ac94791611227918a915f918a914290600401611eb7565b5f604051808303815f87803b15801561123e575f5ffd5b505af1158015611250573d5f5f3e3d5ffd5b5050600754600a805460ff191690556001600160a01b03163191507ff5b1caace4f27dc52b88770c86bd438f840e96d6503b0116e9f183d838320f3e9050876112998484611d32565b6040805192835260208301919091520160405180910390a150505050505050505b6108e36001600655565b6112cc610eb7565b6108e35f6114de565b5f5f6009545f036112e857505f91829150565b5f600954426112f79190611d32565b9050607881101561134657610dac92506127106113357f00000000000000000000000000000000000000000000d3c21bcecceda1000000600a611ef2565b61133f9190611e98565b9150509091565b60f081101561138257610bb892506127106113357f00000000000000000000000000000000000000000000d3c21bcecceda1000000600f611ef2565b6101688110156113bf576109c492506127106113357f00000000000000000000000000000000000000000000d3c21bcecceda10000006014611ef2565b6101e08110156113fc576107d092506127106113357f00000000000000000000000000000000000000000000d3c21bcecceda10000006019611ef2565b6102d0811015611439576105dc92506127106113357f00000000000000000000000000000000000000000000d3c21bcecceda1000000601e611ef2565b6103c0811015611476576103e892506127106113357f00000000000000000000000000000000000000000000d3c21bcecceda10000006023611ef2565b6104b08110156114b3576102bc92506127106113357f00000000000000000000000000000000000000000000d3c21bcecceda10000006028611ef2565b5050600b54917f00000000000000000000000000000000000000000000d3c21bcecceda10000009150565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0384166115585760405163e602df0560e01b81525f60048201526024016106ce565b6001600160a01b03831661158157604051634a1406b160e11b81525f60048201526024016106ce565b6001600160a01b038085165f9081526001602090815260408083209387168352929052208290558015610f6757826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516115f391815260200190565b60405180910390a350505050565b600a5460ff1615611617576107d0838383611a1f565b5f5f6116216112d5565b90925090506001600160a01b038581167f00000000000000000000000034a2a52f265042bbc91e524386a4fcaacf36a6f582169081149186161481806116645750805b15611919575f600854118061169057506001600160a01b0386165f908152600c602052604090205460ff165b6116d25760405162461bcd60e51b8152602060048201526013602482015272151c98591a5b99c81b9bdd08195b98589b1959606a1b60448201526064016106ce565b83156118e7578180156116fd57506001600160a01b0386165f908152600c602052604090205460ff16155b1561187d575f600954118015611720575060b46009544261171e9190611d32565b105b1561184a57600f54325f908152600e60209081526040808320438452909152902054106117a15760405162461bcd60e51b815260206004820152602960248201527f4d617820627579207478732070657220626c6f636b20706572206f726967696e60448201526808195e18d95959195960ba1b60648201526084016106ce565b325f908152600e6020908152604080832043845290915281208054916117c683611f09565b9091555050601154435f908152601060205260409020541061182a5760405162461bcd60e51b815260206004820152601e60248201527f4d617820627579207478732070657220626c6f636b206578636565646564000060448201526064016106ce565b435f90815260106020526040812080549161184483611f09565b91905055505b5f6127106118588688611ef2565b6118629190611e98565b905061186e8187611d32565b955061187b883083611a1f565b505b8080156118a257506001600160a01b0387165f908152600c602052604090205460ff16155b156118e2575f6127106118b58688611ef2565b6118bf9190611e98565b90506118cb8187611d32565b95506118d8883083611a1f565b6118e0610fca565b505b611919565b80801561190c57506001600160a01b0387165f908152600c602052604090205460ff16155b1561191957611919610fca565b6001600160a01b0386165f908152600d602052604090205460ff1680611966575082611959876001600160a01b03165f9081526020819052604090205490565b6119639087611d1f565b11155b6119b25760405162461bcd60e51b815260206004820152601860248201527f4d61782077616c6c65742073697a65206578636565646564000000000000000060448201526064016106ce565b6119bd878787611a1f565b50505050505050565b600260065403611a185760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ce565b6002600655565b6001600160a01b038316611a49578060025f828254611a3e9190611d1f565b90915550611ab99050565b6001600160a01b0383165f9081526020819052604090205481811015611a9b5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016106ce565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611ad557600280548290039055611af3565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b3891815260200190565b60405180910390a3505050565b80356001600160a01b0381168114611b5b575f5ffd5b919050565b5f60208284031215611b70575f5ffd5b611b7982611b45565b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215611bc6575f5ffd5b611bcf83611b45565b946020939093013593505050565b5f60208284031215611bed575f5ffd5b5035919050565b5f5f5f60608486031215611c06575f5ffd5b611c0f84611b45565b9250611c1d60208501611b45565b929592945050506040919091013590565b8015158114610eb4575f5ffd5b5f5f60408385031215611c4c575f5ffd5b611c5583611b45565b91506020830135611c6581611c2e565b809150509250929050565b5f5f60408385031215611c81575f5ffd5b611c8a83611b45565b9150611c9860208401611b45565b90509250929050565b5f60208284031215611cb1575f5ffd5b5051919050565b5f60208284031215611cc8575f5ffd5b8151611b7981611c2e565b600181811c90821680611ce757607f821691505b602082108103611d0557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561087857610878611d0b565b8181038181111561087857610878611d0b565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8151808452602084019350602083015f5b82811015611da65781516001600160a01b0316865260209586019590910190600101611d7f565b5093949350505050565b828152604060208201525f611dc86040830184611d6d565b949350505050565b5f60208284031215611de0575f5ffd5b815167ffffffffffffffff811115611df6575f5ffd5b8201601f81018413611e06575f5ffd5b805167ffffffffffffffff811115611e2057611e20611d45565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715611e4d57611e4d611d45565b604052918252602081840181019290810187841115611e6a575f5ffd5b6020850194505b83851015611e8d57845180825260209586019590935001611e71565b509695505050505050565b5f82611eb257634e487b7160e01b5f52601260045260245ffd5b500490565b85815284602082015260a060408201525f611ed560a0830186611d6d565b6001600160a01b0394909416606083015250608001529392505050565b808202811582820484141761087857610878611d0b565b5f60018201611f1a57611f1a611d0b565b506001019056fea2646970667358221220264591c85c780591cc0ed4261b64b53a73fbbf222d85df4d28b27422ebed9f0764736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000d3c21bcecceda1000000000000000000000000000000aa25cd227afdc940156cee3d0f2e0a829c33fab6000000000000000000000000d569372a5c654ef55cf8e0e0b6240497fe1641d8000000000000000000000000000000000000000000000000000000000000000c457468657265756d204d445200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004654d445200000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Ethereum MDR
Arg [1] : symbol (string): eMDR
Arg [2] : maxSupply (uint256): 1000000000000000000000000
Arg [3] : _treasury (address): 0xAA25Cd227afdC940156ceE3D0f2E0A829c33FAB6
Arg [4] : _realDeployer (address): 0xD569372A5c654Ef55cF8e0E0B6240497FE1641D8

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 00000000000000000000000000000000000000000000d3c21bcecceda1000000
Arg [3] : 000000000000000000000000aa25cd227afdc940156cee3d0f2e0a829c33fab6
Arg [4] : 000000000000000000000000d569372a5c654ef55cf8e0e0b6240497fe1641d8
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [6] : 457468657265756d204d44520000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 654d445200000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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