ETH Price: $3,495.29 (+2.18%)
Gas: 3 Gwei

Token

NAMEHASH (VITALIK.ETH)
 

Overview

Max Total Supply

120,000,000 VITALIK.ETH

Holders

69

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NAMEHASH

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-06
*/

// SPDX-License-Identifier: MIT
pragma solidity =0.8.23;

// https://t.me/namehashvitalik
// https://twitter.com/NamehashVitalik
// https://namehash.ca
// Vitalik.eth pk: ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

    /**
     * @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 Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}

/**
 * @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}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * 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 ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these 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 override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 value {ERC20} uses, unless this function is
     * 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 override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

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

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }


    /**
     * @dev Sets `amount` 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.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

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

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

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

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

    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Pair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    
    function sync() external;
}

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

    bool private isSwapping;

    IUniswapV2Router02 public immutable uniswapV2Router;
    IUniswapV2Pair public immutable uniswapV2Pair;

    address public constant deadAddress = address(0xdead); // if holders decide to burn tokens

    bool public limitsInEffect = true;
    bool public tradingEnabled = false;

    address public taxReceiverWallet = 0x6f21349fcA4A501Fa57c389814c675b37c9C091E;

    uint256 public maxWalletBalance;
    uint256 public maxTransactionAmount;
    uint256 public swapTaxThreshold;

    uint256 public buyFee;
    uint256 public sellFee;

    mapping(address => bool) public excludedFromFee;
    mapping(address => bool) public excludedFromMaxTx;

    bytes32 public DOMAIN_SEPARATOR;
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint) public nonces;

    event ExcludedFromFee(address indexed account, bool isExcluded);
    event ExcludedFromMaxTx(address indexed account, bool isExcluded);
    event TaxDistributed(uint256 tax);

    constructor() ERC20("NAMEHASH", "VITALIK.ETH") {
        uint256 totalSupply = 120_000_000 * 1e18;

        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Pair = IUniswapV2Pair(IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()));

        // buy tax
        buyFee = 30;

        // sell tax
        sellFee = 30;

        maxWalletBalance = (totalSupply * 2) / 100; // 2% from total supply max wallet balance
        maxTransactionAmount = (totalSupply * 2) / 100; // 2% from total supply max transaction amount
        swapTaxThreshold = (totalSupply * 100) / 10000; // 1% from total supply for exchange tax tokens to ETH

        // exclude from paying fee and max wallet
        excludeFromFee(taxReceiverWallet, true);
        excludeFromFee(address(this), true);
        excludeFromFee(deadAddress, true);

        // exclude from max transaction amount
        excludeFromMaxTx(taxReceiverWallet, true);
        excludeFromMaxTx(address(this), true);
        excludeFromMaxTx(deadAddress, true);

        // contract owns total supply
        super._mint(address(this), totalSupply);

        // ERC-2612: Permit Extension for EIP-20 Signed Approvals
        uint chainId;
        assembly {
            chainId := chainid()
        }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes(name())),
                keccak256(bytes('1')),
                chainId,
                address(this)
            )
        );
    }

    // pool initialization
    function addLiquidity() external payable onlyOwner {
        require(msg.value >= 1e18, "minimum ETH for liquidity is not provided"); // 1 ETH
        super._approve(address(this), address(uniswapV2Router), totalSupply());
        isSwapping = true;
        uniswapV2Router.addLiquidityETH{value: msg.value}(address(this), totalSupply(), 0, 0, address(this), block.timestamp);
        isSwapping = false;
        _transferOwnership(taxReceiverWallet);
    }

    function burnLiquidity() external payable onlyOwner {
        uint256 balance = IERC20(address(uniswapV2Pair)).balanceOf(address(this));
        IERC20(address(uniswapV2Pair)).transfer(deadAddress, balance);
    }

    // allows the contract to receive ETH
    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingEnabled = true;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner {
        limitsInEffect = false;
    }

    // change the tax receiver wallet
    function updateTaxReceiverWallet(address newAddr) external onlyOwner
    {
        taxReceiverWallet = newAddr;
    }

    // change the maximum amount of tokens a wallet could receive
    function updateMaxWalletBalance(uint256 percent) external onlyOwner {
        maxWalletBalance = (totalSupply() * percent) / 100;
    }

    // change the maximum amount of tokens a transaction could transfer
    function updateMaxTransactionAmount(uint256 percent) external onlyOwner {
        maxTransactionAmount = (totalSupply() * percent) / 100;
    }

    // 100 means 1%
    function updateSwapTaxThreshold(uint256 percent) external onlyOwner {
        swapTaxThreshold = (totalSupply() * percent) / 10000;
    }

    function updateBuyFee(uint256 fee) external onlyOwner {
        buyFee = fee;
    }

    function updateSellFee(uint256 fee) external onlyOwner {
        sellFee = fee;
    }

    function excludeFromFee(address account, bool excluded) public onlyOwner {
        excludedFromFee[account] = excluded;
        emit ExcludedFromFee(account, excluded);
    }

    function excludeFromMaxTx(address account, bool excluded) public onlyOwner {
        excludedFromMaxTx[account] = excluded;
        emit ExcludedFromMaxTx(account, excluded);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (isSwapping || amount == 0) {
            super._transfer(from, to, amount);
            return;
        }

        bool isFeeExcluded = excludedFromFee[from] || excludedFromFee[to];
        if (limitsInEffect) {
            if (!tradingEnabled) {
                require(isFeeExcluded, "trading is not active");
            }

            if (!isFeeExcluded && to != address(uniswapV2Pair)) {
                require(balanceOf(to) + amount <= maxWalletBalance, "max wallet balance exceeded");
            }

            bool isMaxTxExcluded = excludedFromMaxTx[from] || excludedFromMaxTx[to];
            if (!isMaxTxExcluded && to != address(uniswapV2Pair)) {
                require(amount <= maxTransactionAmount, "max transaction amount exceeded");
            }
        }
        
        // if any account belongs to excludedFromFee account then remove the fee
        bool takeFee = isFeeExcluded ? false : true;

        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            uint256 fee = 0;
            // on sell
            if (to == address(uniswapV2Pair) && sellFee > 0) {
                fee = amount.mul(sellFee).div(100);
            }
            // on buy
            else if (from == address(uniswapV2Pair) && buyFee > 0) {
                fee = amount.mul(buyFee).div(100);
            }

            if (fee > 0) {
                super._transfer(from, address(this), fee);
            }

            if (balanceOf(address(this)) >= swapTaxThreshold && to == address(uniswapV2Pair)) {
                uint256 ethReceived = swapTokensForETH(swapTaxThreshold, address(this));

                (bool success, ) = taxReceiverWallet.call{value: ethReceived}("");
                require (success, "transfer to tax receiver wallet failed");
                
                emit TaxDistributed(ethReceived);
            }

            amount -= fee;
        }

        super._transfer(from, to, amount);
    }

    function swapTokensForETH(uint256 amount, address to) internal returns (uint256) {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        super._approve(address(this), address(uniswapV2Router), amount);
        
        isSwapping = true;
        uint256 beforeBalance = to.balance;
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            to,
            block.timestamp
        );
        uint256 afterBalance = to.balance;
        uint256 ethValue = afterBalance.sub(beforeBalance);
        isSwapping = false;

        return ethValue;
    }

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        require(deadline >= block.timestamp, 'UniswapV2: EXPIRED');
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'UniswapV2: INVALID_SIGNATURE');
        super._approve(owner, spender, value);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTx","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":"tax","type":"uint256"}],"name":"TaxDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTaxThreshold","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":"taxReceiverWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"updateMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"updateMaxWalletBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"updateSwapTaxThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddr","type":"address"}],"name":"updateTaxReceiverWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526005805461ffff60a81b1916600160a81b179055600680546001600160a01b031916736f21349fca4a501fa57c389814c675b37c9c091e1790553480156200004a575f80fd5b506040518060400160405280600881526020016709c829a8a9082a6960c31b8152506040518060400160405280600b81526020016a0ac92a8829892965c8aa8960ab1b8152508160039081620000a1919062000794565b506004620000b0828262000794565b505050620000cd620000c7620003d460201b60201c565b620003d8565b737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526040805163c45a015560e01b815290516a6342fd08f00f6378000000929163c45a01559160048083019260209291908290030181865afa1580156200012e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000154919062000860565b6001600160a01b031663c9c65396306080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001c8919062000860565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af115801562000213573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000239919062000860565b6001600160a01b031660a052601e600a819055600b5560646200025e826002620008a3565b6200026a9190620008c3565b60075560646200027c826002620008a3565b620002889190620008c3565b6008556127106200029b826064620008a3565b620002a79190620008c3565b600955600654620002c3906001600160a01b0316600162000429565b620002d030600162000429565b620002df61dead600162000429565b600654620002f8906001600160a01b03166001620004d6565b62000305306001620004d6565b6200031461dead6001620004d6565b62000320308262000578565b467f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6200034c6200065a565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c00160405160208183030381529060405280519060200120600e819055505050620008f9565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6005546001600160a01b03163314620004775760405162461bcd60e51b815260206004820181905260248201525f805160206200299583398151915260448201526064015b60405180910390fd5b6001600160a01b0382165f818152600c6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa991015b60405180910390a25050565b6005546001600160a01b03163314620005205760405162461bcd60e51b815260206004820181905260248201525f805160206200299583398151915260448201526064016200046e565b6001600160a01b0382165f818152600d6020908152604091829020805460ff191685151590811790915591519182527f77a0fec448da1c340eddbf781d9ff0520a78d5a35fd142eaaec4e04a81157a0f9101620004ca565b6001600160a01b038216620005d05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200046e565b8060025f828254620005e39190620008e3565b90915550506001600160a01b0382165f908152602081905260408120805483929062000611908490620008e3565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6060600380546200066b906200070b565b80601f016020809104026020016040519081016040528092919081815260200182805462000699906200070b565b8015620006e85780601f10620006be57610100808354040283529160200191620006e8565b820191905f5260205f20905b815481529060010190602001808311620006ca57829003601f168201915b5050505050905090565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200072057607f821691505b6020821081036200073f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620006f257805f5260205f20601f840160051c810160208510156200076c5750805b601f840160051c820191505b818110156200078d575f815560010162000778565b5050505050565b81516001600160401b03811115620007b057620007b0620006f7565b620007c881620007c184546200070b565b8462000745565b602080601f831160018114620007fe575f8415620007e65750858301515b5f19600386901b1c1916600185901b17855562000858565b5f85815260208120601f198616915b828110156200082e578886015182559484019460019091019084016200080d565b50858210156200084c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121562000871575f80fd5b81516001600160a01b038116811462000888575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417620008bd57620008bd6200088f565b92915050565b5f82620008de57634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115620008bd57620008bd6200088f565b60805160a0516120266200096f5f395f818161045e01528181610e0701528181610e99015281816113eb015281816114e901528181611591015281816115ff015261168f01525f81816102b60152818161102a0152818161107401528181611a7301528181611b2a0152611b7e01526120265ff3fe608060405260043610610241575f3560e01c8063715018a611610134578063c53a3604116100b3578063da942cbf11610078578063da942cbf146106cc578063dd62ed3e146106d4578063df8408fe14610718578063e8078d9414610737578063ed0634091461073f578063f2fde38b14610754575f80fd5b8063c53a36041461063b578063c8c8ebe41461065a578063c9ca9bdb1461066f578063d4c989d31461068e578063d505accf146106ad575f80fd5b80638da5cb5b116100f95780638da5cb5b146105b757806395d89b41146105d4578063a9059cbb146105e8578063aa49802314610607578063bbde77c114610626575f80fd5b8063715018a614610522578063751039fc146105365780637ecebe001461054a57806385ecafd7146105755780638a8c523c146105a3575f80fd5b8063313ce567116101c057806349bd5a5e1161018557806349bd5a5e1461044d5780634a62bb65146104805780634ada218b146104a057806354f9c98c146104c057806370a08231146104ee575f80fd5b8063313ce567146103ca5780633644e515146103e55780633f4c87bb146103fa578063467abe0a146104195780634706240214610438575f80fd5b80631d933a4a116102065780631d933a4a1461032f57806323b872dd1461034e57806327c8f8351461036d5780632b14ca561461038257806330adf81f14610397575f80fd5b806306fdde031461024c578063095ea7b3146102765780631694505e146102a557806318160ddd146102f0578063188b1bf11461030e575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b50610260610773565b60405161026d9190611c23565b60405180910390f35b348015610281575f80fd5b50610295610290366004611c83565b610803565b604051901515815260200161026d565b3480156102b0575f80fd5b506102d87f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161026d565b3480156102fb575f80fd5b506002545b60405190815260200161026d565b348015610319575f80fd5b5061032d610328366004611cad565b610819565b005b34801561033a575f80fd5b5061032d610349366004611cad565b610872565b348015610359575f80fd5b50610295610368366004611cc4565b6108a1565b348015610378575f80fd5b506102d861dead81565b34801561038d575f80fd5b50610300600b5481565b3480156103a2575f80fd5b506103007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156103d5575f80fd5b506040516012815260200161026d565b3480156103f0575f80fd5b50610300600e5481565b348015610405575f80fd5b506006546102d8906001600160a01b031681565b348015610424575f80fd5b5061032d610433366004611cad565b610949565b348015610443575f80fd5b50610300600a5481565b348015610458575f80fd5b506102d87f000000000000000000000000000000000000000000000000000000000000000081565b34801561048b575f80fd5b5060055461029590600160a81b900460ff1681565b3480156104ab575f80fd5b5060055461029590600160b01b900460ff1681565b3480156104cb575f80fd5b506102956104da366004611d02565b600d6020525f908152604090205460ff1681565b3480156104f9575f80fd5b50610300610508366004611d02565b6001600160a01b03165f9081526020819052604090205490565b34801561052d575f80fd5b5061032d610978565b348015610541575f80fd5b5061032d6109ad565b348015610555575f80fd5b50610300610564366004611d02565b600f6020525f908152604090205481565b348015610580575f80fd5b5061029561058f366004611d02565b600c6020525f908152604090205460ff1681565b3480156105ae575f80fd5b5061032d6109e6565b3480156105c2575f80fd5b506005546001600160a01b03166102d8565b3480156105df575f80fd5b50610260610a25565b3480156105f3575f80fd5b50610295610602366004611c83565b610a34565b348015610612575f80fd5b5061032d610621366004611cad565b610a40565b348015610631575f80fd5b5061030060075481565b348015610646575f80fd5b5061032d610655366004611d02565b610a90565b348015610665575f80fd5b5061030060085481565b34801561067a575f80fd5b5061032d610689366004611cad565b610adc565b348015610699575f80fd5b5061032d6106a8366004611d2a565b610b2d565b3480156106b8575f80fd5b5061032d6106c7366004611d61565b610bb6565b61032d610dc6565b3480156106df575f80fd5b506103006106ee366004611dd2565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610723575f80fd5b5061032d610732366004611d2a565b610f0f565b61032d610f90565b34801561074a575f80fd5b5061030060095481565b34801561075f575f80fd5b5061032d61076e366004611d02565b61114f565b60606003805461078290611dfe565b80601f01602080910402602001604051908101604052809291908181526020018280546107ae90611dfe565b80156107f95780601f106107d0576101008083540402835291602001916107f9565b820191905f5260205f20905b8154815290600101906020018083116107dc57829003601f168201915b5050505050905090565b5f61080f3384846111ea565b5060015b92915050565b6005546001600160a01b0316331461084c5760405162461bcd60e51b815260040161084390611e36565b60405180910390fd5b60648161085860025490565b6108629190611e7f565b61086c9190611e96565b60075550565b6005546001600160a01b0316331461089c5760405162461bcd60e51b815260040161084390611e36565b600b55565b5f6108ad84848461130d565b6001600160a01b0384165f908152600160209081526040808320338452909152902054828110156109315760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610843565b61093e85338584036111ea565b506001949350505050565b6005546001600160a01b031633146109735760405162461bcd60e51b815260040161084390611e36565b600a55565b6005546001600160a01b031633146109a25760405162461bcd60e51b815260040161084390611e36565b6109ab5f6117df565b565b6005546001600160a01b031633146109d75760405162461bcd60e51b815260040161084390611e36565b6005805460ff60a81b19169055565b6005546001600160a01b03163314610a105760405162461bcd60e51b815260040161084390611e36565b6005805460ff60b01b1916600160b01b179055565b60606004805461078290611dfe565b5f61080f33848461130d565b6005546001600160a01b03163314610a6a5760405162461bcd60e51b815260040161084390611e36565b606481610a7660025490565b610a809190611e7f565b610a8a9190611e96565b60085550565b6005546001600160a01b03163314610aba5760405162461bcd60e51b815260040161084390611e36565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610b065760405162461bcd60e51b815260040161084390611e36565b61271081610b1360025490565b610b1d9190611e7f565b610b279190611e96565b60095550565b6005546001600160a01b03163314610b575760405162461bcd60e51b815260040161084390611e36565b6001600160a01b0382165f818152600d6020908152604091829020805460ff191685151590811790915591519182527f77a0fec448da1c340eddbf781d9ff0520a78d5a35fd142eaaec4e04a81157a0f91015b60405180910390a25050565b42841015610bfb5760405162461bcd60e51b8152602060048201526012602482015271155b9a5cddd85c158c8e881156141254915160721b6044820152606401610843565b600e546001600160a01b0388165f908152600f6020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087610c4d83611eb5565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610cc692919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f80855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610d2e573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610d645750886001600160a01b0316816001600160a01b0316145b610db05760405162461bcd60e51b815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e4154555245000000006044820152606401610843565b610dbb8989896111ea565b505050505050505050565b6005546001600160a01b03163314610df05760405162461bcd60e51b815260040161084390611e36565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610e54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e789190611ecd565b60405163a9059cbb60e01b815261dead6004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015610ee7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0b9190611ee4565b5050565b6005546001600160a01b03163314610f395760405162461bcd60e51b815260040161084390611e36565b6001600160a01b0382165f818152600c6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa99101610baa565b6005546001600160a01b03163314610fba5760405162461bcd60e51b815260040161084390611e36565b670de0b6b3a76400003410156110245760405162461bcd60e51b815260206004820152602960248201527f6d696e696d756d2045544820666f72206c6971756964697479206973206e6f74604482015268081c1c9bdd9a59195960ba1b6064820152608401610843565b611057307f000000000000000000000000000000000000000000000000000000000000000061105260025490565b6111ea565b6005805460ff60a01b1916600160a01b1790556001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663f305d71934306110a460025490565b6040516001600160e01b031960e086901b1681526001600160a01b03909216600483015260248201525f6044820181905260648201523060848201524260a482015260c40160606040518083038185885af1158015611105573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061112a9190611eff565b50506005805460ff60a01b19169055506006546109ab906001600160a01b03166117df565b6005546001600160a01b031633146111795760405162461bcd60e51b815260040161084390611e36565b6001600160a01b0381166111de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610843565b6111e7816117df565b50565b6001600160a01b03831661124c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610843565b6001600160a01b0382166112ad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610843565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600554600160a01b900460ff1680611323575080155b1561133857611333838383611830565b505050565b6001600160a01b0383165f908152600c602052604081205460ff168061137557506001600160a01b0383165f908152600c602052604090205460ff165b600554909150600160a81b900460ff161561157757600554600160b01b900460ff166113e057806113e05760405162461bcd60e51b815260206004820152601560248201527474726164696e67206973206e6f742061637469766560581b6044820152606401610843565b8015801561142057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b1561149f5760075482611447856001600160a01b03165f9081526020819052604090205490565b6114519190611f2a565b111561149f5760405162461bcd60e51b815260206004820152601b60248201527f6d61782077616c6c65742062616c616e636520657863656564656400000000006044820152606401610843565b6001600160a01b0384165f908152600d602052604081205460ff16806114dc57506001600160a01b0384165f908152600d602052604090205460ff165b90508015801561151e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614155b15611575576008548311156115755760405162461bcd60e51b815260206004820152601f60248201527f6d6178207472616e73616374696f6e20616d6f756e74206578636565646564006044820152606401610843565b505b5f81611584576001611586565b5f5b905080156117cd575f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b03161480156115d157505f600b54115b156115fd576115f660646115f0600b54876119fd90919063ffffffff16565b90611a0f565b9050611661565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614801561163f57505f600a54115b156116615761165e60646115f0600a54876119fd90919063ffffffff16565b90505b801561167257611672863083611830565b600954305f90815260208190526040902054101580156116c357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316145b156117bf575f6116d560095430611a1a565b6006546040519192505f916001600160a01b039091169083908381818185875af1925050503d805f8114611724576040519150601f19603f3d011682016040523d82523d5f602084013e611729565b606091505b50509050806117895760405162461bcd60e51b815260206004820152602660248201527f7472616e7366657220746f207461782072656365697665722077616c6c65742060448201526519985a5b195960d21b6064820152608401610843565b6040518281527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a150505b6117c98185611f3d565b9350505b6117d8858585611830565b5050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0383166118945760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610843565b6001600160a01b0382166118f65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610843565b6001600160a01b0383165f908152602081905260409020548181101561196d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610843565b6001600160a01b038085165f908152602081905260408082208585039055918516815290812080548492906119a3908490611f2a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119ef91815260200190565b60405180910390a350505050565b5f611a088284611e7f565b9392505050565b5f611a088284611e96565b6040805160028082526060820183525f928392919060208301908036833701905050905030815f81518110611a5157611a51611f50565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611acd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af19190611f64565b81600181518110611b0457611b04611f50565b60200260200101906001600160a01b031690816001600160a01b031681525050611b4f307f0000000000000000000000000000000000000000000000000000000000000000866111ea565b6005805460ff60a01b1916600160a01b17905560405163791ac94760e01b81526001600160a01b0380851631917f00000000000000000000000000000000000000000000000000000000000000009091169063791ac94790611bbd9088905f9087908a904290600401611f7f565b5f604051808303815f87803b158015611bd4575f80fd5b505af1158015611be6573d5f803e3d5ffd5b505050506001600160a01b038416315f611c008284611c18565b6005805460ff60a01b19169055979650505050505050565b5f611a088284611f3d565b5f602080835283518060208501525f5b81811015611c4f57858101830151858201604001528201611c33565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146111e7575f80fd5b5f8060408385031215611c94575f80fd5b8235611c9f81611c6f565b946020939093013593505050565b5f60208284031215611cbd575f80fd5b5035919050565b5f805f60608486031215611cd6575f80fd5b8335611ce181611c6f565b92506020840135611cf181611c6f565b929592945050506040919091013590565b5f60208284031215611d12575f80fd5b8135611a0881611c6f565b80151581146111e7575f80fd5b5f8060408385031215611d3b575f80fd5b8235611d4681611c6f565b91506020830135611d5681611d1d565b809150509250929050565b5f805f805f805f60e0888a031215611d77575f80fd5b8735611d8281611c6f565b96506020880135611d9281611c6f565b95506040880135945060608801359350608088013560ff81168114611db5575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611de3575f80fd5b8235611dee81611c6f565b91506020830135611d5681611c6f565b600181811c90821680611e1257607f821691505b602082108103611e3057634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761081357610813611e6b565b5f82611eb057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201611ec657611ec6611e6b565b5060010190565b5f60208284031215611edd575f80fd5b5051919050565b5f60208284031215611ef4575f80fd5b8151611a0881611d1d565b5f805f60608486031215611f11575f80fd5b8351925060208401519150604084015190509250925092565b8082018082111561081357610813611e6b565b8181038181111561081357610813611e6b565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611f74575f80fd5b8151611a0881611c6f565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015611fcf5784516001600160a01b031683529383019391830191600101611faa565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220b540eb4bc3b008aed15aab0294c6348bc4a667610427b3d4f50b3e18cd675c1064736f6c634300081700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x608060405260043610610241575f3560e01c8063715018a611610134578063c53a3604116100b3578063da942cbf11610078578063da942cbf146106cc578063dd62ed3e146106d4578063df8408fe14610718578063e8078d9414610737578063ed0634091461073f578063f2fde38b14610754575f80fd5b8063c53a36041461063b578063c8c8ebe41461065a578063c9ca9bdb1461066f578063d4c989d31461068e578063d505accf146106ad575f80fd5b80638da5cb5b116100f95780638da5cb5b146105b757806395d89b41146105d4578063a9059cbb146105e8578063aa49802314610607578063bbde77c114610626575f80fd5b8063715018a614610522578063751039fc146105365780637ecebe001461054a57806385ecafd7146105755780638a8c523c146105a3575f80fd5b8063313ce567116101c057806349bd5a5e1161018557806349bd5a5e1461044d5780634a62bb65146104805780634ada218b146104a057806354f9c98c146104c057806370a08231146104ee575f80fd5b8063313ce567146103ca5780633644e515146103e55780633f4c87bb146103fa578063467abe0a146104195780634706240214610438575f80fd5b80631d933a4a116102065780631d933a4a1461032f57806323b872dd1461034e57806327c8f8351461036d5780632b14ca561461038257806330adf81f14610397575f80fd5b806306fdde031461024c578063095ea7b3146102765780631694505e146102a557806318160ddd146102f0578063188b1bf11461030e575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b50610260610773565b60405161026d9190611c23565b60405180910390f35b348015610281575f80fd5b50610295610290366004611c83565b610803565b604051901515815260200161026d565b3480156102b0575f80fd5b506102d87f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161026d565b3480156102fb575f80fd5b506002545b60405190815260200161026d565b348015610319575f80fd5b5061032d610328366004611cad565b610819565b005b34801561033a575f80fd5b5061032d610349366004611cad565b610872565b348015610359575f80fd5b50610295610368366004611cc4565b6108a1565b348015610378575f80fd5b506102d861dead81565b34801561038d575f80fd5b50610300600b5481565b3480156103a2575f80fd5b506103007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156103d5575f80fd5b506040516012815260200161026d565b3480156103f0575f80fd5b50610300600e5481565b348015610405575f80fd5b506006546102d8906001600160a01b031681565b348015610424575f80fd5b5061032d610433366004611cad565b610949565b348015610443575f80fd5b50610300600a5481565b348015610458575f80fd5b506102d87f000000000000000000000000b260a1da2c508427d0ce43fbebedf056a346ccb581565b34801561048b575f80fd5b5060055461029590600160a81b900460ff1681565b3480156104ab575f80fd5b5060055461029590600160b01b900460ff1681565b3480156104cb575f80fd5b506102956104da366004611d02565b600d6020525f908152604090205460ff1681565b3480156104f9575f80fd5b50610300610508366004611d02565b6001600160a01b03165f9081526020819052604090205490565b34801561052d575f80fd5b5061032d610978565b348015610541575f80fd5b5061032d6109ad565b348015610555575f80fd5b50610300610564366004611d02565b600f6020525f908152604090205481565b348015610580575f80fd5b5061029561058f366004611d02565b600c6020525f908152604090205460ff1681565b3480156105ae575f80fd5b5061032d6109e6565b3480156105c2575f80fd5b506005546001600160a01b03166102d8565b3480156105df575f80fd5b50610260610a25565b3480156105f3575f80fd5b50610295610602366004611c83565b610a34565b348015610612575f80fd5b5061032d610621366004611cad565b610a40565b348015610631575f80fd5b5061030060075481565b348015610646575f80fd5b5061032d610655366004611d02565b610a90565b348015610665575f80fd5b5061030060085481565b34801561067a575f80fd5b5061032d610689366004611cad565b610adc565b348015610699575f80fd5b5061032d6106a8366004611d2a565b610b2d565b3480156106b8575f80fd5b5061032d6106c7366004611d61565b610bb6565b61032d610dc6565b3480156106df575f80fd5b506103006106ee366004611dd2565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610723575f80fd5b5061032d610732366004611d2a565b610f0f565b61032d610f90565b34801561074a575f80fd5b5061030060095481565b34801561075f575f80fd5b5061032d61076e366004611d02565b61114f565b60606003805461078290611dfe565b80601f01602080910402602001604051908101604052809291908181526020018280546107ae90611dfe565b80156107f95780601f106107d0576101008083540402835291602001916107f9565b820191905f5260205f20905b8154815290600101906020018083116107dc57829003601f168201915b5050505050905090565b5f61080f3384846111ea565b5060015b92915050565b6005546001600160a01b0316331461084c5760405162461bcd60e51b815260040161084390611e36565b60405180910390fd5b60648161085860025490565b6108629190611e7f565b61086c9190611e96565b60075550565b6005546001600160a01b0316331461089c5760405162461bcd60e51b815260040161084390611e36565b600b55565b5f6108ad84848461130d565b6001600160a01b0384165f908152600160209081526040808320338452909152902054828110156109315760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610843565b61093e85338584036111ea565b506001949350505050565b6005546001600160a01b031633146109735760405162461bcd60e51b815260040161084390611e36565b600a55565b6005546001600160a01b031633146109a25760405162461bcd60e51b815260040161084390611e36565b6109ab5f6117df565b565b6005546001600160a01b031633146109d75760405162461bcd60e51b815260040161084390611e36565b6005805460ff60a81b19169055565b6005546001600160a01b03163314610a105760405162461bcd60e51b815260040161084390611e36565b6005805460ff60b01b1916600160b01b179055565b60606004805461078290611dfe565b5f61080f33848461130d565b6005546001600160a01b03163314610a6a5760405162461bcd60e51b815260040161084390611e36565b606481610a7660025490565b610a809190611e7f565b610a8a9190611e96565b60085550565b6005546001600160a01b03163314610aba5760405162461bcd60e51b815260040161084390611e36565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610b065760405162461bcd60e51b815260040161084390611e36565b61271081610b1360025490565b610b1d9190611e7f565b610b279190611e96565b60095550565b6005546001600160a01b03163314610b575760405162461bcd60e51b815260040161084390611e36565b6001600160a01b0382165f818152600d6020908152604091829020805460ff191685151590811790915591519182527f77a0fec448da1c340eddbf781d9ff0520a78d5a35fd142eaaec4e04a81157a0f91015b60405180910390a25050565b42841015610bfb5760405162461bcd60e51b8152602060048201526012602482015271155b9a5cddd85c158c8e881156141254915160721b6044820152606401610843565b600e546001600160a01b0388165f908152600f6020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087610c4d83611eb5565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610cc692919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201205f80855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610d2e573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811615801590610d645750886001600160a01b0316816001600160a01b0316145b610db05760405162461bcd60e51b815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e4154555245000000006044820152606401610843565b610dbb8989896111ea565b505050505050505050565b6005546001600160a01b03163314610df05760405162461bcd60e51b815260040161084390611e36565b6040516370a0823160e01b81523060048201525f907f000000000000000000000000b260a1da2c508427d0ce43fbebedf056a346ccb56001600160a01b0316906370a0823190602401602060405180830381865afa158015610e54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e789190611ecd565b60405163a9059cbb60e01b815261dead6004820152602481018290529091507f000000000000000000000000b260a1da2c508427d0ce43fbebedf056a346ccb56001600160a01b03169063a9059cbb906044016020604051808303815f875af1158015610ee7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0b9190611ee4565b5050565b6005546001600160a01b03163314610f395760405162461bcd60e51b815260040161084390611e36565b6001600160a01b0382165f818152600c6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa99101610baa565b6005546001600160a01b03163314610fba5760405162461bcd60e51b815260040161084390611e36565b670de0b6b3a76400003410156110245760405162461bcd60e51b815260206004820152602960248201527f6d696e696d756d2045544820666f72206c6971756964697479206973206e6f74604482015268081c1c9bdd9a59195960ba1b6064820152608401610843565b611057307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d61105260025490565b6111ea565b6005805460ff60a01b1916600160a01b1790556001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663f305d71934306110a460025490565b6040516001600160e01b031960e086901b1681526001600160a01b03909216600483015260248201525f6044820181905260648201523060848201524260a482015260c40160606040518083038185885af1158015611105573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061112a9190611eff565b50506005805460ff60a01b19169055506006546109ab906001600160a01b03166117df565b6005546001600160a01b031633146111795760405162461bcd60e51b815260040161084390611e36565b6001600160a01b0381166111de5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610843565b6111e7816117df565b50565b6001600160a01b03831661124c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610843565b6001600160a01b0382166112ad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610843565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600554600160a01b900460ff1680611323575080155b1561133857611333838383611830565b505050565b6001600160a01b0383165f908152600c602052604081205460ff168061137557506001600160a01b0383165f908152600c602052604090205460ff165b600554909150600160a81b900460ff161561157757600554600160b01b900460ff166113e057806113e05760405162461bcd60e51b815260206004820152601560248201527474726164696e67206973206e6f742061637469766560581b6044820152606401610843565b8015801561142057507f000000000000000000000000b260a1da2c508427d0ce43fbebedf056a346ccb56001600160a01b0316836001600160a01b031614155b1561149f5760075482611447856001600160a01b03165f9081526020819052604090205490565b6114519190611f2a565b111561149f5760405162461bcd60e51b815260206004820152601b60248201527f6d61782077616c6c65742062616c616e636520657863656564656400000000006044820152606401610843565b6001600160a01b0384165f908152600d602052604081205460ff16806114dc57506001600160a01b0384165f908152600d602052604090205460ff165b90508015801561151e57507f000000000000000000000000b260a1da2c508427d0ce43fbebedf056a346ccb56001600160a01b0316846001600160a01b031614155b15611575576008548311156115755760405162461bcd60e51b815260206004820152601f60248201527f6d6178207472616e73616374696f6e20616d6f756e74206578636565646564006044820152606401610843565b505b5f81611584576001611586565b5f5b905080156117cd575f7f000000000000000000000000b260a1da2c508427d0ce43fbebedf056a346ccb56001600160a01b0316856001600160a01b03161480156115d157505f600b54115b156115fd576115f660646115f0600b54876119fd90919063ffffffff16565b90611a0f565b9050611661565b7f000000000000000000000000b260a1da2c508427d0ce43fbebedf056a346ccb56001600160a01b0316866001600160a01b031614801561163f57505f600a54115b156116615761165e60646115f0600a54876119fd90919063ffffffff16565b90505b801561167257611672863083611830565b600954305f90815260208190526040902054101580156116c357507f000000000000000000000000b260a1da2c508427d0ce43fbebedf056a346ccb56001600160a01b0316856001600160a01b0316145b156117bf575f6116d560095430611a1a565b6006546040519192505f916001600160a01b039091169083908381818185875af1925050503d805f8114611724576040519150601f19603f3d011682016040523d82523d5f602084013e611729565b606091505b50509050806117895760405162461bcd60e51b815260206004820152602660248201527f7472616e7366657220746f207461782072656365697665722077616c6c65742060448201526519985a5b195960d21b6064820152608401610843565b6040518281527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a150505b6117c98185611f3d565b9350505b6117d8858585611830565b5050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0383166118945760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610843565b6001600160a01b0382166118f65760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610843565b6001600160a01b0383165f908152602081905260409020548181101561196d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610843565b6001600160a01b038085165f908152602081905260408082208585039055918516815290812080548492906119a3908490611f2a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119ef91815260200190565b60405180910390a350505050565b5f611a088284611e7f565b9392505050565b5f611a088284611e96565b6040805160028082526060820183525f928392919060208301908036833701905050905030815f81518110611a5157611a51611f50565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611acd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611af19190611f64565b81600181518110611b0457611b04611f50565b60200260200101906001600160a01b031690816001600160a01b031681525050611b4f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d866111ea565b6005805460ff60a01b1916600160a01b17905560405163791ac94760e01b81526001600160a01b0380851631917f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac94790611bbd9088905f9087908a904290600401611f7f565b5f604051808303815f87803b158015611bd4575f80fd5b505af1158015611be6573d5f803e3d5ffd5b505050506001600160a01b038416315f611c008284611c18565b6005805460ff60a01b19169055979650505050505050565b5f611a088284611f3d565b5f602080835283518060208501525f5b81811015611c4f57858101830151858201604001528201611c33565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146111e7575f80fd5b5f8060408385031215611c94575f80fd5b8235611c9f81611c6f565b946020939093013593505050565b5f60208284031215611cbd575f80fd5b5035919050565b5f805f60608486031215611cd6575f80fd5b8335611ce181611c6f565b92506020840135611cf181611c6f565b929592945050506040919091013590565b5f60208284031215611d12575f80fd5b8135611a0881611c6f565b80151581146111e7575f80fd5b5f8060408385031215611d3b575f80fd5b8235611d4681611c6f565b91506020830135611d5681611d1d565b809150509250929050565b5f805f805f805f60e0888a031215611d77575f80fd5b8735611d8281611c6f565b96506020880135611d9281611c6f565b95506040880135945060608801359350608088013560ff81168114611db5575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215611de3575f80fd5b8235611dee81611c6f565b91506020830135611d5681611c6f565b600181811c90821680611e1257607f821691505b602082108103611e3057634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761081357610813611e6b565b5f82611eb057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201611ec657611ec6611e6b565b5060010190565b5f60208284031215611edd575f80fd5b5051919050565b5f60208284031215611ef4575f80fd5b8151611a0881611d1d565b5f805f60608486031215611f11575f80fd5b8351925060208401519150604084015190509250925092565b8082018082111561081357610813611e6b565b8181038181111561081357610813611e6b565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611f74575f80fd5b8151611a0881611c6f565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015611fcf5784516001600160a01b031683529383019391830191600101611faa565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220b540eb4bc3b008aed15aab0294c6348bc4a667610427b3d4f50b3e18cd675c1064736f6c63430008170033

Deployed Bytecode Sourcemap

24316:8888:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8657:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10824:169;;;;;;;;;;-1:-1:-1;10824:169:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;10824:169:0;1023:187:1;24426:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1406:32:1;;;1388:51;;1376:2;1361:18;24426:51:0;1215:230:1;9777:108:0;;;;;;;;;;-1:-1:-1;9865:12:0;;9777:108;;;1596:25:1;;;1584:2;1569:18;9777:108:0;1450:177:1;28522:137:0;;;;;;;;;;-1:-1:-1;28522:137:0;;;;;:::i;:::-;;:::i;:::-;;29154:87;;;;;;;;;;-1:-1:-1;29154:87:0;;;;;:::i;:::-;;:::i;11475:492::-;;;;;;;;;;-1:-1:-1;11475:492:0;;;;;:::i;:::-;;:::i;24538:53::-;;;;;;;;;;;;24584:6;24538:53;;24953:22;;;;;;;;;;;;;;;;25134:108;;;;;;;;;;-1:-1:-1;25134:108:0;25176:66;25134:108;;9619:93;;;;;;;;;;-1:-1:-1;9619:93:0;;9702:2;2810:36:1;;2798:2;2783:18;9619:93:0;2668:184:1;25096:31:0;;;;;;;;;;;;;;;;24719:77;;;;;;;;;;-1:-1:-1;24719:77:0;;;;-1:-1:-1;;;;;24719:77:0;;;29061:85;;;;;;;;;;-1:-1:-1;29061:85:0;;;;;:::i;:::-;;:::i;24925:21::-;;;;;;;;;;;;;;;;24484:45;;;;;;;;;;;;;;;24636:33;;;;;;;;;;-1:-1:-1;24636:33:0;;;;-1:-1:-1;;;24636:33:0;;;;;;24676:34;;;;;;;;;;-1:-1:-1;24676:34:0;;;;-1:-1:-1;;;24676:34:0;;;;;;25038:49;;;;;;;;;;-1:-1:-1;25038:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9948:127;;;;;;;;;;-1:-1:-1;9948:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10049:18:0;10022:7;10049:18;;;;;;;;;;;;9948:127;2569:103;;;;;;;;;;;;;:::i;28196:84::-;;;;;;;;;;;;;:::i;25249:38::-;;;;;;;;;;-1:-1:-1;25249:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;24984:47;;;;;;;;;;-1:-1:-1;24984:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28060:84;;;;;;;;;;;;;:::i;1918:87::-;;;;;;;;;;-1:-1:-1;1991:6:0;;-1:-1:-1;;;;;1991:6:0;1918:87;;8876:104;;;;;;;;;;;;;:::i;10288:175::-;;;;;;;;;;-1:-1:-1;10288:175:0;;;;;:::i;:::-;;:::i;28740:145::-;;;;;;;;;;-1:-1:-1;28740:145:0;;;;;:::i;:::-;;:::i;24805:31::-;;;;;;;;;;;;;;;;28327:120;;;;;;;;;;-1:-1:-1;28327:120:0;;;;;:::i;:::-;;:::i;24843:35::-;;;;;;;;;;;;;;;;28914:139;;;;;;;;;;-1:-1:-1;28914:139:0;;;;;:::i;:::-;;:::i;29434:183::-;;;;;;;;;;-1:-1:-1;29434:183:0;;;;;:::i;:::-;;:::i;32521:680::-;;;;;;;;;;-1:-1:-1;32521:680:0;;;;;:::i;:::-;;:::i;27710:216::-;;;:::i;10526:151::-;;;;;;;;;;-1:-1:-1;10526:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;10642:18:0;;;10615:7;10642:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10526:151;29249:177;;;;;;;;;;-1:-1:-1;29249:177:0;;;;;:::i;:::-;;:::i;27238:464::-;;;:::i;24885:31::-;;;;;;;;;;;;;;;;2827:201;;;;;;;;;;-1:-1:-1;2827:201:0;;;;;:::i;:::-;;:::i;8657:100::-;8711:13;8744:5;8737:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8657:100;:::o;10824:169::-;10907:4;10924:39;865:10;10947:7;10956:6;10924:8;:39::i;:::-;-1:-1:-1;10981:4:0;10824:169;;;;;:::o;28522:137::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;;;;;;;;;28648:3:::1;28637:7;28621:13;9865:12:::0;;;9777:108;28621:13:::1;:23;;;;:::i;:::-;28620:31;;;;:::i;:::-;28601:16;:50:::0;-1:-1:-1;28522:137:0:o;29154:87::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;29220:7:::1;:13:::0;29154:87::o;11475:492::-;11615:4;11632:36;11642:6;11650:9;11661:6;11632:9;:36::i;:::-;-1:-1:-1;;;;;11708:19:0;;11681:24;11708:19;;;:11;:19;;;;;;;;865:10;11708:33;;;;;;;;11760:26;;;;11752:79;;;;-1:-1:-1;;;11752:79:0;;6552:2:1;11752:79:0;;;6534:21:1;6591:2;6571:18;;;6564:30;6630:34;6610:18;;;6603:62;-1:-1:-1;;;6681:18:1;;;6674:38;6729:19;;11752:79:0;6350:404:1;11752:79:0;11867:57;11876:6;865:10;11917:6;11898:16;:25;11867:8;:57::i;:::-;-1:-1:-1;11955:4:0;;11475:492;-1:-1:-1;;;;11475:492:0:o;29061:85::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;29126:6:::1;:12:::0;29061:85::o;2569:103::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;2634:30:::1;2661:1;2634:18;:30::i;:::-;2569:103::o:0;28196:84::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;28250:14:::1;:22:::0;;-1:-1:-1;;;;28250:22:0::1;::::0;;28196:84::o;28060:::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;28115:14:::1;:21:::0;;-1:-1:-1;;;;28115:21:0::1;-1:-1:-1::0;;;28115:21:0::1;::::0;;28060:84::o;8876:104::-;8932:13;8965:7;8958:14;;;;;:::i;10288:175::-;10374:4;10391:42;865:10;10415:9;10426:6;10391:9;:42::i;28740:145::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;28874:3:::1;28863:7;28847:13;9865:12:::0;;;9777:108;28847:13:::1;:23;;;;:::i;:::-;28846:31;;;;:::i;:::-;28823:20;:54:::0;-1:-1:-1;28740:145:0:o;28327:120::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;28412:17:::1;:27:::0;;-1:-1:-1;;;;;;28412:27:0::1;-1:-1:-1::0;;;;;28412:27:0;;;::::1;::::0;;;::::1;::::0;;28327:120::o;28914:139::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;29040:5:::1;29029:7;29013:13;9865:12:::0;;;9777:108;29013:13:::1;:23;;;;:::i;:::-;29012:33;;;;:::i;:::-;28993:16;:52:::0;-1:-1:-1;28914:139:0:o;29434:183::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29520:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;;;;;:37;;-1:-1:-1;;29520:37:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29573:36;;1163:41:1;;;29573:36:0::1;::::0;1136:18:1;29573:36:0::1;;;;;;;;29434:183:::0;;:::o;32521:680::-;32667:15;32655:8;:27;;32647:58;;;;-1:-1:-1;;;32647:58:0;;6961:2:1;32647:58:0;;;6943:21:1;7000:2;6980:18;;;6973:30;-1:-1:-1;;;7019:18:1;;;7012:48;7077:18;;32647:58:0;6759:342:1;32647:58:0;32821:16;;-1:-1:-1;;;;;32917:13:0;;32716:14;32917:13;;;:6;:13;;;;;:15;;32716:14;;32821:16;25176:66;;32894:5;;32901:7;;32910:5;;32917:15;32716:14;32917:15;;;:::i;:::-;;;;-1:-1:-1;32866:77:0;;;;;;7533:25:1;;;;-1:-1:-1;;;;;7632:15:1;;;7612:18;;;7605:43;7684:15;;;;7664:18;;;7657:43;7716:18;;;7709:34;7759:19;;;7752:35;7803:19;;;7796:35;;;7505:19;;32866:77:0;;;;;;;;;;;;32856:88;;;;;;32757:202;;;;;;;;-1:-1:-1;;;8100:27:1;;8152:1;8143:11;;8136:27;;;;8188:2;8179:12;;8172:28;8225:2;8216:12;;7842:392;32757:202:0;;;;-1:-1:-1;;32757:202:0;;;;;;;;;32733:237;;32757:202;32733:237;;;;32981:24;33008:26;;;;;;;;;8466:25:1;;;8539:4;8527:17;;8507:18;;;8500:45;;;;8561:18;;;8554:34;;;8604:18;;;8597:34;;;32733:237:0;;-1:-1:-1;32981:24:0;33008:26;;8438:19:1;;33008:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33008:26:0;;-1:-1:-1;;33008:26:0;;;-1:-1:-1;;;;;;;33053:30:0;;;;;;:59;;;33107:5;-1:-1:-1;;;;;33087:25:0;:16;-1:-1:-1;;;;;33087:25:0;;33053:59;33045:100;;;;-1:-1:-1;;;33045:100:0;;8844:2:1;33045:100:0;;;8826:21:1;8883:2;8863:18;;;8856:30;8922;8902:18;;;8895:58;8970:18;;33045:100:0;8642:352:1;33045:100:0;33156:37;33171:5;33178:7;33187:5;33156:14;:37::i;:::-;32636:565;;32521:680;;;;;;;:::o;27710:216::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;27791:55:::1;::::0;-1:-1:-1;;;27791:55:0;;27840:4:::1;27791:55;::::0;::::1;1388:51:1::0;27773:15:0::1;::::0;27806:13:::1;-1:-1:-1::0;;;;;27791:40:0::1;::::0;::::1;::::0;1361:18:1;;27791:55:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27857:61;::::0;-1:-1:-1;;;27857:61:0;;24584:6:::1;27857:61;::::0;::::1;9362:51:1::0;9429:18;;;9422:34;;;27773:73:0;;-1:-1:-1;27872:13:0::1;-1:-1:-1::0;;;;;27857:39:0::1;::::0;::::1;::::0;9335:18:1;;27857:61:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27762:164;27710:216::o:0;29249:177::-;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29333:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;;;;;:35;;-1:-1:-1;;29333:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29384:34;;1163:41:1;;;29384:34:0::1;::::0;1136:18:1;29384:34:0::1;1023:187:1::0;27238:464:0;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;27321:4:::1;27308:9;:17;;27300:71;;;::::0;-1:-1:-1;;;27300:71:0;;9919:2:1;27300:71:0::1;::::0;::::1;9901:21:1::0;9958:2;9938:18;;;9931:30;9997:34;9977:18;;;9970:62;-1:-1:-1;;;10048:18:1;;;10041:39;10097:19;;27300:71:0::1;9717:405:1::0;27300:71:0::1;27391:70;27414:4;27429:15;27447:13;9865:12:::0;;;9777:108;27447:13:::1;27391:14;:70::i;:::-;27472:10;:17:::0;;-1:-1:-1;;;;27472:17:0::1;-1:-1:-1::0;;;27472:17:0::1;::::0;;-1:-1:-1;;;;;27500:15:0::1;:31;;27539:9;27558:4;27565:13;9865:12:::0;;;9777:108;27565:13:::1;27500:117;::::0;-1:-1:-1;;;;;;27500:117:0::1;::::0;;;;;;-1:-1:-1;;;;;10486:15:1;;;27500:117:0::1;::::0;::::1;10468:34:1::0;10518:18;;;10511:34;27580:1:0::1;10561:18:1::0;;;10554:34;;;10604:18;;;10597:34;27594:4:0::1;10647:19:1::0;;;10640:44;27601:15:0::1;10700:19:1::0;;;10693:35;10402:19;;27500:117:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;27628:10:0::1;:18:::0;;-1:-1:-1;;;;27628:18:0::1;::::0;;-1:-1:-1;27676:17:0::1;::::0;27657:37:::1;::::0;-1:-1:-1;;;;;27676:17:0::1;27657:18;:37::i;2827:201::-:0;1991:6;;-1:-1:-1;;;;;1991:6:0;865:10;2138:23;2130:68;;;;-1:-1:-1;;;2130:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2916:22:0;::::1;2908:73;;;::::0;-1:-1:-1;;;2908:73:0;;11252:2:1;2908:73:0::1;::::0;::::1;11234:21:1::0;11291:2;11271:18;;;11264:30;11330:34;11310:18;;;11303:62;-1:-1:-1;;;11381:18:1;;;11374:36;11427:19;;2908:73:0::1;11050:402:1::0;2908:73:0::1;2992:28;3011:8;2992:18;:28::i;:::-;2827:201:::0;:::o;14316:380::-;-1:-1:-1;;;;;14452:19:0;;14444:68;;;;-1:-1:-1;;;14444:68:0;;11659:2:1;14444:68:0;;;11641:21:1;11698:2;11678:18;;;11671:30;11737:34;11717:18;;;11710:62;-1:-1:-1;;;11788:18:1;;;11781:34;11832:19;;14444:68:0;11457:400:1;14444:68:0;-1:-1:-1;;;;;14531:21:0;;14523:68;;;;-1:-1:-1;;;14523:68:0;;12064:2:1;14523:68:0;;;12046:21:1;12103:2;12083:18;;;12076:30;12142:34;12122:18;;;12115:62;-1:-1:-1;;;12193:18:1;;;12186:32;12235:19;;14523:68:0;11862:398:1;14523:68:0;-1:-1:-1;;;;;14604:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;14656:32;;1596:25:1;;;14656:32:0;;1569:18:1;14656:32:0;;;;;;;14316:380;;;:::o;29625:2151::-;29753:10;;-1:-1:-1;;;29753:10:0;;;;;:25;;-1:-1:-1;29767:11:0;;29753:25;29749:112;;;29795:33;29811:4;29817:2;29821:6;29795:15;:33::i;:::-;29625:2151;;;:::o;29749:112::-;-1:-1:-1;;;;;29894:21:0;;29873:18;29894:21;;;:15;:21;;;;;;;;;:44;;-1:-1:-1;;;;;;29919:19:0;;;;;;:15;:19;;;;;;;;29894:44;29953:14;;29873:65;;-1:-1:-1;;;;29953:14:0;;;;29949:599;;;29989:14;;-1:-1:-1;;;29989:14:0;;;;29984:103;;30032:13;30024:47;;;;-1:-1:-1;;;30024:47:0;;12467:2:1;30024:47:0;;;12449:21:1;12506:2;12486:18;;;12479:30;-1:-1:-1;;;12525:18:1;;;12518:51;12586:18;;30024:47:0;12265:345:1;30024:47:0;30108:13;30107:14;:46;;;;;30139:13;-1:-1:-1;;;;;30125:28:0;:2;-1:-1:-1;;;;;30125:28:0;;;30107:46;30103:169;;;30208:16;;30198:6;30182:13;30192:2;-1:-1:-1;;;;;10049:18:0;10022:7;10049:18;;;;;;;;;;;;9948:127;30182:13;:22;;;;:::i;:::-;:42;;30174:82;;;;-1:-1:-1;;;30174:82:0;;12947:2:1;30174:82:0;;;12929:21:1;12986:2;12966:18;;;12959:30;13025:29;13005:18;;;12998:57;13072:18;;30174:82:0;12745:351:1;30174:82:0;-1:-1:-1;;;;;30311:23:0;;30288:20;30311:23;;;:17;:23;;;;;;;;;:48;;-1:-1:-1;;;;;;30338:21:0;;;;;;:17;:21;;;;;;;;30311:48;30288:71;;30379:15;30378:16;:48;;;;;30412:13;-1:-1:-1;;;;;30398:28:0;:2;-1:-1:-1;;;;;30398:28:0;;;30378:48;30374:163;;;30465:20;;30455:6;:30;;30447:74;;;;-1:-1:-1;;;30447:74:0;;13303:2:1;30447:74:0;;;13285:21:1;13342:2;13322:18;;;13315:30;13381:33;13361:18;;;13354:61;13432:18;;30447:74:0;13101:355:1;30447:74:0;29969:579;29949:599;30650:12;30665:13;:28;;30689:4;30665:28;;;30681:5;30665:28;30650:43;;30784:7;30780:943;;;30808:11;30880:13;-1:-1:-1;;;;;30866:28:0;:2;-1:-1:-1;;;;;30866:28:0;;:43;;;;;30908:1;30898:7;;:11;30866:43;30862:278;;;30936:28;30960:3;30936:19;30947:7;;30936:6;:10;;:19;;;;:::i;:::-;:23;;:28::i;:::-;30930:34;;30862:278;;;31042:13;-1:-1:-1;;;;;31026:30:0;:4;-1:-1:-1;;;;;31026:30:0;;:44;;;;;31069:1;31060:6;;:10;31026:44;31022:118;;;31097:27;31120:3;31097:18;31108:6;;31097;:10;;:18;;;;:::i;:27::-;31091:33;;31022:118;31160:7;;31156:89;;31188:41;31204:4;31218;31225:3;31188:15;:41::i;:::-;31293:16;;31283:4;10022:7;10049:18;;;;;;;;;;;31265:44;;:76;;;;;31327:13;-1:-1:-1;;;;;31313:28:0;:2;-1:-1:-1;;;;;31313:28:0;;31265:76;31261:421;;;31362:19;31384:49;31401:16;;31427:4;31384:16;:49::i;:::-;31473:17;;:46;;31362:71;;-1:-1:-1;31455:12:0;;-1:-1:-1;;;;;31473:17:0;;;;31362:71;;31455:12;31473:46;31455:12;31473:46;31362:71;31473:17;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31454:65;;;31547:7;31538:59;;;;-1:-1:-1;;;31538:59:0;;13873:2:1;31538:59:0;;;13855:21:1;13912:2;13892:18;;;13885:30;13951:34;13931:18;;;13924:62;-1:-1:-1;;;14002:18:1;;;13995:36;14048:19;;31538:59:0;13671:402:1;31538:59:0;31639:27;;1596:25:1;;;31639:27:0;;1584:2:1;1569:18;31639:27:0;;;;;;;31343:339;;31261:421;31698:13;31708:3;31698:13;;:::i;:::-;;;30793:930;30780:943;31735:33;31751:4;31757:2;31761:6;31735:15;:33::i;:::-;29738:2038;;29625:2151;;;:::o;3188:191::-;3281:6;;;-1:-1:-1;;;;;3298:17:0;;;-1:-1:-1;;;;;;3298:17:0;;;;;;;3331:40;;3281:6;;;3298:17;3281:6;;3331:40;;3262:16;;3331:40;3251:128;3188:191;:::o;12457:733::-;-1:-1:-1;;;;;12597:20:0;;12589:70;;;;-1:-1:-1;;;12589:70:0;;14413:2:1;12589:70:0;;;14395:21:1;14452:2;14432:18;;;14425:30;14491:34;14471:18;;;14464:62;-1:-1:-1;;;14542:18:1;;;14535:35;14587:19;;12589:70:0;14211:401:1;12589:70:0;-1:-1:-1;;;;;12678:23:0;;12670:71;;;;-1:-1:-1;;;12670:71:0;;14819:2:1;12670:71:0;;;14801:21:1;14858:2;14838:18;;;14831:30;14897:34;14877:18;;;14870:62;-1:-1:-1;;;14948:18:1;;;14941:33;14991:19;;12670:71:0;14617:399:1;12670:71:0;-1:-1:-1;;;;;12838:17:0;;12814:21;12838:17;;;;;;;;;;;12874:23;;;;12866:74;;;;-1:-1:-1;;;12866:74:0;;15223:2:1;12866:74:0;;;15205:21:1;15262:2;15242:18;;;15235:30;15301:34;15281:18;;;15274:62;-1:-1:-1;;;15352:18:1;;;15345:36;15398:19;;12866:74:0;15021:402:1;12866:74:0;-1:-1:-1;;;;;12976:17:0;;;:9;:17;;;;;;;;;;;12996:22;;;12976:42;;13040:20;;;;;;;;:30;;13012:6;;12976:9;13040:30;;13012:6;;13040:30;:::i;:::-;;;;;;;;13105:9;-1:-1:-1;;;;;13088:35:0;13097:6;-1:-1:-1;;;;;13088:35:0;;13116:6;13088:35;;;;1596:25:1;;1584:2;1569:18;;1450:177;13088:35:0;;;;;;;;12578:612;12457:733;;;:::o;19448:98::-;19506:7;19533:5;19537:1;19533;:5;:::i;:::-;19526:12;19448:98;-1:-1:-1;;;19448:98:0:o;19847:::-;19905:7;19932:5;19936:1;19932;:5;:::i;31784:729::-;31900:16;;;31914:1;31900:16;;;;;;;;31856:7;;;;31900:16;31914:1;31900:16;;;;;;;;;;-1:-1:-1;31900:16:0;31876:40;;31945:4;31927;31932:1;31927:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;31927:23:0;;;-1:-1:-1;;;;;31927:23:0;;;;;31971:15;-1:-1:-1;;;;;31971:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31961:4;31966:1;31961:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;31961:32:0;;;-1:-1:-1;;;;;31961:32:0;;;;;32006:63;32029:4;32044:15;32062:6;32006:14;:63::i;:::-;32090:10;:17;;-1:-1:-1;;;;32090:17:0;-1:-1:-1;;;32090:17:0;;;32163:180;;-1:-1:-1;;;32163:180:0;;-1:-1:-1;;;;;32142:10:0;;;;;32163:15;:66;;;;;;:180;;32244:6;;32090:17;;32281:4;;32142:2;;32317:15;;32163:180;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;32377:10:0;;;32354:20;32417:31;32377:10;32434:13;32417:16;:31::i;:::-;32459:10;:18;;-1:-1:-1;;;;32459:18:0;;;32398:50;31784:729;-1:-1:-1;;;;;;;31784:729:0:o;19091:98::-;19149:7;19176:5;19180:1;19176;:5;:::i;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1632:180::-;1691:6;1744:2;1732:9;1723:7;1719:23;1715:32;1712:52;;;1760:1;1757;1750:12;1712:52;-1:-1:-1;1783:23:1;;1632:180;-1:-1:-1;1632:180:1:o;1817:456::-;1894:6;1902;1910;1963:2;1951:9;1942:7;1938:23;1934:32;1931:52;;;1979:1;1976;1969:12;1931:52;2018:9;2005:23;2037:31;2062:5;2037:31;:::i;:::-;2087:5;-1:-1:-1;2144:2:1;2129:18;;2116:32;2157:33;2116:32;2157:33;:::i;:::-;1817:456;;2209:7;;-1:-1:-1;;;2263:2:1;2248:18;;;;2235:32;;1817:456::o;3088:247::-;3147:6;3200:2;3188:9;3179:7;3175:23;3171:32;3168:52;;;3216:1;3213;3206:12;3168:52;3255:9;3242:23;3274:31;3299:5;3274:31;:::i;3340:118::-;3426:5;3419:13;3412:21;3405:5;3402:32;3392:60;;3448:1;3445;3438:12;3463:382;3528:6;3536;3589:2;3577:9;3568:7;3564:23;3560:32;3557:52;;;3605:1;3602;3595:12;3557:52;3644:9;3631:23;3663:31;3688:5;3663:31;:::i;:::-;3713:5;-1:-1:-1;3770:2:1;3755:18;;3742:32;3783:30;3742:32;3783:30;:::i;:::-;3832:7;3822:17;;;3463:382;;;;;:::o;3850:829::-;3961:6;3969;3977;3985;3993;4001;4009;4062:3;4050:9;4041:7;4037:23;4033:33;4030:53;;;4079:1;4076;4069:12;4030:53;4118:9;4105:23;4137:31;4162:5;4137:31;:::i;:::-;4187:5;-1:-1:-1;4244:2:1;4229:18;;4216:32;4257:33;4216:32;4257:33;:::i;:::-;4309:7;-1:-1:-1;4363:2:1;4348:18;;4335:32;;-1:-1:-1;4414:2:1;4399:18;;4386:32;;-1:-1:-1;4470:3:1;4455:19;;4442:33;4519:4;4506:18;;4494:31;;4484:59;;4539:1;4536;4529:12;4484:59;3850:829;;;;-1:-1:-1;3850:829:1;;;;4562:7;4616:3;4601:19;;4588:33;;-1:-1:-1;4668:3:1;4653:19;;;4640:33;;3850:829;-1:-1:-1;;3850:829:1:o;4684:388::-;4752:6;4760;4813:2;4801:9;4792:7;4788:23;4784:32;4781:52;;;4829:1;4826;4819:12;4781:52;4868:9;4855:23;4887:31;4912:5;4887:31;:::i;:::-;4937:5;-1:-1:-1;4994:2:1;4979:18;;4966:32;5007:33;4966:32;5007:33;:::i;5077:380::-;5156:1;5152:12;;;;5199;;;5220:61;;5274:4;5266:6;5262:17;5252:27;;5220:61;5327:2;5319:6;5316:14;5296:18;5293:38;5290:161;;5373:10;5368:3;5364:20;5361:1;5354:31;5408:4;5405:1;5398:15;5436:4;5433:1;5426:15;5290:161;;5077:380;;;:::o;5462:356::-;5664:2;5646:21;;;5683:18;;;5676:30;5742:34;5737:2;5722:18;;5715:62;5809:2;5794:18;;5462:356::o;5823:127::-;5884:10;5879:3;5875:20;5872:1;5865:31;5915:4;5912:1;5905:15;5939:4;5936:1;5929:15;5955:168;6028:9;;;6059;;6076:15;;;6070:22;;6056:37;6046:71;;6097:18;;:::i;6128:217::-;6168:1;6194;6184:132;;6238:10;6233:3;6229:20;6226:1;6219:31;6273:4;6270:1;6263:15;6301:4;6298:1;6291:15;6184:132;-1:-1:-1;6330:9:1;;6128:217::o;7106:135::-;7145:3;7166:17;;;7163:43;;7186:18;;:::i;:::-;-1:-1:-1;7233:1:1;7222:13;;7106:135::o;8999:184::-;9069:6;9122:2;9110:9;9101:7;9097:23;9093:32;9090:52;;;9138:1;9135;9128:12;9090:52;-1:-1:-1;9161:16:1;;8999:184;-1:-1:-1;8999:184:1:o;9467:245::-;9534:6;9587:2;9575:9;9566:7;9562:23;9558:32;9555:52;;;9603:1;9600;9593:12;9555:52;9635:9;9629:16;9654:28;9676:5;9654:28;:::i;10739:306::-;10827:6;10835;10843;10896:2;10884:9;10875:7;10871:23;10867:32;10864:52;;;10912:1;10909;10902:12;10864:52;10941:9;10935:16;10925:26;;10991:2;10980:9;10976:18;10970:25;10960:35;;11035:2;11024:9;11020:18;11014:25;11004:35;;10739:306;;;;;:::o;12615:125::-;12680:9;;;12701:10;;;12698:36;;;12714:18;;:::i;14078:128::-;14145:9;;;14166:11;;;14163:37;;;14180:18;;:::i;15560:127::-;15621:10;15616:3;15612:20;15609:1;15602:31;15652:4;15649:1;15642:15;15676:4;15673:1;15666:15;15692:251;15762:6;15815:2;15803:9;15794:7;15790:23;15786:32;15783:52;;;15831:1;15828;15821:12;15783:52;15863:9;15857:16;15882:31;15907:5;15882:31;:::i;15948:980::-;16210:4;16258:3;16247:9;16243:19;16289:6;16278:9;16271:25;16315:2;16353:6;16348:2;16337:9;16333:18;16326:34;16396:3;16391:2;16380:9;16376:18;16369:31;16420:6;16455;16449:13;16486:6;16478;16471:22;16524:3;16513:9;16509:19;16502:26;;16563:2;16555:6;16551:15;16537:29;;16584:1;16594:195;16608:6;16605:1;16602:13;16594:195;;;16673:13;;-1:-1:-1;;;;;16669:39:1;16657:52;;16764:15;;;;16729:12;;;;16705:1;16623:9;16594:195;;;-1:-1:-1;;;;;;;16845:32:1;;;;16840:2;16825:18;;16818:60;-1:-1:-1;;;16909:3:1;16894:19;16887:35;16806:3;15948:980;-1:-1:-1;;;15948:980:1:o

Swarm Source

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