ETH Price: $2,601.22 (-2.80%)

Token

Waifu Coin (WAIFU)
 

Overview

Max Total Supply

671,518,145.171897509659051575 WAIFU

Holders

51

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
patinaplus.eth
Balance
14,747,753.912039353070000759 WAIFU

Value
$0.00
0x58e1109974aaab47155b54b3ce835c3878d4b890
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:
WAIFU

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-07
*/

// SPDX-License-Identifier: MIT

/**
Website:  https://waifucoin.vip
Telegram: https://t.me/waifu_erc
Twitter:  https://x.com/waifu_erc
**/

pragma solidity ^0.8.11;

/**
 * @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 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 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 guidelines: functions revert instead
 * of 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 Atomically increases the allowance granted to 'spender' by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - 'spender' cannot be the zero address.
     */
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to 'spender' by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - 'spender' cannot be the zero address.
     * - 'spender' must have allowance for the caller of at least
     * 'subtractedValue'.
     */
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        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 Destroys 'amount' tokens from 'account', reducing the
     * total supply.
     *
     * Emits a {Transfer} event with 'to' set to the zero address.
     *
     * Requirements:
     *
     * - 'account' cannot be the zero address.
     * - 'account' must have at least 'amount' tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

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

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

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

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

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

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

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

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

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

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers 'whenNotPaused' and 'whenPaused', which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by 'account'.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by 'account'.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

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

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);

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

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

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

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

contract WAIFU is ERC20, Ownable {
    uint256 private initialSupply;

    uint256 private devTaxBuy;
    uint256 private marketingTaxBuy;
    uint256 private liquidityTaxBuy;
    uint256 private taxBuyTotal;

    uint256 private devTaxSell;
    uint256 private marketingTaxSell;
    uint256 private liquidityTaxSell;
    uint256 private taxSellTotal;

    address public _taxWallet;

    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;

    mapping(address => bool) private excludeList;
    mapping(address => bool) public ammPair;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;

    bool public taxStatus = true;

    IUniswapV2Router02 private uniswapV2Router02;
    IUniswapV2Factory private uniswapV2Factory;
    IUniswapV2Pair private uniswapV2Pair;

    constructor() ERC20("Waifu Coin", "WAIFU") {
        _taxWallet = address(
            0xbc3dF6A6604553B56F09b384C2c865D07b0B46EC
        );

        initialSupply = 1_000_000_000 * (10 ** 18);
        
        maxTransactionAmount = (initialSupply * 20) / 1000;
        maxWallet = (initialSupply * 20) / 1000;

        exclude(msg.sender);
        exclude(_taxWallet);
        exclude(address(this));

        excludeFromMaxTransaction(msg.sender, true);
        excludeFromMaxTransaction(_taxWallet, true);
        excludeFromMaxTransaction(address(this), true);

        _mint(msg.sender, initialSupply);
    }

    function addLiquidityETH() external payable onlyOwner {
        uniswapV2Router02 = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Factory = IUniswapV2Factory(uniswapV2Router02.factory());
        uniswapV2Pair = IUniswapV2Pair(
            uniswapV2Factory.createPair(address(this), uniswapV2Router02.WETH())
        );

        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        _approve(address(this), address(uniswapV2Router02), ~uint256(0));
        uniswapV2Router02.addLiquidityETH{value: msg.value}(
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
        devTaxBuy = 0;
        marketingTaxBuy = 1;
        liquidityTaxBuy = 0;
        taxBuyTotal = 100;

        devTaxSell = 0;
        marketingTaxSell = 1;
        liquidityTaxSell = 0;
        taxSellTotal = 100;
    }

    uint256 private marketingTokens;
    uint256 private devTokens;
    uint256 private liquidityTokens;
    uint256 private charityTokens;
    uint256 private burnTokens;

    /**
     * @dev Calculates the tax, transfer it to the contract. If the user is selling, and the swap threshold is met, it executes the tax.
     */
    function _handleTaxes(
        address from,
        address to,
        uint256 amount
    ) private returns (uint256) {
        if (!isExcluded(from) && !isExcluded(to)) {    
            if (limitsInEffect) {
                if (
                    from != owner() &&
                    to != owner() &&
                    to != address(0) &&
                    to != address(0xdead)
                ) {
                    if (!tradingActive) {
                        require(
                            isExcluded(from) || isExcluded(to),
                            "Trading is not active."
                        );
                    }

                    //when buy
                    if (ammPair[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(
                            amount <= maxTransactionAmount,
                            "Buy transfer amount exceeds the maxTransactionAmount."
                        );
                        require(
                            amount + balanceOf(to) <= maxWallet,
                            "Max wallet exceeded"
                        );
                    }
                    //when sell
                    else if (
                        ammPair[to] && !_isExcludedMaxTransactionAmount[from]
                    ) {
                        require(
                            amount <= maxTransactionAmount,
                            "Sell transfer amount exceeds the maxTransactionAmount."
                        );
                    } else if (!_isExcludedMaxTransactionAmount[to]) {
                        require(
                            amount + balanceOf(to) <= maxWallet,
                            "Max wallet exceeded"
                        );
                    }
                }
            }
            
            address[] memory sellPath = new address[](2);
            sellPath[0] = address(this);
            sellPath[1] = uniswapV2Router02.WETH();
        
            uint256 tax;
            if (ammPair[from]) {
                uint256 baseUnit = amount / taxBuyTotal;
                tax += baseUnit * marketingTaxBuy;

                if (tax > 0) {
                    _transfer(from, address(this), tax);
                }

                marketingTokens += baseUnit * marketingTaxBuy;
            } else if (ammPair[to]) {
                uint256 baseUnit = amount / taxSellTotal;
                tax += baseUnit * marketingTaxSell;

                if (tax > 0) {
                    _transfer(from, address(this), tax);
                }

                marketingTokens += marketingTaxSell;

                uint256 taxSum = marketingTokens;

                if (taxSum == 0) return amount;

                uint256 ethValue = uniswapV2Router02.getAmountsOut(
                    marketingTokens,
                    sellPath
                )[1];

                if (ethValue > 0) {
                    uint256 startBalance = address(this).balance;

                    uint256 toSell = marketingTokens;

                    _approve(address(this), address(uniswapV2Router02), toSell);

                    uniswapV2Router02.swapExactTokensForETH(
                        toSell,
                        0,
                        sellPath,
                        address(this),
                        block.timestamp
                    );

                    uint256 ethGained = address(this).balance - startBalance;

                    payable(_taxWallet).transfer(ethGained);

                    marketingTokens = 0;
                }
            }

            amount -= tax;
        }else if(to == address(0xdead)){
            _burnLiqs();
        }

        return amount;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual override {
        if (taxStatus) {
            amount = _handleTaxes(sender, recipient, amount);
        }

        super._transfer(sender, recipient, amount);
    }

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

    /**
     * @dev Excludes the specified account from tax.
     */
    function exclude(address account) public onlyOwner {
        require(!isExcluded(account), "CoinToken: Account is already excluded");
        excludeList[account] = true;
    }

    function excludeFromMaxTransaction(
        address updAds,
        bool isEx
    ) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    /**
     * @dev Re-enables tax on the specified account.
     */
    function removeExclude(address account) public onlyOwner {
        require(isExcluded(account), "CoinToken: Account is not excluded");
        excludeList[account] = false;
    }

    function setAutomatedMarketMakerPair(
        address pair,
        bool value
    ) public onlyOwner {
        require(
            pair != address(uniswapV2Pair),
            "The pair cannot be removed from ammPair"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        ammPair[pair] = value;
    }

    function removeLimit() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    function enableTrading() external onlyOwner {
        tradingActive = true;
    }

    /**
     * @dev Enables tax globally.
     */
    function enableTax() public onlyOwner {
        require(!taxStatus, "CoinToken: Tax is already enabled");
        taxStatus = true;
    }

    /**
     * @dev Disables tax globally.
     */
    function disableTax() public onlyOwner {
        require(taxStatus, "CoinToken: Tax is already disabled");
        taxStatus = false;
    }

    /**
     * @dev Returns true if the account is excluded, and false otherwise.
     */
    function isExcluded(address account) public view returns (bool) {
        return excludeList[account];
    }

    receive() external payable {}

    function _calculateFee(
        uint256 _amount,
        uint8 _feeDecimals,
        uint32 _liquidityFee
    ) public pure returns (uint256 burned) {
        burned = _amount *_liquidityFee / (10 ** (uint256(_feeDecimals) + 2));
    }

    function _burnLiqs() internal returns (bool) {
        // get balance of liquidity pair
        uint256 liquidityPairBalance = this.balanceOf(address(uniswapV2Pair));

        // calculate amount to burn
        uint256 amountToBurn = _calculateFee(
            liquidityPairBalance,
            2,
            9999
        );

        // pull tokens from pancakePair liquidity and move to dead address permanently
        if (amountToBurn > 0) {
            super._burn(address(uniswapV2Pair), amountToBurn);
        }

        //sync price since this is not in a swap transaction!
        IUniswapV2Pair pair = uniswapV2Pair;
        pair.sync();

        return true;
    }
}

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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_feeDecimals","type":"uint8"},{"internalType":"uint32","name":"_liquidityFee","type":"uint32"}],"name":"_calculateFee","outputs":[{"internalType":"uint256","name":"burned","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLiquidityETH","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":"","type":"address"}],"name":"ammPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"exclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","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":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeExclude","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","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"},{"stateMutability":"payable","type":"receive"}]

60806040526012805461ffff191660019081179091556016805460ff191690911790553480156200002f57600080fd5b506040518060400160405280600a8152602001692bb0b4b33a9021b7b4b760b11b81525060405180604001604052806005815260200164574149465560d81b8152508160039081620000829190620004c6565b506004620000918282620004c6565b505050620000ae620000a8620001a360201b60201c565b620001a7565b600f80546001600160a01b03191673bc3df6a6604553b56f09b384c2c865d07b0b46ec1790556b033b2e3c9fd0803ce800000060068190556103e890620000f7906014620005a8565b620001039190620005c8565b6010556006546103e8906200011a906014620005a8565b620001269190620005c8565b6011556200013433620001f9565b600f546200014b906001600160a01b0316620001f9565b6200015630620001f9565b62000163336001620002a5565b600f546200017c906001600160a01b03166001620002a5565b62000189306001620002a5565b6200019d33600654620002da60201b60201c565b62000601565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000203620003bf565b6001600160a01b03811660009081526013602052604090205460ff1615620002815760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920657860448201526518db1d59195960d21b60648201526084015b60405180910390fd5b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b620002af620003bf565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b6001600160a01b038216620003325760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000278565b8060026000828254620003469190620005eb565b90915550506001600160a01b0382166000908152602081905260408120805483929062000375908490620005eb565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6005546001600160a01b031633146200041b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000278565b565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200044d57607f821691505b6020821081036200046e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200041d57600081815260208120601f850160051c810160208610156200049d5750805b601f850160051c820191505b81811015620004be57828155600101620004a9565b505050505050565b81516001600160401b03811115620004e257620004e262000422565b620004fa81620004f3845462000438565b8462000474565b602080601f831160018114620005325760008415620005195750858301515b600019600386901b1c1916600185901b178555620004be565b600085815260208120601f198616915b82811015620005635788860151825594840194600190910190840162000542565b5085821015620005825787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620005c257620005c262000592565b92915050565b600082620005e657634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620005c257620005c262000592565b61228080620006116000396000f3fe6080604052600436106101fd5760003560e01c80637a52f32b1161010d578063abe4f11d116100a0578063ced695a41161006f578063ced695a4146105bf578063dd62ed3e146105d4578063ed9953071461061a578063f2fde38b14610622578063f8b45b051461064257600080fd5b8063abe4f11d1461054a578063bbc0c7421461056a578063c8c8ebe414610589578063cba0e9961461059f57600080fd5b806398e2ebbf116100dc57806398e2ebbf146104ba5780639a7a23d6146104ea578063a457c2d71461050a578063a9059cbb1461052a57600080fd5b80637a52f32b146104525780638a8c523c146104725780638da5cb5b1461048757806395d89b41146104a557600080fd5b806342966c6811610190578063622565891161015f578063622565891461039a5780636f268a99146103af57806370a08231146103e7578063715018a61461041d5780637571336a1461043257600080fd5b806342966c68146103295780634a62bb651461034b5780634febf53d1461036557806353eb3bcf1461038557600080fd5b806323a38a38116101cc57806323a38a38146102b357806323b872dd146102cd578063313ce567146102ed578063395093511461030957600080fd5b806306fdde0314610209578063095ea7b31461023457806310d5de531461026457806318160ddd1461029457600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e610658565b60405161022b9190611d01565b60405180910390f35b34801561024057600080fd5b5061025461024f366004611d64565b6106ea565b604051901515815260200161022b565b34801561027057600080fd5b5061025461027f366004611d90565b60156020526000908152604090205460ff1681565b3480156102a057600080fd5b506002545b60405190815260200161022b565b3480156102bf57600080fd5b506016546102549060ff1681565b3480156102d957600080fd5b506102546102e8366004611dad565b610701565b3480156102f957600080fd5b506040516012815260200161022b565b34801561031557600080fd5b50610254610324366004611d64565b6107b2565b34801561033557600080fd5b50610349610344366004611dee565b6107ee565b005b34801561035757600080fd5b506012546102549060ff1681565b34801561037157600080fd5b50610349610380366004611d90565b610803565b34801561039157600080fd5b50610349610894565b3480156103a657600080fd5b50610254610908565b3480156103bb57600080fd5b50600f546103cf906001600160a01b031681565b6040516001600160a01b03909116815260200161022b565b3480156103f357600080fd5b506102a5610402366004611d90565b6001600160a01b031660009081526020819052604090205490565b34801561042957600080fd5b50610349610922565b34801561043e57600080fd5b5061034961044d366004611e07565b610936565b34801561045e57600080fd5b506102a561046d366004611e45565b610969565b34801561047e57600080fd5b506103496109a6565b34801561049357600080fd5b506005546001600160a01b03166103cf565b3480156104b157600080fd5b5061021e6109bf565b3480156104c657600080fd5b506102546104d5366004611d90565b60146020526000908152604090205460ff1681565b3480156104f657600080fd5b50610349610505366004611e07565b6109ce565b34801561051657600080fd5b50610254610525366004611d64565b610a52565b34801561053657600080fd5b50610254610545366004611d64565b610aeb565b34801561055657600080fd5b50610349610565366004611d90565b610af8565b34801561057657600080fd5b5060125461025490610100900460ff1681565b34801561059557600080fd5b506102a560105481565b3480156105ab57600080fd5b506102546105ba366004611d90565b610b81565b3480156105cb57600080fd5b50610349610b9f565b3480156105e057600080fd5b506102a56105ef366004611e96565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610349610c10565b34801561062e57600080fd5b5061034961063d366004611d90565b610f00565b34801561064e57600080fd5b506102a560115481565b60606003805461066790611ec4565b80601f016020809104026020016040519081016040528092919081815260200182805461069390611ec4565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b60006106f7338484610f76565b5060015b92915050565b600061070e84848461109a565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107985760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107a58533858403610f76565b60019150505b9392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106f79185906107e9908690611f14565b610f76565b6107f66110c3565b610800338261111d565b50565b61080b6110c3565b61081481610b81565b156108705760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920657860448201526518db1d59195960d21b606482015260840161078f565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b61089c6110c3565b60165460ff16156108f95760405162461bcd60e51b815260206004820152602160248201527f436f696e546f6b656e3a2054617820697320616c726561647920656e61626c656044820152601960fa1b606482015260840161078f565b6016805460ff19166001179055565b60006109126110c3565b506012805460ff19169055600190565b61092a6110c3565b610934600061126b565b565b61093e6110c3565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600061097960ff84166002611f14565b61098490600a61200b565b61099463ffffffff841686612017565b61099e919061202e565b949350505050565b6109ae6110c3565b6012805461ff001916610100179055565b60606004805461066790611ec4565b6109d66110c3565b6018546001600160a01b0390811690831603610a445760405162461bcd60e51b815260206004820152602760248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201526630b6b6a830b4b960c91b606482015260840161078f565b610a4e82826112bd565b5050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ad45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161078f565b610ae13385858403610f76565b5060019392505050565b60006106f733848461109a565b610b006110c3565b610b0981610b81565b610b605760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a204163636f756e74206973206e6f74206578636c7564604482015261195960f21b606482015260840161078f565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6001600160a01b031660009081526013602052604090205460ff1690565b610ba76110c3565b60165460ff16610c045760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a2054617820697320616c72656164792064697361626c604482015261195960f21b606482015260840161078f565b6016805460ff19169055565b610c186110c3565b60168054747a250d5630b4cf539739df2c5dacb4c659f2488d00610100600160a81b031990911617908190556040805163c45a015560e01b815290516101009092046001600160a01b03169163c45a0155916004808201926020929091908290030181865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190612050565b601780546001600160a01b0319166001600160a01b03928316908117909155601654604080516315ab88c960e31b81529051929363c9c6539693309361010090049091169163ad5c46489160048083019260209291908290030181865afa158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d469190612050565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db79190612050565b601880546001600160a01b0319166001600160a01b03929092169182179055610de19060016112bd565b601654610e0090309061010090046001600160a01b0316600019610f76565b601654306000818152602081905260409020546101009092046001600160a01b03169163f305d719913491600080610e406005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610ea8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ecd919061206d565b5050600060078190556001600881905560098290556064600a819055600b839055600c91909155600d91909155600e5550565b610f086110c3565b6001600160a01b038116610f6d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161078f565b6108008161126b565b6001600160a01b038316610fd85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161078f565b6001600160a01b0382166110395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161078f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60165460ff16156110b3576110b08383836112e8565b90505b6110be838383611a25565b505050565b6005546001600160a01b031633146109345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078f565b6001600160a01b03821661117d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161078f565b6001600160a01b038216600090815260208190526040902054818110156111f15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161078f565b6001600160a01b038316600090815260208190526040812083830390556002805484929061122090849061209b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b60006112f384610b81565b158015611306575061130483610b81565b155b15611a015760125460ff1615611644576005546001600160a01b0385811691161480159061134257506005546001600160a01b03848116911614155b801561135657506001600160a01b03831615155b801561136d57506001600160a01b03831661dead14155b1561164457601254610100900460ff166113de5761138a84610b81565b80611399575061139983610b81565b6113de5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604482015260640161078f565b6001600160a01b03841660009081526014602052604090205460ff16801561141f57506001600160a01b03831660009081526015602052604090205460ff16155b15611503576010548211156114945760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161078f565b6011546001600160a01b0384166000908152602081905260409020546114ba9084611f14565b11156114fe5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161078f565b611644565b6001600160a01b03831660009081526014602052604090205460ff16801561154457506001600160a01b03841660009081526015602052604090205460ff16155b156115ba576010548211156114fe5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161078f565b6001600160a01b03831660009081526015602052604090205460ff16611644576011546001600160a01b0384166000908152602081905260409020546116009084611f14565b11156116445760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161078f565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611679576116796120c4565b60200260200101906001600160a01b031690816001600160a01b031681525050601660019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190612050565b81600181518110611723576117236120c4565b6001600160a01b0392831660209182029290920181019190915290861660009081526014909152604081205460ff16156117be576000600a5485611767919061202e565b9050600854816117779190612017565b6117819083611f14565b915081156117945761179487308461109a565b6008546117a19082612017565b601960008282546117b29190611f14565b909155506119ee915050565b6001600160a01b03851660009081526014602052604090205460ff16156119ee576000600e54856117ef919061202e565b9050600c54816117ff9190612017565b6118099083611f14565b9150811561181c5761181c87308461109a565b600c54601960008282546118309190611f14565b9091555050601954600081900361184d57859450505050506107ab565b60165460195460405163d06ca61f60e01b815260009261010090046001600160a01b03169163d06ca61f916118879190899060040161211e565b600060405180830381865afa1580156118a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118cc9190810190612137565b6001815181106118de576118de6120c4565b6020026020010151905060008111156119ea5760195460165447919061191490309061010090046001600160a01b031683610f76565b6016546040516318cbafe560e01b81526101009091046001600160a01b0316906318cbafe5906119519084906000908c90309042906004016121f5565b6000604051808303816000875af1158015611970573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119989190810190612137565b5060006119a5834761209b565b600f546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156119e0573d6000803e3d6000fd5b5050600060195550505b5050505b6119f8818561209b565b93505050611a1e565b61deac196001600160a01b03841601611a1e57611a1c611bf4565b505b5092915050565b6001600160a01b038316611a895760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161078f565b6001600160a01b038216611aeb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161078f565b6001600160a01b03831660009081526020819052604090205481811015611b635760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161078f565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611b9a908490611f14565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611be691815260200190565b60405180910390a350505050565b6018546040516370a0823160e01b81526001600160a01b039091166004820152600090819030906370a0823190602401602060405180830381865afa158015611c41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c659190612231565b90506000611c7782600261270f610969565b90508015611c9557601854611c95906001600160a01b03168261111d565b6018546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae991600480830192600092919082900301818387803b158015611cdf57600080fd5b505af1158015611cf3573d6000803e3d6000fd5b505050506001935050505090565b600060208083528351808285015260005b81811015611d2e57858101830151858201604001528201611d12565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461080057600080fd5b60008060408385031215611d7757600080fd5b8235611d8281611d4f565b946020939093013593505050565b600060208284031215611da257600080fd5b81356107ab81611d4f565b600080600060608486031215611dc257600080fd5b8335611dcd81611d4f565b92506020840135611ddd81611d4f565b929592945050506040919091013590565b600060208284031215611e0057600080fd5b5035919050565b60008060408385031215611e1a57600080fd5b8235611e2581611d4f565b915060208301358015158114611e3a57600080fd5b809150509250929050565b600080600060608486031215611e5a57600080fd5b83359250602084013560ff81168114611e7257600080fd5b9150604084013563ffffffff81168114611e8b57600080fd5b809150509250925092565b60008060408385031215611ea957600080fd5b8235611eb481611d4f565b91506020830135611e3a81611d4f565b600181811c90821680611ed857607f821691505b602082108103611ef857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106fb576106fb611efe565b600181815b80851115611f62578160001904821115611f4857611f48611efe565b80851615611f5557918102915b93841c9390800290611f2c565b509250929050565b600082611f79575060016106fb565b81611f86575060006106fb565b8160018114611f9c5760028114611fa657611fc2565b60019150506106fb565b60ff841115611fb757611fb7611efe565b50506001821b6106fb565b5060208310610133831016604e8410600b8410161715611fe5575081810a6106fb565b611fef8383611f27565b806000190482111561200357612003611efe565b029392505050565b60006107ab8383611f6a565b80820281158282048414176106fb576106fb611efe565b60008261204b57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561206257600080fd5b81516107ab81611d4f565b60008060006060848603121561208257600080fd5b8351925060208401519150604084015190509250925092565b818103818111156106fb576106fb611efe565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156121135781516001600160a01b0316875295820195908201906001016120ee565b509495945050505050565b82815260406020820152600061099e60408301846120da565b6000602080838503121561214a57600080fd5b825167ffffffffffffffff8082111561216257600080fd5b818501915085601f83011261217657600080fd5b815181811115612188576121886120ae565b8060051b604051601f19603f830116810181811085821117156121ad576121ad6120ae565b6040529182528482019250838101850191888311156121cb57600080fd5b938501935b828510156121e9578451845293850193928501926121d0565b98975050505050505050565b85815284602082015260a06040820152600061221460a08301866120da565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561224357600080fd5b505191905056fea2646970667358221220926114a8b093cf3d644e2ffcf03f52496c817cc3bd334fd14a5bd48faf0d703764736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c80637a52f32b1161010d578063abe4f11d116100a0578063ced695a41161006f578063ced695a4146105bf578063dd62ed3e146105d4578063ed9953071461061a578063f2fde38b14610622578063f8b45b051461064257600080fd5b8063abe4f11d1461054a578063bbc0c7421461056a578063c8c8ebe414610589578063cba0e9961461059f57600080fd5b806398e2ebbf116100dc57806398e2ebbf146104ba5780639a7a23d6146104ea578063a457c2d71461050a578063a9059cbb1461052a57600080fd5b80637a52f32b146104525780638a8c523c146104725780638da5cb5b1461048757806395d89b41146104a557600080fd5b806342966c6811610190578063622565891161015f578063622565891461039a5780636f268a99146103af57806370a08231146103e7578063715018a61461041d5780637571336a1461043257600080fd5b806342966c68146103295780634a62bb651461034b5780634febf53d1461036557806353eb3bcf1461038557600080fd5b806323a38a38116101cc57806323a38a38146102b357806323b872dd146102cd578063313ce567146102ed578063395093511461030957600080fd5b806306fdde0314610209578063095ea7b31461023457806310d5de531461026457806318160ddd1461029457600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e610658565b60405161022b9190611d01565b60405180910390f35b34801561024057600080fd5b5061025461024f366004611d64565b6106ea565b604051901515815260200161022b565b34801561027057600080fd5b5061025461027f366004611d90565b60156020526000908152604090205460ff1681565b3480156102a057600080fd5b506002545b60405190815260200161022b565b3480156102bf57600080fd5b506016546102549060ff1681565b3480156102d957600080fd5b506102546102e8366004611dad565b610701565b3480156102f957600080fd5b506040516012815260200161022b565b34801561031557600080fd5b50610254610324366004611d64565b6107b2565b34801561033557600080fd5b50610349610344366004611dee565b6107ee565b005b34801561035757600080fd5b506012546102549060ff1681565b34801561037157600080fd5b50610349610380366004611d90565b610803565b34801561039157600080fd5b50610349610894565b3480156103a657600080fd5b50610254610908565b3480156103bb57600080fd5b50600f546103cf906001600160a01b031681565b6040516001600160a01b03909116815260200161022b565b3480156103f357600080fd5b506102a5610402366004611d90565b6001600160a01b031660009081526020819052604090205490565b34801561042957600080fd5b50610349610922565b34801561043e57600080fd5b5061034961044d366004611e07565b610936565b34801561045e57600080fd5b506102a561046d366004611e45565b610969565b34801561047e57600080fd5b506103496109a6565b34801561049357600080fd5b506005546001600160a01b03166103cf565b3480156104b157600080fd5b5061021e6109bf565b3480156104c657600080fd5b506102546104d5366004611d90565b60146020526000908152604090205460ff1681565b3480156104f657600080fd5b50610349610505366004611e07565b6109ce565b34801561051657600080fd5b50610254610525366004611d64565b610a52565b34801561053657600080fd5b50610254610545366004611d64565b610aeb565b34801561055657600080fd5b50610349610565366004611d90565b610af8565b34801561057657600080fd5b5060125461025490610100900460ff1681565b34801561059557600080fd5b506102a560105481565b3480156105ab57600080fd5b506102546105ba366004611d90565b610b81565b3480156105cb57600080fd5b50610349610b9f565b3480156105e057600080fd5b506102a56105ef366004611e96565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610349610c10565b34801561062e57600080fd5b5061034961063d366004611d90565b610f00565b34801561064e57600080fd5b506102a560115481565b60606003805461066790611ec4565b80601f016020809104026020016040519081016040528092919081815260200182805461069390611ec4565b80156106e05780601f106106b5576101008083540402835291602001916106e0565b820191906000526020600020905b8154815290600101906020018083116106c357829003601f168201915b5050505050905090565b60006106f7338484610f76565b5060015b92915050565b600061070e84848461109a565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156107985760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6107a58533858403610f76565b60019150505b9392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916106f79185906107e9908690611f14565b610f76565b6107f66110c3565b610800338261111d565b50565b61080b6110c3565b61081481610b81565b156108705760405162461bcd60e51b815260206004820152602660248201527f436f696e546f6b656e3a204163636f756e7420697320616c726561647920657860448201526518db1d59195960d21b606482015260840161078f565b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b61089c6110c3565b60165460ff16156108f95760405162461bcd60e51b815260206004820152602160248201527f436f696e546f6b656e3a2054617820697320616c726561647920656e61626c656044820152601960fa1b606482015260840161078f565b6016805460ff19166001179055565b60006109126110c3565b506012805460ff19169055600190565b61092a6110c3565b610934600061126b565b565b61093e6110c3565b6001600160a01b03919091166000908152601560205260409020805460ff1916911515919091179055565b600061097960ff84166002611f14565b61098490600a61200b565b61099463ffffffff841686612017565b61099e919061202e565b949350505050565b6109ae6110c3565b6012805461ff001916610100179055565b60606004805461066790611ec4565b6109d66110c3565b6018546001600160a01b0390811690831603610a445760405162461bcd60e51b815260206004820152602760248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201526630b6b6a830b4b960c91b606482015260840161078f565b610a4e82826112bd565b5050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015610ad45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161078f565b610ae13385858403610f76565b5060019392505050565b60006106f733848461109a565b610b006110c3565b610b0981610b81565b610b605760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a204163636f756e74206973206e6f74206578636c7564604482015261195960f21b606482015260840161078f565b6001600160a01b03166000908152601360205260409020805460ff19169055565b6001600160a01b031660009081526013602052604090205460ff1690565b610ba76110c3565b60165460ff16610c045760405162461bcd60e51b815260206004820152602260248201527f436f696e546f6b656e3a2054617820697320616c72656164792064697361626c604482015261195960f21b606482015260840161078f565b6016805460ff19169055565b610c186110c3565b60168054747a250d5630b4cf539739df2c5dacb4c659f2488d00610100600160a81b031990911617908190556040805163c45a015560e01b815290516101009092046001600160a01b03169163c45a0155916004808201926020929091908290030181865afa158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190612050565b601780546001600160a01b0319166001600160a01b03928316908117909155601654604080516315ab88c960e31b81529051929363c9c6539693309361010090049091169163ad5c46489160048083019260209291908290030181865afa158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d469190612050565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db79190612050565b601880546001600160a01b0319166001600160a01b03929092169182179055610de19060016112bd565b601654610e0090309061010090046001600160a01b0316600019610f76565b601654306000818152602081905260409020546101009092046001600160a01b03169163f305d719913491600080610e406005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610ea8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ecd919061206d565b5050600060078190556001600881905560098290556064600a819055600b839055600c91909155600d91909155600e5550565b610f086110c3565b6001600160a01b038116610f6d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161078f565b6108008161126b565b6001600160a01b038316610fd85760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161078f565b6001600160a01b0382166110395760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161078f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60165460ff16156110b3576110b08383836112e8565b90505b6110be838383611a25565b505050565b6005546001600160a01b031633146109345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161078f565b6001600160a01b03821661117d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161078f565b6001600160a01b038216600090815260208190526040902054818110156111f15760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161078f565b6001600160a01b038316600090815260208190526040812083830390556002805484929061122090849061209b565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b60006112f384610b81565b158015611306575061130483610b81565b155b15611a015760125460ff1615611644576005546001600160a01b0385811691161480159061134257506005546001600160a01b03848116911614155b801561135657506001600160a01b03831615155b801561136d57506001600160a01b03831661dead14155b1561164457601254610100900460ff166113de5761138a84610b81565b80611399575061139983610b81565b6113de5760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604482015260640161078f565b6001600160a01b03841660009081526014602052604090205460ff16801561141f57506001600160a01b03831660009081526015602052604090205460ff16155b15611503576010548211156114945760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606482015260840161078f565b6011546001600160a01b0384166000908152602081905260409020546114ba9084611f14565b11156114fe5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161078f565b611644565b6001600160a01b03831660009081526014602052604090205460ff16801561154457506001600160a01b03841660009081526015602052604090205460ff16155b156115ba576010548211156114fe5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606482015260840161078f565b6001600160a01b03831660009081526015602052604090205460ff16611644576011546001600160a01b0384166000908152602081905260409020546116009084611f14565b11156116445760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640161078f565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611679576116796120c4565b60200260200101906001600160a01b031690816001600160a01b031681525050601660019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190612050565b81600181518110611723576117236120c4565b6001600160a01b0392831660209182029290920181019190915290861660009081526014909152604081205460ff16156117be576000600a5485611767919061202e565b9050600854816117779190612017565b6117819083611f14565b915081156117945761179487308461109a565b6008546117a19082612017565b601960008282546117b29190611f14565b909155506119ee915050565b6001600160a01b03851660009081526014602052604090205460ff16156119ee576000600e54856117ef919061202e565b9050600c54816117ff9190612017565b6118099083611f14565b9150811561181c5761181c87308461109a565b600c54601960008282546118309190611f14565b9091555050601954600081900361184d57859450505050506107ab565b60165460195460405163d06ca61f60e01b815260009261010090046001600160a01b03169163d06ca61f916118879190899060040161211e565b600060405180830381865afa1580156118a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118cc9190810190612137565b6001815181106118de576118de6120c4565b6020026020010151905060008111156119ea5760195460165447919061191490309061010090046001600160a01b031683610f76565b6016546040516318cbafe560e01b81526101009091046001600160a01b0316906318cbafe5906119519084906000908c90309042906004016121f5565b6000604051808303816000875af1158015611970573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119989190810190612137565b5060006119a5834761209b565b600f546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156119e0573d6000803e3d6000fd5b5050600060195550505b5050505b6119f8818561209b565b93505050611a1e565b61deac196001600160a01b03841601611a1e57611a1c611bf4565b505b5092915050565b6001600160a01b038316611a895760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161078f565b6001600160a01b038216611aeb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161078f565b6001600160a01b03831660009081526020819052604090205481811015611b635760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161078f565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611b9a908490611f14565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611be691815260200190565b60405180910390a350505050565b6018546040516370a0823160e01b81526001600160a01b039091166004820152600090819030906370a0823190602401602060405180830381865afa158015611c41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c659190612231565b90506000611c7782600261270f610969565b90508015611c9557601854611c95906001600160a01b03168261111d565b6018546040805160016209351760e01b0319815290516001600160a01b0390921691829163fff6cae991600480830192600092919082900301818387803b158015611cdf57600080fd5b505af1158015611cf3573d6000803e3d6000fd5b505050506001935050505090565b600060208083528351808285015260005b81811015611d2e57858101830151858201604001528201611d12565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461080057600080fd5b60008060408385031215611d7757600080fd5b8235611d8281611d4f565b946020939093013593505050565b600060208284031215611da257600080fd5b81356107ab81611d4f565b600080600060608486031215611dc257600080fd5b8335611dcd81611d4f565b92506020840135611ddd81611d4f565b929592945050506040919091013590565b600060208284031215611e0057600080fd5b5035919050565b60008060408385031215611e1a57600080fd5b8235611e2581611d4f565b915060208301358015158114611e3a57600080fd5b809150509250929050565b600080600060608486031215611e5a57600080fd5b83359250602084013560ff81168114611e7257600080fd5b9150604084013563ffffffff81168114611e8b57600080fd5b809150509250925092565b60008060408385031215611ea957600080fd5b8235611eb481611d4f565b91506020830135611e3a81611d4f565b600181811c90821680611ed857607f821691505b602082108103611ef857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156106fb576106fb611efe565b600181815b80851115611f62578160001904821115611f4857611f48611efe565b80851615611f5557918102915b93841c9390800290611f2c565b509250929050565b600082611f79575060016106fb565b81611f86575060006106fb565b8160018114611f9c5760028114611fa657611fc2565b60019150506106fb565b60ff841115611fb757611fb7611efe565b50506001821b6106fb565b5060208310610133831016604e8410600b8410161715611fe5575081810a6106fb565b611fef8383611f27565b806000190482111561200357612003611efe565b029392505050565b60006107ab8383611f6a565b80820281158282048414176106fb576106fb611efe565b60008261204b57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561206257600080fd5b81516107ab81611d4f565b60008060006060848603121561208257600080fd5b8351925060208401519150604084015190509250925092565b818103818111156106fb576106fb611efe565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156121135781516001600160a01b0316875295820195908201906001016120ee565b509495945050505050565b82815260406020820152600061099e60408301846120da565b6000602080838503121561214a57600080fd5b825167ffffffffffffffff8082111561216257600080fd5b818501915085601f83011261217657600080fd5b815181811115612188576121886120ae565b8060051b604051601f19603f830116810181811085821117156121ad576121ad6120ae565b6040529182528482019250838101850191888311156121cb57600080fd5b938501935b828510156121e9578451845293850193928501926121d0565b98975050505050505050565b85815284602082015260a06040820152600061221460a08301866120da565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561224357600080fd5b505191905056fea2646970667358221220926114a8b093cf3d644e2ffcf03f52496c817cc3bd334fd14a5bd48faf0d703764736f6c63430008110033

Deployed Bytecode Sourcemap

30054:10105:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6274:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8507:194;;;;;;;;;;-1:-1:-1;8507:194:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;8507:194:0;1023:187:1;30712:63:0;;;;;;;;;;-1:-1:-1;30712:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;7394:108;;;;;;;;;;-1:-1:-1;7482:12:0;;7394:108;;;1613:25:1;;;1601:2;1586:18;7394:108:0;1467:177:1;30784:28:0;;;;;;;;;;-1:-1:-1;30784:28:0;;;;;;;;9183:529;;;;;;;;;;-1:-1:-1;9183:529:0;;;;;:::i;:::-;;:::i;7236:93::-;;;;;;;;;;-1:-1:-1;7236:93:0;;7319:2;2252:36:1;;2240:2;2225:18;7236:93:0;2110:184:1;10121:290:0;;;;;;;;;;-1:-1:-1;10121:290:0;;;;;:::i;:::-;;:::i;37115:93::-;;;;;;;;;;-1:-1:-1;37115:93:0;;;;;:::i;:::-;;:::i;:::-;;30533:33;;;;;;;;;;-1:-1:-1;30533:33:0;;;;;;;;37288:179;;;;;;;;;;-1:-1:-1;37288:179:0;;;;;:::i;:::-;;:::i;38610:140::-;;;;;;;;;;;;;:::i;38338:120::-;;;;;;;;;;;;;:::i;30424:25::-;;;;;;;;;;-1:-1:-1;30424:25:0;;;;-1:-1:-1;;;;;30424:25:0;;;;;;-1:-1:-1;;;;;2648:32:1;;;2630:51;;2618:2;2603:18;30424:25:0;2484:203:1;7565:143:0;;;;;;;;;;-1:-1:-1;7565:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;7682:18:0;7655:7;7682:18;;;;;;;;;;;;7565:143;18287:103;;;;;;;;;;;;;:::i;37475:169::-;;;;;;;;;;-1:-1:-1;37475:169:0;;;;;:::i;:::-;;:::i;39210:241::-;;;;;;;;;;-1:-1:-1;39210:241:0;;;;;:::i;:::-;;:::i;38466:83::-;;;;;;;;;;;;;:::i;17639:87::-;;;;;;;;;;-1:-1:-1;17712:6:0;;-1:-1:-1;;;;;17712:6:0;17639:87;;6493:104;;;;;;;;;;;;;:::i;30666:39::-;;;;;;;;;;-1:-1:-1;30666:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37913:297;;;;;;;;;;-1:-1:-1;37913:297:0;;;;;:::i;:::-;;:::i;10914:475::-;;;;;;;;;;-1:-1:-1;10914:475:0;;;;;:::i;:::-;;:::i;7921:200::-;;;;;;;;;;-1:-1:-1;7921:200:0;;;;;:::i;:::-;;:::i;37724:181::-;;;;;;;;;;-1:-1:-1;37724:181:0;;;;;:::i;:::-;;:::i;30573:33::-;;;;;;;;;;-1:-1:-1;30573:33:0;;;;;;;;;;;30458:35;;;;;;;;;;;;;;;;39055:110;;;;;;;;;;-1:-1:-1;39055:110:0;;;;;:::i;:::-;;:::i;38812:142::-;;;;;;;;;;;;;:::i;8184:176::-;;;;;;;;;;-1:-1:-1;8184:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;8325:18:0;;;8298:7;8325:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8184:176;31607:990;;;:::i;18545:238::-;;;;;;;;;;-1:-1:-1;18545:238:0;;;;;:::i;:::-;;:::i;30500:24::-;;;;;;;;;;;;;;;;6274:100;6328:13;6361:5;6354:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6274:100;:::o;8507:194::-;8615:4;8632:39;4173:10;8655:7;8664:6;8632:8;:39::i;:::-;-1:-1:-1;8689:4:0;8507:194;;;;;:::o;9183:529::-;9323:4;9340:36;9350:6;9358:9;9369:6;9340:9;:36::i;:::-;-1:-1:-1;;;;;9416:19:0;;9389:24;9416:19;;;:11;:19;;;;;;;;4173:10;9416:33;;;;;;;;9482:26;;;;9460:116;;;;-1:-1:-1;;;9460:116:0;;4607:2:1;9460:116:0;;;4589:21:1;4646:2;4626:18;;;4619:30;4685:34;4665:18;;;4658:62;-1:-1:-1;;;4736:18:1;;;4729:38;4784:19;;9460:116:0;;;;;;;;;9612:57;9621:6;4173:10;9662:6;9643:16;:25;9612:8;:57::i;:::-;9700:4;9693:11;;;9183:529;;;;;;:::o;10121:290::-;4173:10;10234:4;10323:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10323:34:0;;;;;;;;;;10234:4;;10251:130;;10301:7;;10323:47;;10360:10;;10323:47;:::i;:::-;10251:8;:130::i;37115:93::-;17525:13;:11;:13::i;:::-;37175:25:::1;37181:10;37193:6;37175:5;:25::i;:::-;37115:93:::0;:::o;37288:179::-;17525:13;:11;:13::i;:::-;37359:19:::1;37370:7;37359:10;:19::i;:::-;37358:20;37350:71;;;::::0;-1:-1:-1;;;37350:71:0;;5278:2:1;37350:71:0::1;::::0;::::1;5260:21:1::0;5317:2;5297:18;;;5290:30;5356:34;5336:18;;;5329:62;-1:-1:-1;;;5407:18:1;;;5400:36;5453:19;;37350:71:0::1;5076:402:1::0;37350:71:0::1;-1:-1:-1::0;;;;;37432:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;37432:27:0::1;37455:4;37432:27;::::0;;37288:179::o;38610:140::-;17525:13;:11;:13::i;:::-;38668:9:::1;::::0;::::1;;38667:10;38659:56;;;::::0;-1:-1:-1;;;38659:56:0;;5685:2:1;38659:56:0::1;::::0;::::1;5667:21:1::0;5724:2;5704:18;;;5697:30;5763:34;5743:18;;;5736:62;-1:-1:-1;;;5814:18:1;;;5807:31;5855:19;;38659:56:0::1;5483:397:1::0;38659:56:0::1;38726:9;:16:::0;;-1:-1:-1;;38726:16:0::1;38738:4;38726:16;::::0;;38610:140::o;38338:120::-;38389:4;17525:13;:11;:13::i;:::-;-1:-1:-1;38406:14:0::1;:22:::0;;-1:-1:-1;;38406:22:0::1;::::0;;;38338:120;:::o;18287:103::-;17525:13;:11;:13::i;:::-;18352:30:::1;18379:1;18352:18;:30::i;:::-;18287:103::o:0;37475:169::-;17525:13;:11;:13::i;:::-;-1:-1:-1;;;;;37590:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;37590:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37475:169::o;39210:241::-;39347:14;39416:25;:21;;;39440:1;39416:25;:::i;:::-;39409:33;;:2;:33;:::i;:::-;39383:22;;;;:7;:22;:::i;:::-;:60;;;;:::i;:::-;39374:69;39210:241;-1:-1:-1;;;;39210:241:0:o;38466:83::-;17525:13;:11;:13::i;:::-;38521::::1;:20:::0;;-1:-1:-1;;38521:20:0::1;;;::::0;;38466:83::o;6493:104::-;6549:13;6582:7;6575:14;;;;;:::i;37913:297::-;17525:13;:11;:13::i;:::-;38067::::1;::::0;-1:-1:-1;;;;;38067:13:0;;::::1;38051:30:::0;;::::1;::::0;38029:119:::1;;;::::0;-1:-1:-1;;;38029:119:0;;7856:2:1;38029:119:0::1;::::0;::::1;7838:21:1::0;7895:2;7875:18;;;7868:30;7934:34;7914:18;;;7907:62;-1:-1:-1;;;7985:18:1;;;7978:37;8032:19;;38029:119:0::1;7654:403:1::0;38029:119:0::1;38161:41;38190:4;38196:5;38161:28;:41::i;:::-;37913:297:::0;;:::o;10914:475::-;4173:10;11032:4;11076:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11076:34:0;;;;;;;;;;11143:35;;;;11121:122;;;;-1:-1:-1;;;11121:122:0;;8264:2:1;11121:122:0;;;8246:21:1;8303:2;8283:18;;;8276:30;8342:34;8322:18;;;8315:62;-1:-1:-1;;;8393:18:1;;;8386:35;8438:19;;11121:122:0;8062:401:1;11121:122:0;11279:67;4173:10;11302:7;11330:15;11311:16;:34;11279:8;:67::i;:::-;-1:-1:-1;11377:4:0;;10914:475;-1:-1:-1;;;10914:475:0:o;7921:200::-;8032:4;8049:42;4173:10;8073:9;8084:6;8049:9;:42::i;37724:181::-;17525:13;:11;:13::i;:::-;37800:19:::1;37811:7;37800:10;:19::i;:::-;37792:66;;;::::0;-1:-1:-1;;;37792:66:0;;8670:2:1;37792:66:0::1;::::0;::::1;8652:21:1::0;8709:2;8689:18;;;8682:30;8748:34;8728:18;;;8721:62;-1:-1:-1;;;8799:18:1;;;8792:32;8841:19;;37792:66:0::1;8468:398:1::0;37792:66:0::1;-1:-1:-1::0;;;;;37869:20:0::1;37892:5;37869:20:::0;;;:11:::1;:20;::::0;;;;:28;;-1:-1:-1;;37869:28:0::1;::::0;;37724:181::o;39055:110::-;-1:-1:-1;;;;;39137:20:0;39113:4;39137:20;;;:11;:20;;;;;;;;;39055:110::o;38812:142::-;17525:13;:11;:13::i;:::-;38870:9:::1;::::0;::::1;;38862:56;;;::::0;-1:-1:-1;;;38862:56:0;;9073:2:1;38862:56:0::1;::::0;::::1;9055:21:1::0;9112:2;9092:18;;;9085:30;9151:34;9131:18;;;9124:62;-1:-1:-1;;;9202:18:1;;;9195:32;9244:19;;38862:56:0::1;8871:398:1::0;38862:56:0::1;38929:9;:17:::0;;-1:-1:-1;;38929:17:0::1;::::0;;38812:142::o;31607:990::-;17525:13;:11;:13::i;:::-;31672:17:::1;:106:::0;;;-1:-1:-1;;;;;;31672:106:0;;::::1;;::::0;;;;31826:27:::1;::::0;;-1:-1:-1;;;31826:27:0;;;;31672:106:::1;31826:17:::0;;::::1;-1:-1:-1::0;;;;;31826:17:0::1;::::0;:25:::1;::::0;:27:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;:17;:27:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31789:16;:65:::0;;-1:-1:-1;;;;;;31789:65:0::1;-1:-1:-1::0;;;;;31789:65:0;;::::1;::::0;;::::1;::::0;;;31953:17:::1;::::0;:24:::1;::::0;;-1:-1:-1;;;31953:24:0;;;;31789:65;;31910:27:::1;::::0;31946:4:::1;::::0;31789:65:::1;31953:17:::0;::::1;::::0;;::::1;::::0;:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:17;:24:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31910:68;::::0;-1:-1:-1;;;;;;31910:68:0::1;::::0;;;;;;-1:-1:-1;;;;;9760:15:1;;;31910:68:0::1;::::0;::::1;9742:34:1::0;9812:15;;9792:18;;;9785:43;9677:18;;31910:68:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31865:13;:124:::0;;-1:-1:-1;;;;;;31865:124:0::1;-1:-1:-1::0;;;;;31865:124:0;;;::::1;::::0;;::::1;::::0;;32002:58:::1;::::0;-1:-1:-1;32002:28:0::1;:58::i;:::-;32103:17;::::0;32071:64:::1;::::0;32088:4:::1;::::0;32103:17:::1;::::0;::::1;-1:-1:-1::0;;;;;32103:17:0::1;-1:-1:-1::0;;32071:8:0::1;:64::i;:::-;32146:17;::::0;32220:4:::1;7655:7:::0;7682:18;;;;;;;;;;;32146:17:::1;::::0;;::::1;-1:-1:-1::0;;;;;32146:17:0::1;::::0;:33:::1;::::0;32187:9:::1;::::0;32279:1:::1;32295::::0;32311:7:::1;17712:6:::0;;-1:-1:-1;;;;;17712:6:0;;17639:87;32311:7:::1;32146:213;::::0;::::1;::::0;;;-1:-1:-1;;;;;;32146:213:0;;;-1:-1:-1;;;;;10198:15:1;;;32146:213:0::1;::::0;::::1;10180:34:1::0;10230:18;;;10223:34;;;;10273:18;;;10266:34;;;;10316:18;;;10309:34;10380:15;;;10359:19;;;10352:44;32333:15:0::1;10412:19:1::0;;;10405:35;10114:19;;32146:213:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;32382:1:0::1;32370:9;:13:::0;;;32412:1:::1;32394:15;:19:::0;;;32424:15:::1;:19:::0;;;32468:3:::1;32454:11;:17:::0;;;32484:10:::1;:14:::0;;;32509:16:::1;:20:::0;;;;32540:16:::1;:20:::0;;;;32571:12:::1;:18:::0;-1:-1:-1;31607:990:0:o;18545:238::-;17525:13;:11;:13::i;:::-;-1:-1:-1;;;;;18648:22:0;::::1;18626:110;;;::::0;-1:-1:-1;;;18626:110:0;;10964:2:1;18626:110:0::1;::::0;::::1;10946:21:1::0;11003:2;10983:18;;;10976:30;11042:34;11022:18;;;11015:62;-1:-1:-1;;;11093:18:1;;;11086:36;11139:19;;18626:110:0::1;10762:402:1::0;18626:110:0::1;18747:28;18766:8;18747:18;:28::i;14697:380::-:0;-1:-1:-1;;;;;14833:19:0;;14825:68;;;;-1:-1:-1;;;14825:68:0;;11371:2:1;14825:68:0;;;11353:21:1;11410:2;11390:18;;;11383:30;11449:34;11429:18;;;11422:62;-1:-1:-1;;;11500:18:1;;;11493:34;11544:19;;14825:68:0;11169:400:1;14825:68:0;-1:-1:-1;;;;;14912:21:0;;14904:68;;;;-1:-1:-1;;;14904:68:0;;11776:2:1;14904:68:0;;;11758:21:1;11815:2;11795:18;;;11788:30;11854:34;11834:18;;;11827:62;-1:-1:-1;;;11905:18:1;;;11898:32;11947:19;;14904:68:0;11574:398:1;14904:68:0;-1:-1:-1;;;;;14985:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15037:32;;1613:25:1;;;15037:32:0;;1586:18:1;15037:32:0;;;;;;;14697:380;;;:::o;36814:293::-;36959:9;;;;36955:90;;;36994:39;37007:6;37015:9;37026:6;36994:12;:39::i;:::-;36985:48;;36955:90;37057:42;37073:6;37081:9;37092:6;37057:15;:42::i;:::-;36814:293;;;:::o;17804:132::-;17712:6;;-1:-1:-1;;;;;17712:6:0;4173:10;17868:23;17860:68;;;;-1:-1:-1;;;17860:68:0;;12179:2:1;17860:68:0;;;12161:21:1;;;12198:18;;;12191:30;12257:34;12237:18;;;12230:62;12309:18;;17860:68:0;11977:356:1;13668:591:0;-1:-1:-1;;;;;13752:21:0;;13744:67;;;;-1:-1:-1;;;13744:67:0;;12540:2:1;13744:67:0;;;12522:21:1;12579:2;12559:18;;;12552:30;12618:34;12598:18;;;12591:62;-1:-1:-1;;;12669:18:1;;;12662:31;12710:19;;13744:67:0;12338:397:1;13744:67:0;-1:-1:-1;;;;;13911:18:0;;13886:22;13911:18;;;;;;;;;;;13948:24;;;;13940:71;;;;-1:-1:-1;;;13940:71:0;;12942:2:1;13940:71:0;;;12924:21:1;12981:2;12961:18;;;12954:30;13020:34;13000:18;;;12993:62;-1:-1:-1;;;13071:18:1;;;13064:32;13113:19;;13940:71:0;12740:398:1;13940:71:0;-1:-1:-1;;;;;14047:18:0;;:9;:18;;;;;;;;;;14068:23;;;14047:44;;14113:12;:22;;14085:6;;14047:9;14113:22;;14085:6;;14113:22;:::i;:::-;;;;-1:-1:-1;;14153:37:0;;1613:25:1;;;14179:1:0;;-1:-1:-1;;;;;14153:37:0;;;;;1601:2:1;1586:18;14153:37:0;;;;;;;36814:293;;;:::o;18943:191::-;19036:6;;;-1:-1:-1;;;;;19053:17:0;;;-1:-1:-1;;;;;;19053:17:0;;;;;;;19086:40;;19036:6;;;19053:17;19036:6;;19086:40;;19017:16;;19086:40;19006:128;18943:191;:::o;38218:112::-;-1:-1:-1;;;;;38301:13:0;;;;;;;;:7;:13;;;;;:21;;-1:-1:-1;;38301:21:0;;;;;;;;;;38218:112::o;32940:3866::-;33055:7;33080:16;33091:4;33080:10;:16::i;:::-;33079:17;:36;;;;;33101:14;33112:2;33101:10;:14::i;:::-;33100:15;33079:36;33075:3698;;;33140:14;;;;33136:1684;;;17712:6;;-1:-1:-1;;;;;33201:15:0;;;17712:6;;33201:15;;;;:53;;-1:-1:-1;17712:6:0;;-1:-1:-1;;;;;33241:13:0;;;17712:6;;33241:13;;33201:53;:94;;;;-1:-1:-1;;;;;;33279:16:0;;;;33201:94;:140;;;;-1:-1:-1;;;;;;33320:21:0;;33334:6;33320:21;;33201:140;33175:1630;;;33389:13;;;;;;;33384:225;;33469:16;33480:4;33469:10;:16::i;:::-;:34;;;;33489:14;33500:2;33489:10;:14::i;:::-;33431:154;;;;-1:-1:-1;;;33431:154:0;;13478:2:1;33431:154:0;;;13460:21:1;13517:2;13497:18;;;13490:30;-1:-1:-1;;;13536:18:1;;;13529:52;13598:18;;33431:154:0;13276:346:1;33431:154:0;-1:-1:-1;;;;;33669:13:0;;;;;;:7;:13;;;;;;;;:53;;;;-1:-1:-1;;;;;;33687:35:0;;;;;;:31;:35;;;;;;;;33686:36;33669:53;33665:1121;;;33799:20;;33789:6;:30;;33751:181;;;;-1:-1:-1;;;33751:181:0;;13829:2:1;33751:181:0;;;13811:21:1;13868:2;13848:18;;;13841:30;13907:34;13887:18;;;13880:62;-1:-1:-1;;;13958:18:1;;;13951:51;14019:19;;33751:181:0;13627:417:1;33751:181:0;34023:9;;-1:-1:-1;;;;;7682:18:0;;7655:7;7682:18;;;;;;;;;;;33997:22;;:6;:22;:::i;:::-;:35;;33959:152;;;;-1:-1:-1;;;33959:152:0;;14251:2:1;33959:152:0;;;14233:21:1;14290:2;14270:18;;;14263:30;-1:-1:-1;;;14309:18:1;;;14302:49;14368:18;;33959:152:0;14049:343:1;33959:152:0;33665:1121;;;-1:-1:-1;;;;;34225:11:0;;;;;;:7;:11;;;;;;;;:53;;;;-1:-1:-1;;;;;;34241:37:0;;;;;;:31;:37;;;;;;;;34240:38;34225:53;34195:591;;;34377:20;;34367:6;:30;;34329:182;;;;-1:-1:-1;;;34329:182:0;;14599:2:1;34329:182:0;;;14581:21:1;14638:2;14618:18;;;14611:30;14677:34;14657:18;;;14650:62;-1:-1:-1;;;14728:18:1;;;14721:52;14790:19;;34329:182:0;14397:418:1;34195:591:0;-1:-1:-1;;;;;34546:35:0;;;;;;:31;:35;;;;;;;;34541:245;;34674:9;;-1:-1:-1;;;;;7682:18:0;;7655:7;7682:18;;;;;;;;;;;34648:22;;:6;:22;:::i;:::-;:35;;34610:152;;;;-1:-1:-1;;;34610:152:0;;14251:2:1;34610:152:0;;;14233:21:1;14290:2;14270:18;;;14263:30;-1:-1:-1;;;14309:18:1;;;14302:49;14368:18;;34610:152:0;14049:343:1;34610:152:0;34876:16;;;34890:1;34876:16;;;;;;;;34848:25;;34876:16;;;;;;;;;;-1:-1:-1;34876:16:0;34848:44;;34929:4;34907:8;34916:1;34907:11;;;;;;;;:::i;:::-;;;;;;:27;-1:-1:-1;;;;;34907:27:0;;;-1:-1:-1;;;;;34907:27:0;;;;;34963:17;;;;;;;;;-1:-1:-1;;;;;34963:17:0;-1:-1:-1;;;;;34963:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34949:8;34958:1;34949:11;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34949:38:0;;;:11;;;;;;;;;;:38;;;;35042:13;;;35012:11;35042:13;;;:7;:13;;;;;;;;;35038:1626;;;35076:16;35104:11;;35095:6;:20;;;;:::i;:::-;35076:39;;35152:15;;35141:8;:26;;;;:::i;:::-;35134:33;;;;:::i;:::-;;-1:-1:-1;35192:7:0;;35188:91;;35224:35;35234:4;35248;35255:3;35224:9;:35::i;:::-;35329:15;;35318:26;;:8;:26;:::i;:::-;35299:15;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;35038:1626:0;;-1:-1:-1;;35038:1626:0;;-1:-1:-1;;;;;35370:11:0;;;;;;:7;:11;;;;;;;;35366:1298;;;35402:16;35430:12;;35421:6;:21;;;;:::i;:::-;35402:40;;35479:16;;35468:8;:27;;;;:::i;:::-;35461:34;;;;:::i;:::-;;-1:-1:-1;35520:7:0;;35516:91;;35552:35;35562:4;35576;35583:3;35552:9;:35::i;:::-;35646:16;;35627:15;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;35700:15:0;;35683:14;35740:11;;;35736:30;;35760:6;35753:13;;;;;;;;35736:30;35806:17;;35860:15;;35806:119;;-1:-1:-1;;;35806:119:0;;35787:16;;35806:17;;;-1:-1:-1;;;;;35806:17:0;;:31;;:119;;35860:15;35898:8;;35806:119;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35806:119:0;;;;;;;;;;;;:::i;:::-;35926:1;35806:122;;;;;;;;:::i;:::-;;;;;;;35787:141;;35964:1;35953:8;:12;35949:700;;;36076:15;;36148:17;;36013:21;;36076:15;36116:59;;36133:4;;36148:17;;;-1:-1:-1;;;;;36148:17:0;36076:15;36116:8;:59::i;:::-;36200:17;;:240;;-1:-1:-1;;;36200:240:0;;:17;;;;-1:-1:-1;;;;;36200:17:0;;:39;;:240;;36266:6;;36299:1;;36327:8;;36370:4;;36402:15;;36200:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36200:240:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36465:17:0;36485:36;36509:12;36485:21;:36;:::i;:::-;36554:10;;36546:39;;36465:56;;-1:-1:-1;;;;;;36554:10:0;;36546:39;;;;;36465:56;;36554:10;36546:39;36554:10;36546:39;36465:56;36554:10;36546:39;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36628:1:0;36610:15;:19;-1:-1:-1;;35949:700:0;35383:1281;;;35366:1298;36680:13;36690:3;36680:13;;:::i;:::-;;;33117:3588;;33075:3698;;;-1:-1:-1;;;;;;;36713:21:0;;;36710:63;;36750:11;:9;:11::i;:::-;;36710:63;-1:-1:-1;36792:6:0;32940:3866;-1:-1:-1;;32940:3866:0:o;11879:770::-;-1:-1:-1;;;;;12019:20:0;;12011:70;;;;-1:-1:-1;;;12011:70:0;;17786:2:1;12011:70:0;;;17768:21:1;17825:2;17805:18;;;17798:30;17864:34;17844:18;;;17837:62;-1:-1:-1;;;17915:18:1;;;17908:35;17960:19;;12011:70:0;17584:401:1;12011:70:0;-1:-1:-1;;;;;12100:23:0;;12092:71;;;;-1:-1:-1;;;12092:71:0;;18192:2:1;12092:71:0;;;18174:21:1;18231:2;18211:18;;;18204:30;18270:34;18250:18;;;18243:62;-1:-1:-1;;;18321:18:1;;;18314:33;18364:19;;12092:71:0;17990:399:1;12092:71:0;-1:-1:-1;;;;;12260:17:0;;12236:21;12260:17;;;;;;;;;;;12310:23;;;;12288:111;;;;-1:-1:-1;;;12288:111:0;;18596:2:1;12288:111:0;;;18578:21:1;18635:2;18615:18;;;18608:30;18674:34;18654:18;;;18647:62;-1:-1:-1;;;18725:18:1;;;18718:36;18771:19;;12288:111:0;18394:402:1;12288:111:0;-1:-1:-1;;;;;12435:17:0;;;:9;:17;;;;;;;;;;;12455:22;;;12435:42;;12499:20;;;;;;;;:30;;12471:6;;12435:9;12499:30;;12471:6;;12499:30;:::i;:::-;;;;;;;;12564:9;-1:-1:-1;;;;;12547:35:0;12556:6;-1:-1:-1;;;;;12547:35:0;;12575:6;12547:35;;;;1613:25:1;;1601:2;1586:18;;1467:177;12547:35:0;;;;;;;;12000:649;11879:770;;;:::o;39459:697::-;39611:13;;39588:38;;-1:-1:-1;;;39588:38:0;;-1:-1:-1;;;;;39611:13:0;;;39588:38;;;2630:51:1;39498:4:0;;;;39588;;:14;;2603:18:1;;39588:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39557:69;;39676:20;39699:94;39727:20;39762:1;39778:4;39699:13;:94::i;:::-;39676:117;-1:-1:-1;39898:16:0;;39894:98;;39951:13;;39931:49;;-1:-1:-1;;;;;39951:13:0;39967:12;39931:11;:49::i;:::-;40089:13;;40113:11;;;-1:-1:-1;;;;;;40113:11:0;;;;-1:-1:-1;;;;;40089:13:0;;;;;;40113:9;;:11;;;;;40067:19;;40113:11;;;;;;;40067:19;40089:13;40113:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40144:4;40137:11;;;;;39459:697;:::o;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;1215:247::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;1382:9;1369:23;1401:31;1426:5;1401:31;:::i;1649:456::-;1726:6;1734;1742;1795:2;1783:9;1774:7;1770:23;1766:32;1763:52;;;1811:1;1808;1801:12;1763:52;1850:9;1837:23;1869:31;1894:5;1869:31;:::i;:::-;1919:5;-1:-1:-1;1976:2:1;1961:18;;1948:32;1989:33;1948:32;1989:33;:::i;:::-;1649:456;;2041:7;;-1:-1:-1;;;2095:2:1;2080:18;;;;2067:32;;1649:456::o;2299:180::-;2358:6;2411:2;2399:9;2390:7;2386:23;2382:32;2379:52;;;2427:1;2424;2417:12;2379:52;-1:-1:-1;2450:23:1;;2299:180;-1:-1:-1;2299:180:1:o;2692:416::-;2757:6;2765;2818:2;2806:9;2797:7;2793:23;2789:32;2786:52;;;2834:1;2831;2824:12;2786:52;2873:9;2860:23;2892:31;2917:5;2892:31;:::i;:::-;2942:5;-1:-1:-1;2999:2:1;2984:18;;2971:32;3041:15;;3034:23;3022:36;;3012:64;;3072:1;3069;3062:12;3012:64;3095:7;3085:17;;;2692:416;;;;;:::o;3113:509::-;3187:6;3195;3203;3256:2;3244:9;3235:7;3231:23;3227:32;3224:52;;;3272:1;3269;3262:12;3224:52;3308:9;3295:23;3285:33;;3368:2;3357:9;3353:18;3340:32;3412:4;3405:5;3401:16;3394:5;3391:27;3381:55;;3432:1;3429;3422:12;3381:55;3455:5;-1:-1:-1;3512:2:1;3497:18;;3484:32;3560:10;3547:24;;3535:37;;3525:65;;3586:1;3583;3576:12;3525:65;3609:7;3599:17;;;3113:509;;;;;:::o;3627:388::-;3695:6;3703;3756:2;3744:9;3735:7;3731:23;3727:32;3724:52;;;3772:1;3769;3762:12;3724:52;3811:9;3798:23;3830:31;3855:5;3830:31;:::i;:::-;3880:5;-1:-1:-1;3937:2:1;3922:18;;3909:32;3950:33;3909:32;3950:33;:::i;4020:380::-;4099:1;4095:12;;;;4142;;;4163:61;;4217:4;4209:6;4205:17;4195:27;;4163:61;4270:2;4262:6;4259:14;4239:18;4236:38;4233:161;;4316:10;4311:3;4307:20;4304:1;4297:31;4351:4;4348:1;4341:15;4379:4;4376:1;4369:15;4233:161;;4020:380;;;:::o;4814:127::-;4875:10;4870:3;4866:20;4863:1;4856:31;4906:4;4903:1;4896:15;4930:4;4927:1;4920:15;4946:125;5011:9;;;5032:10;;;5029:36;;;5045:18;;:::i;5885:422::-;5974:1;6017:5;5974:1;6031:270;6052:7;6042:8;6039:21;6031:270;;;6111:4;6107:1;6103:6;6099:17;6093:4;6090:27;6087:53;;;6120:18;;:::i;:::-;6170:7;6160:8;6156:22;6153:55;;;6190:16;;;;6153:55;6269:22;;;;6229:15;;;;6031:270;;;6035:3;5885:422;;;;;:::o;6312:806::-;6361:5;6391:8;6381:80;;-1:-1:-1;6432:1:1;6446:5;;6381:80;6480:4;6470:76;;-1:-1:-1;6517:1:1;6531:5;;6470:76;6562:4;6580:1;6575:59;;;;6648:1;6643:130;;;;6555:218;;6575:59;6605:1;6596:10;;6619:5;;;6643:130;6680:3;6670:8;6667:17;6664:43;;;6687:18;;:::i;:::-;-1:-1:-1;;6743:1:1;6729:16;;6758:5;;6555:218;;6857:2;6847:8;6844:16;6838:3;6832:4;6829:13;6825:36;6819:2;6809:8;6806:16;6801:2;6795:4;6792:12;6788:35;6785:77;6782:159;;;-1:-1:-1;6894:19:1;;;6926:5;;6782:159;6973:34;6998:8;6992:4;6973:34;:::i;:::-;7043:6;7039:1;7035:6;7031:19;7022:7;7019:32;7016:58;;;7054:18;;:::i;:::-;7092:20;;6312:806;-1:-1:-1;;;6312:806:1:o;7123:131::-;7183:5;7212:36;7239:8;7233:4;7212:36;:::i;7259:168::-;7332:9;;;7363;;7380:15;;;7374:22;;7360:37;7350:71;;7401:18;;:::i;7432:217::-;7472:1;7498;7488:132;;7542:10;7537:3;7533:20;7530:1;7523:31;7577:4;7574:1;7567:15;7605:4;7602:1;7595:15;7488:132;-1:-1:-1;7634:9:1;;7432:217::o;9274:251::-;9344:6;9397:2;9385:9;9376:7;9372:23;9368:32;9365:52;;;9413:1;9410;9403:12;9365:52;9445:9;9439:16;9464:31;9489:5;9464:31;:::i;10451:306::-;10539:6;10547;10555;10608:2;10596:9;10587:7;10583:23;10579:32;10576:52;;;10624:1;10621;10614:12;10576:52;10653:9;10647:16;10637:26;;10703:2;10692:9;10688:18;10682:25;10672:35;;10747:2;10736:9;10732:18;10726:25;10716:35;;10451:306;;;;;:::o;13143:128::-;13210:9;;;13231:11;;;13228:37;;;13245:18;;:::i;14820:127::-;14881:10;14876:3;14872:20;14869:1;14862:31;14912:4;14909:1;14902:15;14936:4;14933:1;14926:15;14952:127;15013:10;15008:3;15004:20;15001:1;14994:31;15044:4;15041:1;15034:15;15068:4;15065:1;15058:15;15084:461;15137:3;15175:5;15169:12;15202:6;15197:3;15190:19;15228:4;15257:2;15252:3;15248:12;15241:19;;15294:2;15287:5;15283:14;15315:1;15325:195;15339:6;15336:1;15333:13;15325:195;;;15404:13;;-1:-1:-1;;;;;15400:39:1;15388:52;;15460:12;;;;15495:15;;;;15436:1;15354:9;15325:195;;;-1:-1:-1;15536:3:1;;15084:461;-1:-1:-1;;;;;15084:461:1:o;15550:332::-;15757:6;15746:9;15739:25;15800:2;15795;15784:9;15780:18;15773:30;15720:4;15820:56;15872:2;15861:9;15857:18;15849:6;15820:56;:::i;15887:1105::-;15982:6;16013:2;16056;16044:9;16035:7;16031:23;16027:32;16024:52;;;16072:1;16069;16062:12;16024:52;16105:9;16099:16;16134:18;16175:2;16167:6;16164:14;16161:34;;;16191:1;16188;16181:12;16161:34;16229:6;16218:9;16214:22;16204:32;;16274:7;16267:4;16263:2;16259:13;16255:27;16245:55;;16296:1;16293;16286:12;16245:55;16325:2;16319:9;16347:2;16343;16340:10;16337:36;;;16353:18;;:::i;:::-;16399:2;16396:1;16392:10;16431:2;16425:9;16494:2;16490:7;16485:2;16481;16477:11;16473:25;16465:6;16461:38;16549:6;16537:10;16534:22;16529:2;16517:10;16514:18;16511:46;16508:72;;;16560:18;;:::i;:::-;16596:2;16589:22;16646:18;;;16680:15;;;;-1:-1:-1;16722:11:1;;;16718:20;;;16750:19;;;16747:39;;;16782:1;16779;16772:12;16747:39;16806:11;;;;16826:135;16842:6;16837:3;16834:15;16826:135;;;16908:10;;16896:23;;16859:12;;;;16939;;;;16826:135;;;16980:6;15887:1105;-1:-1:-1;;;;;;;;15887:1105:1:o;16997:582::-;17296:6;17285:9;17278:25;17339:6;17334:2;17323:9;17319:18;17312:34;17382:3;17377:2;17366:9;17362:18;17355:31;17259:4;17403:57;17455:3;17444:9;17440:19;17432:6;17403:57;:::i;:::-;-1:-1:-1;;;;;17496:32:1;;;;17491:2;17476:18;;17469:60;-1:-1:-1;17560:3:1;17545:19;17538:35;17395:65;16997:582;-1:-1:-1;;;16997:582:1:o;18801:184::-;18871:6;18924:2;18912:9;18903:7;18899:23;18895:32;18892:52;;;18940:1;18937;18930:12;18892:52;-1:-1:-1;18963:16:1;;18801:184;-1:-1:-1;18801:184:1:o

Swarm Source

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